diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6c43fbae12..3fb98af839 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -5,4 +5,5 @@ - [ ] I have read the [contribution guidelines](https://github.com/Azure/azureml-examples/blob/main/CONTRIBUTING.md) +- [ ] I have coordinated with the docs team (mldocs@microsoft.com) if this PR deletes files or changes any file names or file extensions. - [ ] Pull request includes test coverage for the included changes. diff --git a/.github/test/sdk/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.json b/.github/test/sdk/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.json index c3f4953190..2e32415c02 100644 --- a/.github/test/sdk/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.json +++ b/.github/test/sdk/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.json @@ -3,7 +3,7 @@ { "name": "check notebook output", "params": { - "check": "warning stderr" + "check": "warning" } }, { diff --git a/.github/workflows/automated-cleanup-resources.yml b/.github/workflows/automated-cleanup-resources.yml index 4bea59e382..76cbd9a5cb 100644 --- a/.github/workflows/automated-cleanup-resources.yml +++ b/.github/workflows/automated-cleanup-resources.yml @@ -2,7 +2,7 @@ name: automated-cleanup-resources on: workflow_dispatch: schedule: - - cron: "45 */12 * * *" + - cron: "0 8 * * *" pull_request: branches: - main diff --git a/.github/workflows/cli-endpoints-batch-deploy-models-custom-outputs-parquet-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-models-custom-outputs-parquet-endpoint.yml index f5020fc873..35539a87f1 100644 --- a/.github/workflows/cli-endpoints-batch-deploy-models-custom-outputs-parquet-endpoint.yml +++ b/.github/workflows/cli-endpoints-batch-deploy-models-custom-outputs-parquet-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n customoutputsparquetendpoint -y + az ml batch-endpoint delete -n tomoutputsparquetendpoint8741 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,18 +54,18 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/custom-outputs-parquet/endpoint.yml - az ml batch-endpoint create -n customoutputsparquetendpoint -f endpoints/batch/deploy-models/custom-outputs-parquet/endpoint.yml + az ml batch-endpoint create -n tomoutputsparquetendpoint8741 -f endpoints/batch/deploy-models/custom-outputs-parquet/endpoint.yml working-directory: cli - name: create deployment run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/custom-outputs-parquet/deployment.yml - az ml batch-deployment create -e customoutputsparquetendpoint -f endpoints/batch/deploy-models/custom-outputs-parquet/deployment.yml + az ml batch-deployment create -e tomoutputsparquetendpoint8741 -f endpoints/batch/deploy-models/custom-outputs-parquet/deployment.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n customoutputsparquetendpoint -y + az ml batch-endpoint delete -n tomoutputsparquetendpoint8741 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-models-heart-classifier-mlflow-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-models-heart-classifier-mlflow-endpoint.yml index e7e438ff28..574632363f 100644 --- a/.github/workflows/cli-endpoints-batch-deploy-models-heart-classifier-mlflow-endpoint.yml +++ b/.github/workflows/cli-endpoints-batch-deploy-models-heart-classifier-mlflow-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n heartclassifiermlflowendpoint -y + az ml batch-endpoint delete -n tclassifiermlflowendpoint3191 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/heart-classifier-mlflow/endpoint.yml - az ml batch-endpoint create -n heartclassifiermlflowendpoint -f endpoints/batch/deploy-models/heart-classifier-mlflow/endpoint.yml + az ml batch-endpoint create -n tclassifiermlflowendpoint3191 -f endpoints/batch/deploy-models/heart-classifier-mlflow/endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n heartclassifiermlflowendpoint -y + az ml batch-endpoint delete -n tclassifiermlflowendpoint3191 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-models-huggingface-text-summarization-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-models-huggingface-text-summarization-endpoint.yml index 972168fb22..f8e62d8b4f 100644 --- a/.github/workflows/cli-endpoints-batch-deploy-models-huggingface-text-summarization-endpoint.yml +++ b/.github/workflows/cli-endpoints-batch-deploy-models-huggingface-text-summarization-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n facetextsummarizationendpoint -y + az ml batch-endpoint delete -n textsummarizationendpoint2742 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,18 +54,18 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/huggingface-text-summarization/endpoint.yml - az ml batch-endpoint create -n facetextsummarizationendpoint -f endpoints/batch/deploy-models/huggingface-text-summarization/endpoint.yml + az ml batch-endpoint create -n textsummarizationendpoint2742 -f endpoints/batch/deploy-models/huggingface-text-summarization/endpoint.yml working-directory: cli - name: create deployment run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/huggingface-text-summarization/deployment.yml - az ml batch-deployment create -e facetextsummarizationendpoint -f endpoints/batch/deploy-models/huggingface-text-summarization/deployment.yml + az ml batch-deployment create -e textsummarizationendpoint2742 -f endpoints/batch/deploy-models/huggingface-text-summarization/deployment.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n facetextsummarizationendpoint -y + az ml batch-endpoint delete -n textsummarizationendpoint2742 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-models-imagenet-classifier-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-models-imagenet-classifier-endpoint.yml index b95338bb40..e4f3fe09b6 100644 --- a/.github/workflows/cli-endpoints-batch-deploy-models-imagenet-classifier-endpoint.yml +++ b/.github/workflows/cli-endpoints-batch-deploy-models-imagenet-classifier-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n elsimagenetclassifierendpoint -y + az ml batch-endpoint delete -n imagenetclassifierendpoint3948 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/imagenet-classifier/endpoint.yml - az ml batch-endpoint create -n elsimagenetclassifierendpoint -f endpoints/batch/deploy-models/imagenet-classifier/endpoint.yml + az ml batch-endpoint create -n imagenetclassifierendpoint3948 -f endpoints/batch/deploy-models/imagenet-classifier/endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n elsimagenetclassifierendpoint -y + az ml batch-endpoint delete -n imagenetclassifierendpoint3948 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-models-mnist-classifier-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-models-mnist-classifier-endpoint.yml index b76b98799b..2249264c40 100644 --- a/.github/workflows/cli-endpoints-batch-deploy-models-mnist-classifier-endpoint.yml +++ b/.github/workflows/cli-endpoints-batch-deploy-models-mnist-classifier-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n modelsmnistclassifierendpoint -y + az ml batch-endpoint delete -n lsmnistclassifierendpoint9980 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/batch/deploy-models/mnist-classifier/endpoint.yml - az ml batch-endpoint create -n modelsmnistclassifierendpoint -f endpoints/batch/deploy-models/mnist-classifier/endpoint.yml + az ml batch-endpoint create -n lsmnistclassifierendpoint9980 -f endpoints/batch/deploy-models/mnist-classifier/endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml batch-endpoint delete -n modelsmnistclassifierendpoint -y + az ml batch-endpoint delete -n lsmnistclassifierendpoint9980 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-pipelines-batch-scoring-with-preprocessing-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-pipelines-batch-scoring-with-preprocessing-endpoint.yml new file mode 100644 index 0000000000..d8e2b77605 --- /dev/null +++ b/.github/workflows/cli-endpoints-batch-deploy-pipelines-batch-scoring-with-preprocessing-endpoint.yml @@ -0,0 +1,71 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-endpoints-batch-deploy-pipelines-batch-scoring-with-preprocessing-endpoint +on: + workflow_dispatch: + schedule: + - cron: "18 11/12 * * *" + pull_request: + branches: + - main + paths: + - cli/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/** + - cli/endpoints/batch/** + - infra/bootstrapping/** + - .github/workflows/cli-endpoints-batch-deploy-pipelines-batch-scoring-with-preprocessing-endpoint.yml + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: delete endpoint if existing + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n withpreprocessingendpoint6601 -y + working-directory: cli + continue-on-error: true + - name: create endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + cat endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/endpoint.yml + az ml batch-endpoint create -n withpreprocessingendpoint6601 -f endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/endpoint.yml + working-directory: cli + - name: create deployment + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + cat endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml + az ml batch-deployment create -e withpreprocessingendpoint6601 -f endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml + working-directory: cli + - name: cleanup endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n withpreprocessingendpoint6601 -y + working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-pipelines-hello-batch-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-pipelines-hello-batch-endpoint.yml new file mode 100644 index 0000000000..531b004ff6 --- /dev/null +++ b/.github/workflows/cli-endpoints-batch-deploy-pipelines-hello-batch-endpoint.yml @@ -0,0 +1,71 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-endpoints-batch-deploy-pipelines-hello-batch-endpoint +on: + workflow_dispatch: + schedule: + - cron: "18 11/12 * * *" + pull_request: + branches: + - main + paths: + - cli/endpoints/batch/deploy-pipelines/hello-batch/** + - cli/endpoints/batch/** + - infra/bootstrapping/** + - .github/workflows/cli-endpoints-batch-deploy-pipelines-hello-batch-endpoint.yml + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: delete endpoint if existing + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n pelineshellobatchendpoint9006 -y + working-directory: cli + continue-on-error: true + - name: create endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + cat endpoints/batch/deploy-pipelines/hello-batch/endpoint.yml + az ml batch-endpoint create -n pelineshellobatchendpoint9006 -f endpoints/batch/deploy-pipelines/hello-batch/endpoint.yml + working-directory: cli + - name: create deployment + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + cat endpoints/batch/deploy-pipelines/hello-batch/deployment.yml + az ml batch-deployment create -e pelineshellobatchendpoint9006 -f endpoints/batch/deploy-pipelines/hello-batch/deployment.yml + working-directory: cli + - name: cleanup endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n pelineshellobatchendpoint9006 -y + working-directory: cli diff --git a/.github/workflows/cli-endpoints-batch-deploy-pipelines-training-with-components-endpoint.yml b/.github/workflows/cli-endpoints-batch-deploy-pipelines-training-with-components-endpoint.yml new file mode 100644 index 0000000000..4380b774b2 --- /dev/null +++ b/.github/workflows/cli-endpoints-batch-deploy-pipelines-training-with-components-endpoint.yml @@ -0,0 +1,64 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-endpoints-batch-deploy-pipelines-training-with-components-endpoint +on: + workflow_dispatch: + schedule: + - cron: "18 11/12 * * *" + pull_request: + branches: + - main + paths: + - cli/endpoints/batch/deploy-pipelines/training-with-components/** + - cli/endpoints/batch/** + - infra/bootstrapping/** + - .github/workflows/cli-endpoints-batch-deploy-pipelines-training-with-components-endpoint.yml + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: delete endpoint if existing + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n ingwithcomponentsendpoint9219 -y + working-directory: cli + continue-on-error: true + - name: create endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + cat endpoints/batch/deploy-pipelines/training-with-components/endpoint.yml + az ml batch-endpoint create -n ingwithcomponentsendpoint9219 -f endpoints/batch/deploy-pipelines/training-with-components/endpoint.yml + working-directory: cli + - name: cleanup endpoint + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + az ml batch-endpoint delete -n ingwithcomponentsendpoint9219 -y + working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-minimal-multimodel-minimal-multimodel-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-minimal-multimodel-minimal-multimodel-endpoint.yml index 2d1801fc28..89ad70c54e 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-minimal-multimodel-minimal-multimodel-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-minimal-multimodel-minimal-multimodel-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n odelminimalmultimodelendpoint -y + az ml online-endpoint delete -n minimalmultimodelendpoint9199 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/minimal/multimodel/minimal-multimodel-endpoint.yml - az ml online-endpoint create -n odelminimalmultimodelendpoint -f endpoints/online/custom-container/minimal/multimodel/minimal-multimodel-endpoint.yml + az ml online-endpoint create -n minimalmultimodelendpoint9199 -f endpoints/online/custom-container/minimal/multimodel/minimal-multimodel-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n odelminimalmultimodelendpoint -y + az ml online-endpoint delete -n minimalmultimodelendpoint9199 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-conda-in-dockerfile-minimal-single-model-conda-in-dockerfile-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-conda-in-dockerfile-minimal-single-model-conda-in-dockerfile-endpoint.yml index dd1c463a13..c2b25884cc 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-conda-in-dockerfile-minimal-single-model-conda-in-dockerfile-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-conda-in-dockerfile-minimal-single-model-conda-in-dockerfile-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n delcondaindockerfileendpoint -y + az ml online-endpoint delete -n condaindockerfileendpoint3179 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/minimal/single-model/conda-in-dockerfile/minimal-single-model-conda-in-dockerfile-endpoint.yml - az ml online-endpoint create -n delcondaindockerfileendpoint -f endpoints/online/custom-container/minimal/single-model/conda-in-dockerfile/minimal-single-model-conda-in-dockerfile-endpoint.yml + az ml online-endpoint create -n condaindockerfileendpoint3179 -f endpoints/online/custom-container/minimal/single-model/conda-in-dockerfile/minimal-single-model-conda-in-dockerfile-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n delcondaindockerfileendpoint -y + az ml online-endpoint delete -n condaindockerfileendpoint3179 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-minimal-single-model-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-minimal-single-model-endpoint.yml index d54bddba7a..bbf2a417e0 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-minimal-single-model-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-minimal-single-model-minimal-single-model-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n elminimalsinglemodelendpoint -y + az ml online-endpoint delete -n inimalsinglemodelendpoint2770 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/minimal/single-model/minimal-single-model-endpoint.yml - az ml online-endpoint create -n elminimalsinglemodelendpoint -f endpoints/online/custom-container/minimal/single-model/minimal-single-model-endpoint.yml + az ml online-endpoint create -n inimalsinglemodelendpoint2770 -f endpoints/online/custom-container/minimal/single-model/minimal-single-model-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n elminimalsinglemodelendpoint -y + az ml online-endpoint delete -n inimalsinglemodelendpoint2770 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-mlflow-multideployment-scikit-mlflow-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-mlflow-multideployment-scikit-mlflow-endpoint.yml index ceb21e7c61..2374135ad4 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-mlflow-multideployment-scikit-mlflow-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-mlflow-multideployment-scikit-mlflow-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n eploymentscikitmlflowendpoint -y + az ml online-endpoint delete -n ymentscikitmlflowendpoint4848 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/mlflow/multideployment-scikit/mlflow-endpoint.yml - az ml online-endpoint create -n eploymentscikitmlflowendpoint -f endpoints/online/custom-container/mlflow/multideployment-scikit/mlflow-endpoint.yml + az ml online-endpoint create -n ymentscikitmlflowendpoint4848 -f endpoints/online/custom-container/mlflow/multideployment-scikit/mlflow-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n eploymentscikitmlflowendpoint -y + az ml online-endpoint delete -n ymentscikitmlflowendpoint4848 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-r-multimodel-plumber-r-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-r-multimodel-plumber-r-endpoint.yml index 68e55bbab3..e25cfd01b3 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-r-multimodel-plumber-r-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-r-multimodel-plumber-r-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n rmultimodelplumberrendpoint -y + az ml online-endpoint delete -n ultimodelplumberrendpoint9536 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/r/multimodel-plumber/r-endpoint.yml - az ml online-endpoint create -n rmultimodelplumberrendpoint -f endpoints/online/custom-container/r/multimodel-plumber/r-endpoint.yml + az ml online-endpoint create -n ultimodelplumberrendpoint9536 -f endpoints/online/custom-container/r/multimodel-plumber/r-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n rmultimodelplumberrendpoint -y + az ml online-endpoint delete -n ultimodelplumberrendpoint9536 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-torchserve-densenet-torchserve-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-torchserve-densenet-torchserve-endpoint.yml index cf4baf8c0d..67941ea48a 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-torchserve-densenet-torchserve-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-torchserve-densenet-torchserve-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n rvedensenettorchserveendpoint -y + az ml online-endpoint delete -n densenettorchserveendpoint7556 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/torchserve/densenet/torchserve-endpoint.yml - az ml online-endpoint create -n rvedensenettorchserveendpoint -f endpoints/online/custom-container/torchserve/densenet/torchserve-endpoint.yml + az ml online-endpoint create -n densenettorchserveendpoint7556 -f endpoints/online/custom-container/torchserve/densenet/torchserve-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n rvedensenettorchserveendpoint -y + az ml online-endpoint delete -n densenettorchserveendpoint7556 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-custom-container-triton-single-model-triton-cc-endpoint.yml b/.github/workflows/cli-endpoints-online-custom-container-triton-single-model-triton-cc-endpoint.yml index e464d7211b..03c70671a5 100644 --- a/.github/workflows/cli-endpoints-online-custom-container-triton-single-model-triton-cc-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-custom-container-triton-single-model-triton-cc-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n singlemodeltritonccendpoint -y + az ml online-endpoint delete -n glemodeltritonccendpoint4238 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/custom-container/triton/single-model/triton-cc-endpoint.yml - az ml online-endpoint create -n singlemodeltritonccendpoint -f endpoints/online/custom-container/triton/single-model/triton-cc-endpoint.yml + az ml online-endpoint create -n glemodeltritonccendpoint4238 -f endpoints/online/custom-container/triton/single-model/triton-cc-endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n singlemodeltritonccendpoint -y + az ml online-endpoint delete -n glemodeltritonccendpoint4238 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-kubernetes-kubernetes-endpoint.yml b/.github/workflows/cli-endpoints-online-kubernetes-kubernetes-endpoint.yml index 1c96e775c6..4ce466a79f 100644 --- a/.github/workflows/cli-endpoints-online-kubernetes-kubernetes-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-kubernetes-kubernetes-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n ekuberneteskubernetesendpoint -y + az ml online-endpoint delete -n berneteskubernetesendpoint4232 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,18 +54,18 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/kubernetes/kubernetes-endpoint.yml - az ml online-endpoint create -n ekuberneteskubernetesendpoint -f endpoints/online/kubernetes/kubernetes-endpoint.yml + az ml online-endpoint create -n berneteskubernetesendpoint4232 -f endpoints/online/kubernetes/kubernetes-endpoint.yml working-directory: cli - name: create deployment run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/kubernetes/kubernetes-blue-deployment.yml - az ml online-deployment create -e ekuberneteskubernetesendpoint -f endpoints/online/kubernetes/kubernetes-blue-deployment.yml + az ml online-deployment create -e berneteskubernetesendpoint4232 -f endpoints/online/kubernetes/kubernetes-blue-deployment.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n ekuberneteskubernetesendpoint -y + az ml online-endpoint delete -n berneteskubernetesendpoint4232 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-managed-sample-endpoint.yml b/.github/workflows/cli-endpoints-online-managed-sample-endpoint.yml index 313158780e..128a17adbb 100644 --- a/.github/workflows/cli-endpoints-online-managed-sample-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-managed-sample-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n sonlinemanagedsampleendpoint -y + az ml online-endpoint delete -n linemanagedsampleendpoint6303 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,25 +54,25 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/managed/sample/endpoint.yml - az ml online-endpoint create -n sonlinemanagedsampleendpoint -f endpoints/online/managed/sample/endpoint.yml + az ml online-endpoint create -n linemanagedsampleendpoint6303 -f endpoints/online/managed/sample/endpoint.yml working-directory: cli - name: create deployment run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/managed/sample/blue-deployment.yml - az ml online-deployment create -e sonlinemanagedsampleendpoint -f endpoints/online/managed/sample/blue-deployment.yml + az ml online-deployment create -e linemanagedsampleendpoint6303 -f endpoints/online/managed/sample/blue-deployment.yml working-directory: cli - name: create deployment run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/managed/sample/green-deployment.yml - az ml online-deployment create -e sonlinemanagedsampleendpoint -f endpoints/online/managed/sample/green-deployment.yml + az ml online-deployment create -e linemanagedsampleendpoint6303 -f endpoints/online/managed/sample/green-deployment.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n sonlinemanagedsampleendpoint -y + az ml online-endpoint delete -n linemanagedsampleendpoint6303 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-managed-vnet-mlflow-endpoint.yml b/.github/workflows/cli-endpoints-online-managed-vnet-mlflow-endpoint.yml index 1ae8c96869..5b3d13f00e 100644 --- a/.github/workflows/cli-endpoints-online-managed-vnet-mlflow-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-managed-vnet-mlflow-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n inemanagedvnetmlflowendpoint -y + az ml online-endpoint delete -n managedvnetmlflowendpoint6555 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/managed/vnet/mlflow/endpoint.yml - az ml online-endpoint create -n inemanagedvnetmlflowendpoint -f endpoints/online/managed/vnet/mlflow/endpoint.yml + az ml online-endpoint create -n managedvnetmlflowendpoint6555 -f endpoints/online/managed/vnet/mlflow/endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n inemanagedvnetmlflowendpoint -y + az ml online-endpoint delete -n managedvnetmlflowendpoint6555 -y working-directory: cli diff --git a/.github/workflows/cli-endpoints-online-managed-vnet-sample-endpoint.yml b/.github/workflows/cli-endpoints-online-managed-vnet-sample-endpoint.yml index 29fca188f9..3f7493c9a0 100644 --- a/.github/workflows/cli-endpoints-online-managed-vnet-sample-endpoint.yml +++ b/.github/workflows/cli-endpoints-online-managed-vnet-sample-endpoint.yml @@ -46,7 +46,7 @@ jobs: run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n inemanagedvnetsampleendpoint -y + az ml online-endpoint delete -n managedvnetsampleendpoint8383 -y working-directory: cli continue-on-error: true - name: create endpoint @@ -54,11 +54,11 @@ jobs: source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; cat endpoints/online/managed/vnet/sample/endpoint.yml - az ml online-endpoint create -n inemanagedvnetsampleendpoint -f endpoints/online/managed/vnet/sample/endpoint.yml + az ml online-endpoint create -n managedvnetsampleendpoint8383 -f endpoints/online/managed/vnet/sample/endpoint.yml working-directory: cli - name: cleanup endpoint run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; - az ml online-endpoint delete -n inemanagedvnetsampleendpoint -y + az ml online-endpoint delete -n managedvnetsampleendpoint8383 -y working-directory: cli diff --git a/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline.yml b/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline.yml new file mode 100644 index 0000000000..8842a5483c --- /dev/null +++ b/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline.yml @@ -0,0 +1,51 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline +on: + workflow_dispatch: + schedule: + - cron: "55 9/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline.yml + - cli/run-pipeline-jobs.sh + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../../../../run-job.sh hts_evaluation_pipeline.yml + working-directory: cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries diff --git a/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline.yml b/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline.yml new file mode 100644 index 0000000000..218343b066 --- /dev/null +++ b/.github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline.yml @@ -0,0 +1,51 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline +on: + workflow_dispatch: + schedule: + - cron: "23 6/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline.yml + - cli/run-pipeline-jobs.sh + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../../../../run-job.sh many_models_evaluation_pipeline.yml + working-directory: cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models diff --git a/.github/workflows/cli-jobs-spark-attached-spark-pipeline-default-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-default-identity.yml new file mode 100644 index 0000000000..3d375dfabc --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-default-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-pipeline-default-identity +on: + workflow_dispatch: + schedule: + - cron: "30 9/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-pipeline-default-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark.yml jobs/spark/attached-spark-pipeline-default-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-pipeline-default-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-attached-spark-pipeline-managed-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-managed-identity.yml new file mode 100644 index 0000000000..3c976b95d7 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-managed-identity.yml @@ -0,0 +1,66 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-pipeline-managed-identity +on: + workflow_dispatch: + schedule: + - cron: "43 7/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-pipeline-managed-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup identities + run: | + bash -x setup-identities.sh + working-directory: cli/jobs/spark + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark-system-identity.yml jobs/spark/attached-spark-pipeline-managed-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-pipeline-managed-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-attached-spark-pipeline-user-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-user-identity.yml new file mode 100644 index 0000000000..3f44b9851b --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-pipeline-user-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-pipeline-user-identity +on: + workflow_dispatch: + schedule: + - cron: "15 4/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-pipeline-user-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark-user-identity.yml jobs/spark/attached-spark-pipeline-user-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-pipeline-user-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-attached-spark-standalone-default-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-standalone-default-identity.yml new file mode 100644 index 0000000000..565f9967cd --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-standalone-default-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-standalone-default-identity +on: + workflow_dispatch: + schedule: + - cron: "15 0/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-standalone-default-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark.yml jobs/spark/attached-spark-standalone-default-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-standalone-default-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-attached-spark-standalone-managed-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-standalone-managed-identity.yml new file mode 100644 index 0000000000..0994c8225c --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-standalone-managed-identity.yml @@ -0,0 +1,66 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-standalone-managed-identity +on: + workflow_dispatch: + schedule: + - cron: "16 1/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-standalone-managed-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup identities + run: | + bash -x setup-identities.sh + working-directory: cli/jobs/spark + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark-system-identity.yml jobs/spark/attached-spark-standalone-managed-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-standalone-managed-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-attached-spark-standalone-user-identity.yml b/.github/workflows/cli-jobs-spark-attached-spark-standalone-user-identity.yml new file mode 100644 index 0000000000..978fb63ed0 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-attached-spark-standalone-user-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-attached-spark-standalone-user-identity +on: + workflow_dispatch: + schedule: + - cron: "7 1/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-attached-spark-standalone-user-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup attached spark + working-directory: cli + continue-on-error: true + run: | + bash -x jobs/spark/setup-attached-resources.sh resources/compute/attached-spark-user-identity.yml jobs/spark/attached-spark-standalone-user-identity.yml + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh attached-spark-standalone-user-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-default-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-default-identity.yml new file mode 100644 index 0000000000..70cdba7b0c --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-default-identity.yml @@ -0,0 +1,55 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-pipeline-default-identity +on: + workflow_dispatch: + schedule: + - cron: "33 10/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-pipeline-default-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-pipeline-default-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-managed-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-managed-identity.yml new file mode 100644 index 0000000000..20e1214f5f --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-managed-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-pipeline-managed-identity +on: + workflow_dispatch: + schedule: + - cron: "57 5/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-pipeline-managed-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup identities + run: | + bash -x setup-identities.sh + working-directory: cli/jobs/spark + continue-on-error: true + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-pipeline-managed-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-user-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-user-identity.yml new file mode 100644 index 0000000000..d4bab3b999 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-pipeline-user-identity.yml @@ -0,0 +1,55 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-pipeline-user-identity +on: + workflow_dispatch: + schedule: + - cron: "56 7/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-pipeline-user-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-pipeline-user-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-standalone-default-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-default-identity.yml new file mode 100644 index 0000000000..bbff3d7c89 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-default-identity.yml @@ -0,0 +1,55 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-standalone-default-identity +on: + workflow_dispatch: + schedule: + - cron: "19 11/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-standalone-default-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-standalone-default-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-standalone-managed-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-managed-identity.yml new file mode 100644 index 0000000000..a189d54e60 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-managed-identity.yml @@ -0,0 +1,61 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-standalone-managed-identity +on: + workflow_dispatch: + schedule: + - cron: "46 0/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-standalone-managed-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true + - name: setup identities + run: | + bash -x setup-identities.sh + working-directory: cli/jobs/spark + continue-on-error: true + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-standalone-managed-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/cli-jobs-spark-serverless-spark-standalone-user-identity.yml b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-user-identity.yml new file mode 100644 index 0000000000..fce4fbf974 --- /dev/null +++ b/.github/workflows/cli-jobs-spark-serverless-spark-standalone-user-identity.yml @@ -0,0 +1,55 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: cli-jobs-spark-serverless-spark-standalone-user-identity +on: + workflow_dispatch: + schedule: + - cron: "27 1/12 * * *" + pull_request: + branches: + - main + paths: + - cli/jobs/spark/** + - infra/bootstrapping/** + - .github/workflows/cli-jobs-spark-serverless-spark-standalone-user-identity.yml + - cli/jobs/spark/data/titanic.csv + - cli/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + - name: run job + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash -x ../../run-job.sh serverless-spark-standalone-user-identity.yml + working-directory: cli/jobs/spark diff --git a/.github/workflows/python-sdk-deploy-pytorch-mnist-job.yml b/.github/workflows/python-sdk-deploy-pytorch-mnist-job.yml index caa218ed04..bea515bbe7 100644 --- a/.github/workflows/python-sdk-deploy-pytorch-mnist-job.yml +++ b/.github/workflows/python-sdk-deploy-pytorch-mnist-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-deploy-scikit-learn-diabetes-job.yml b/.github/workflows/python-sdk-deploy-scikit-learn-diabetes-job.yml index 5a0fea82ef..57a670aaea 100644 --- a/.github/workflows/python-sdk-deploy-scikit-learn-diabetes-job.yml +++ b/.github/workflows/python-sdk-deploy-scikit-learn-diabetes-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-experimental-automl-model-testing-classification-tsi.yml b/.github/workflows/python-sdk-experimental-automl-model-testing-classification-tsi.yml index edef04de09..e480f43025 100755 --- a/.github/workflows/python-sdk-experimental-automl-model-testing-classification-tsi.yml +++ b/.github/workflows/python-sdk-experimental-automl-model-testing-classification-tsi.yml @@ -43,14 +43,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run classification-TSI.ipynb run: papermill -k python classification-TSI.ipynb classification-TSI.output.ipynb working-directory: v1/python-sdk/experimental/automl-model-testing/classification diff --git a/.github/workflows/python-sdk-experimental-automl-model-testing-forecasting-tsi.yml b/.github/workflows/python-sdk-experimental-automl-model-testing-forecasting-tsi.yml index c5c81c719d..1105540386 100755 --- a/.github/workflows/python-sdk-experimental-automl-model-testing-forecasting-tsi.yml +++ b/.github/workflows/python-sdk-experimental-automl-model-testing-forecasting-tsi.yml @@ -43,14 +43,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run forecasting-TSI.ipynb run: papermill -k python forecasting-TSI.ipynb forecasting-TSI.output.ipynb working-directory: v1/python-sdk/experimental/automl-model-testing/forecasting diff --git a/.github/workflows/python-sdk-experimental-automl-model-testing-regression-tsi.yml b/.github/workflows/python-sdk-experimental-automl-model-testing-regression-tsi.yml index d437edac6a..c6166c7c0b 100755 --- a/.github/workflows/python-sdk-experimental-automl-model-testing-regression-tsi.yml +++ b/.github/workflows/python-sdk-experimental-automl-model-testing-regression-tsi.yml @@ -43,14 +43,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run regression-TSI.ipynb run: papermill -k python regression-TSI.ipynb regression-TSI.output.ipynb working-directory: v1/python-sdk/experimental/automl-model-testing/regression diff --git a/.github/workflows/python-sdk-train-deepspeed-cifar-job.yml b/.github/workflows/python-sdk-train-deepspeed-cifar-job.yml index a6860aec53..21a3a4385c 100644 --- a/.github/workflows/python-sdk-train-deepspeed-cifar-job.yml +++ b/.github/workflows/python-sdk-train-deepspeed-cifar-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-deepspeed-transformers-job.yml b/.github/workflows/python-sdk-train-deepspeed-transformers-job.yml index 7992f23217..565e743787 100644 --- a/.github/workflows/python-sdk-train-deepspeed-transformers-job.yml +++ b/.github/workflows/python-sdk-train-deepspeed-transformers-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-fastai-mnist-job.yml b/.github/workflows/python-sdk-train-fastai-mnist-job.yml index 8b1e3678ae..6a9c5d0c99 100644 --- a/.github/workflows/python-sdk-train-fastai-mnist-job.yml +++ b/.github/workflows/python-sdk-train-fastai-mnist-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-fastai-mnist-mlproject-job.yml b/.github/workflows/python-sdk-train-fastai-mnist-mlproject-job.yml index b69086c8a3..58dff74c84 100644 --- a/.github/workflows/python-sdk-train-fastai-mnist-mlproject-job.yml +++ b/.github/workflows/python-sdk-train-fastai-mnist-mlproject-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-lightgbm-iris-job.yml b/.github/workflows/python-sdk-train-lightgbm-iris-job.yml index 0addf92d29..dbae7107f4 100644 --- a/.github/workflows/python-sdk-train-lightgbm-iris-job.yml +++ b/.github/workflows/python-sdk-train-lightgbm-iris-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-pytorch-cifar-distributed-job.yml b/.github/workflows/python-sdk-train-pytorch-cifar-distributed-job.yml index 536ef232a3..06ee525e44 100644 --- a/.github/workflows/python-sdk-train-pytorch-cifar-distributed-job.yml +++ b/.github/workflows/python-sdk-train-pytorch-cifar-distributed-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-pytorch-mnist-job.yml b/.github/workflows/python-sdk-train-pytorch-mnist-job.yml index e0556afbca..e5e53bb91e 100644 --- a/.github/workflows/python-sdk-train-pytorch-mnist-job.yml +++ b/.github/workflows/python-sdk-train-pytorch-mnist-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-pytorch-mnist-mlproject-job.yml b/.github/workflows/python-sdk-train-pytorch-mnist-mlproject-job.yml index e2ce521204..674e9ff9d9 100644 --- a/.github/workflows/python-sdk-train-pytorch-mnist-mlproject-job.yml +++ b/.github/workflows/python-sdk-train-pytorch-mnist-mlproject-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-scikit-learn-diabetes-job.yml b/.github/workflows/python-sdk-train-scikit-learn-diabetes-job.yml index 90b09f9b55..4c7a282b6e 100644 --- a/.github/workflows/python-sdk-train-scikit-learn-diabetes-job.yml +++ b/.github/workflows/python-sdk-train-scikit-learn-diabetes-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-scikit-learn-diabetes-mlproject-job.yml b/.github/workflows/python-sdk-train-scikit-learn-diabetes-mlproject-job.yml index dc2495b7ee..d4cea139ab 100644 --- a/.github/workflows/python-sdk-train-scikit-learn-diabetes-mlproject-job.yml +++ b/.github/workflows/python-sdk-train-scikit-learn-diabetes-mlproject-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-horovod-job.yml b/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-horovod-job.yml index d531cca184..3483d4684f 100644 --- a/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-horovod-job.yml +++ b/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-horovod-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-job.yml b/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-job.yml index c01c748bab..f30cf1e181 100644 --- a/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-job.yml +++ b/.github/workflows/python-sdk-train-tensorflow-mnist-distributed-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-tensorflow-mnist-job.yml b/.github/workflows/python-sdk-train-tensorflow-mnist-job.yml index b522b32841..d0befb3b0b 100644 --- a/.github/workflows/python-sdk-train-tensorflow-mnist-job.yml +++ b/.github/workflows/python-sdk-train-tensorflow-mnist-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-transformers-glue-1-aml-finetune-job.yml b/.github/workflows/python-sdk-train-transformers-glue-1-aml-finetune-job.yml index 1724098300..324874f23e 100644 --- a/.github/workflows/python-sdk-train-transformers-glue-1-aml-finetune-job.yml +++ b/.github/workflows/python-sdk-train-transformers-glue-1-aml-finetune-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-transformers-glue-2-aml-comparison-of-sku-job.yml b/.github/workflows/python-sdk-train-transformers-glue-2-aml-comparison-of-sku-job.yml index bc351e7a6d..d49f62c321 100644 --- a/.github/workflows/python-sdk-train-transformers-glue-2-aml-comparison-of-sku-job.yml +++ b/.github/workflows/python-sdk-train-transformers-glue-2-aml-comparison-of-sku-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-transformers-glue-3-aml-hyperdrive-job.yml b/.github/workflows/python-sdk-train-transformers-glue-3-aml-hyperdrive-job.yml index a1ff64eb44..b69eb6de01 100644 --- a/.github/workflows/python-sdk-train-transformers-glue-3-aml-hyperdrive-job.yml +++ b/.github/workflows/python-sdk-train-transformers-glue-3-aml-hyperdrive-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-train-xgboost-iris-job.yml b/.github/workflows/python-sdk-train-xgboost-iris-job.yml index 6a41d32065..9f7180ece8 100644 --- a/.github/workflows/python-sdk-train-xgboost-iris-job.yml +++ b/.github/workflows/python-sdk-train-xgboost-iris-job.yml @@ -29,7 +29,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-classification-bank-marketing-all-features.yml b/.github/workflows/python-sdk-tutorial-auto-ml-classification-bank-marketing-all-features.yml index 21ce3e6591..39981f4a08 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-classification-bank-marketing-all-features.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-classification-bank-marketing-all-features.yml @@ -1,4 +1,4 @@ -name: auto-ml-classification-bank-marketing-all-features +name: python-sdk-tutorial-auto-ml-classification-bank-marketing-all-features # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud-local.yml b/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud-local.yml index c3f29c7a17..157cd56285 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud-local.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud-local.yml @@ -1,9 +1,9 @@ -name: auto-ml-classification-credit-card-fraud-local +name: python-sdk-tutorial-auto-ml-classification-credit-card-fraud-local # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 2 * * 2" + - cron: "0 3 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud.yml b/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud.yml index 96e695b1c3..597baf5a99 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-classification-credit-card-fraud.yml @@ -1,4 +1,4 @@ -name: auto-ml-classification-credit-card-fraud +name: python-sdk-tutorial-auto-ml-classification-credit-card-fraud # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-classification-text-dnn.yml b/.github/workflows/python-sdk-tutorial-auto-ml-classification-text-dnn.yml index b34ed04e14..464ad906f8 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-classification-text-dnn.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-classification-text-dnn.yml @@ -1,4 +1,4 @@ -name: auto-ml-classification-text-dnn +name: python-sdk-tutorial-auto-ml-classification-text-dnn # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-continuous-retraining.yml b/.github/workflows/python-sdk-tutorial-auto-ml-continuous-retraining.yml index a59a89a38d..8ca057a62b 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-continuous-retraining.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-continuous-retraining.yml @@ -1,4 +1,4 @@ -name: auto-ml-continuous-retraining +name: python-sdk-tutorial-auto-ml-continuous-retraining # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-many-models.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-many-models.yml index 79960af505..abadfdcf60 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-many-models.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-many-models.yml @@ -1,4 +1,4 @@ -name: auto-ml-forecasting-backtest-many-models +name: python-sdk-tutorial-auto-ml-forecasting-backtest-many-models # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -48,7 +48,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-single-model.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-single-model.yml index 561ca30cae..d0b15200d6 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-single-model.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-backtest-single-model.yml @@ -1,4 +1,4 @@ -name: auto-ml-forecasting-backtest-single-model +name: python-sdk-tutorial-auto-ml-forecasting-backtest-single-model # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-bike-share.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-bike-share.yml index 088318385f..a9f4e4f92a 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-bike-share.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-bike-share.yml @@ -1,4 +1,4 @@ -name: auto-ml-forecasting-bike-share +name: python-sdk-tutorial-auto-ml-forecasting-bike-share # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-data-preparation.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-data-preparation.yml index 1190004eae..839a669bc8 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-data-preparation.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-data-preparation.yml @@ -1,4 +1,4 @@ -name: auto-ml-forecasting-data-preparation +name: python-sdk-tutorial-auto-ml-forecasting-data-preparation # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-forecasting-many-models.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-forecasting-many-models.yml index a3cc46868e..bc58bd76de 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-forecasting-many-models.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-forecasting-many-models.yml @@ -1,4 +1,4 @@ -name: auto-ml-forecasting-demand-forecasting-many-models +name: python-sdk-tutorial-auto-ml-forecasting-demand-forecasting-many-models # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-tcn.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-tcn.yml index 11f6e3eff4..649502c9f2 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-tcn.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-demand-tcn.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-demand-tcn +name: python-sdk-tutorial-auto-ml-forecasting-demand-tcn # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 11 * * 2" + - cron: "0 12 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-energy-demand.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-energy-demand.yml index 5189358d03..a2a885d261 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-energy-demand.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-energy-demand.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-energy-demand +name: python-sdk-tutorial-auto-ml-forecasting-energy-demand # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 10 * * 2" + - cron: "0 13 * * 2" pull_request: branches: - main diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-function.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-function.yml index 7d1b82fbe8..e56ed5db55 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-function.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-function.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-function +name: python-sdk-tutorial-auto-ml-forecasting-function # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 11 * * 2" + - cron: "0 14 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-github-dau.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-github-dau.yml index 04839ac6bd..6358c0afc2 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-github-dau.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-github-dau.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-github-dau +name: python-sdk-tutorial-auto-ml-forecasting-github-dau # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 12 * * 2" + - cron: "0 15 * * 2" pull_request: branches: - main diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-hierarchical-timeseries.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-hierarchical-timeseries.yml index a7694c8927..10d74842b9 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-hierarchical-timeseries.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-hierarchical-timeseries.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-hierarchical-timeseries +name: python-sdk-tutorial-auto-ml-forecasting-hierarchical-timeseries # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 13 * * 2" + - cron: "0 16 * * 2" pull_request: branches: - main @@ -48,7 +48,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-many-models.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-many-models.yml index 3b15e2f336..684e934bdd 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-many-models.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-many-models.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-many-models +name: python-sdk-tutorial-auto-ml-forecasting-many-models # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 14 * * 2" + - cron: "0 17 * * 2" pull_request: branches: - main @@ -48,7 +48,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-orange-juice-sales.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-orange-juice-sales.yml index 585ad1fb9c..cc74092732 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-orange-juice-sales.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-orange-juice-sales.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-orange-juice-sales +name: python-sdk-tutorial-auto-ml-forecasting-orange-juice-sales # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 15 * * 2" + - cron: "0 18 * * 2" pull_request: branches: - main diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-pipelines.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-pipelines.yml index 925f2aa243..2a01fd36ac 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-pipelines.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-pipelines.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-pipelines +name: python-sdk-tutorial-auto-ml-forecasting-pipelines # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 16 * * 2" + - cron: "0 19 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-experiment-settings.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-experiment-settings.yml index f01d82bd1a..b7dca4bc0e 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-experiment-settings.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-experiment-settings.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-univariate-recipe-experiment-settings +name: python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-experiment-settings # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 17 * * 2" + - cron: "0 20 * * 2" pull_request: branches: - main diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-run-experiment.yml b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-run-experiment.yml index dd58ac7e57..8b7d2b42fb 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-run-experiment.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-run-experiment.yml @@ -1,9 +1,9 @@ -name: auto-ml-forecasting-univariate-recipe-run-experiment +name: python-sdk-tutorial-auto-ml-forecasting-univariate-recipe-run-experiment # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 18 * * 2" + - cron: "0 21 * * 2" pull_request: branches: - main diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass-batch-scoring.yml b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass-batch-scoring.yml index ea36591f34..aa932f198d 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass-batch-scoring.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass-batch-scoring.yml @@ -1,9 +1,9 @@ -name: auto-ml-image-classification-multiclass-batch-scoring +name: python-sdk-tutorial-auto-ml-image-classification-multiclass-batch-scoring # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 20 * * 2" + - cron: "0 23 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass.yml b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass.yml index 9af1308802..f48635a86c 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multiclass.yml @@ -1,9 +1,9 @@ -name: auto-ml-image-classification-multiclass +name: python-sdk-tutorial-auto-ml-image-classification-multiclass # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 19 * * 2" + - cron: "0 22 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multilabel.yml b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multilabel.yml index 26b84a9d24..ac442dcd9b 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multilabel.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-image-classification-multilabel.yml @@ -1,9 +1,9 @@ -name: auto-ml-image-classification-multilabel +name: python-sdk-tutorial-auto-ml-image-classification-multilabel # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 21 * * 2" + - cron: "0 0 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-image-instance-segmentation.yml b/.github/workflows/python-sdk-tutorial-auto-ml-image-instance-segmentation.yml index 87744cbbf2..fd1acfe919 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-image-instance-segmentation.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-image-instance-segmentation.yml @@ -1,9 +1,9 @@ -name: auto-ml-image-instance-segmentation +name: python-sdk-tutorial-auto-ml-image-instance-segmentation # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 22 * * 2" + - cron: "0 1 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-image-object-detection.yml b/.github/workflows/python-sdk-tutorial-auto-ml-image-object-detection.yml index 47935a7475..f6491c5be8 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-image-object-detection.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-image-object-detection.yml @@ -1,9 +1,9 @@ -name: auto-ml-image-object-detection +name: python-sdk-tutorial-auto-ml-image-object-detection # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 23 * * 2" + - cron: "0 2 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-regression-explanation-featurization.yml b/.github/workflows/python-sdk-tutorial-auto-ml-regression-explanation-featurization.yml index 8357845318..9d7b3c664a 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-regression-explanation-featurization.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-regression-explanation-featurization.yml @@ -1,9 +1,9 @@ -name: auto-ml-regression-explanation-featurization +name: python-sdk-tutorial-auto-ml-regression-explanation-featurization # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 3 * * 2" + - cron: "0 6 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-auto-ml-regression.yml b/.github/workflows/python-sdk-tutorial-auto-ml-regression.yml index 09f4cd260f..7daf823caa 100644 --- a/.github/workflows/python-sdk-tutorial-auto-ml-regression.yml +++ b/.github/workflows/python-sdk-tutorial-auto-ml-regression.yml @@ -1,9 +1,9 @@ -name: auto-ml-regression +name: python-sdk-tutorial-auto-ml-regression # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: schedule: - - cron: "0 2 * * 2" + - cron: "0 5 * * 2" pull_request: branches: - main @@ -45,7 +45,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-automl-nlp-multiclass.yml b/.github/workflows/python-sdk-tutorial-automl-nlp-multiclass.yml index 78d3555936..82add38b20 100644 --- a/.github/workflows/python-sdk-tutorial-automl-nlp-multiclass.yml +++ b/.github/workflows/python-sdk-tutorial-automl-nlp-multiclass.yml @@ -11,7 +11,7 @@ on: - .github/workflows/python-sdk-tutorial-automl-nlp-multiclass.yml jobs: build: - runs-on: ubuntu-latest + runs-on: ${{vars.V1_UBUNTU_RUNNER}} defaults: run: shell: bash -l {0} @@ -46,14 +46,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run automl-nlp-text-classification-multiclass.ipynb run: papermill -k python automl-nlp-text-classification-multiclass.ipynb automl-nlp-text-classification-multiclass.output.ipynb working-directory: v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/ diff --git a/.github/workflows/python-sdk-tutorial-automl-nlp-multilabel.yml b/.github/workflows/python-sdk-tutorial-automl-nlp-multilabel.yml index b76c5f7b4d..b45f2379ff 100644 --- a/.github/workflows/python-sdk-tutorial-automl-nlp-multilabel.yml +++ b/.github/workflows/python-sdk-tutorial-automl-nlp-multilabel.yml @@ -11,7 +11,7 @@ on: - .github/workflows/python-sdk-tutorial-automl-nlp-multilabel.yml jobs: build: - runs-on: ubuntu-latest + runs-on: ${{vars.V1_UBUNTU_RUNNER}} defaults: run: shell: bash -l {0} @@ -46,14 +46,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run automl-nlp-text-classification-multilabel.ipynb run: papermill -k python automl-nlp-text-classification-multilabel.ipynb automl-nlp-text-classification-multilabel.output.ipynb working-directory: v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/ diff --git a/.github/workflows/python-sdk-tutorial-automl-nlp-ner.yml b/.github/workflows/python-sdk-tutorial-automl-nlp-ner.yml index 43f83aabeb..7dbd62e055 100644 --- a/.github/workflows/python-sdk-tutorial-automl-nlp-ner.yml +++ b/.github/workflows/python-sdk-tutorial-automl-nlp-ner.yml @@ -1,4 +1,4 @@ -name: automl-nlp-ner +name: python-sdk-tutorial-automl-nlp-ner # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: @@ -48,7 +48,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh diff --git a/.github/workflows/python-sdk-tutorial-automl-with-pycaret.yml b/.github/workflows/python-sdk-tutorial-automl-with-pycaret.yml deleted file mode 100644 index 00ee86639a..0000000000 --- a/.github/workflows/python-sdk-tutorial-automl-with-pycaret.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: python-sdk-tutorial-automl-with-pycaret -on: - schedule: - - cron: "0 8 * * *" - pull_request: - branches: - - main - paths: - - v1/tutorials/automl-with-pycaret/** - - .github/workflows/python-sdk/tutorial-automl-with-pycaret.yml - - v1/tutorials/requirements.txt -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: check out repo - uses: actions/checkout@v2 - - name: setup python - uses: actions/setup-python@v2 - with: - python-version: "3.8" - - name: pip install - run: pip install -r v1/python-sdk/requirements.txt - - name: azure login - uses: azure/login@v1 - with: - creds: ${{secrets.AZ_AE_CREDS}} - - name: install azmlcli - run: az extension add -n azure-cli-ml -y - - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg - - name: run 1.classification.ipynb - run: papermill 1.classification.ipynb - -k python - working-directory: v1/python-sdk/tutorials/automl-with-pycaret diff --git a/.github/workflows/python-sdk-tutorial-dataset-uploads.yml b/.github/workflows/python-sdk-tutorial-dataset-uploads.yml index 7aab3a7fe4..75a63d1846 100644 --- a/.github/workflows/python-sdk-tutorial-dataset-uploads.yml +++ b/.github/workflows/python-sdk-tutorial-dataset-uploads.yml @@ -32,7 +32,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/python-sdk-tutorial-deploy-local.yml b/.github/workflows/python-sdk-tutorial-deploy-local.yml index 12f94eb4f2..48a0cc85ef 100644 --- a/.github/workflows/python-sdk-tutorial-deploy-local.yml +++ b/.github/workflows/python-sdk-tutorial-deploy-local.yml @@ -26,7 +26,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/python-sdk-tutorial-deploy-triton.yml b/.github/workflows/python-sdk-tutorial-deploy-triton.yml index 6cf7fb1f19..aaad0e6158 100644 --- a/.github/workflows/python-sdk-tutorial-deploy-triton.yml +++ b/.github/workflows/python-sdk-tutorial-deploy-triton.yml @@ -26,7 +26,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/python-sdk-tutorial-metrics-binary-classification-metric-and-confidence-interval.yml b/.github/workflows/python-sdk-tutorial-metrics-binary-classification-metric-and-confidence-interval.yml index 6f51157f49..3ce3505808 100644 --- a/.github/workflows/python-sdk-tutorial-metrics-binary-classification-metric-and-confidence-interval.yml +++ b/.github/workflows/python-sdk-tutorial-metrics-binary-classification-metric-and-confidence-interval.yml @@ -43,14 +43,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run binary-classification-metric-and-confidence-interval.ipynb run: papermill -k python binary-classification-metric-and-confidence-interval.ipynb binary-classification-metric-and-confidence-interval.output.ipynb working-directory: v1/python-sdk/tutorials/automl-with-azureml/metrics diff --git a/.github/workflows/python-sdk-tutorial-train-on-low-priority-aml-compute.yml b/.github/workflows/python-sdk-tutorial-train-on-low-priority-aml-compute.yml index 2c6e0f9738..6c22ec749e 100644 --- a/.github/workflows/python-sdk-tutorial-train-on-low-priority-aml-compute.yml +++ b/.github/workflows/python-sdk-tutorial-train-on-low-priority-aml-compute.yml @@ -32,14 +32,14 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_AE_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: Run update-azure-extensions run: | chmod +x ./v1/scripts/update-azure-extensions.sh ./v1/scripts/update-azure-extensions.sh shell: bash - name: attach to workspace - run: az ml folder attach -w main-python-sdk -g azureml-examples-rg + run: az ml folder attach -w main -g azureml-examples - name: run train-on-low-priority-aml-compute run: papermill -k python train-on-low-priority-aml-compute.ipynb train-on-low-priority-aml-compute.output.ipynb working-directory: v1/python-sdk/tutorials/train-on-low-priority-aml-compute diff --git a/.github/workflows/python-sdk-tutorial-using-pipelines.yml b/.github/workflows/python-sdk-tutorial-using-pipelines.yml index 73caed60cc..9e49e898a9 100644 --- a/.github/workflows/python-sdk-tutorial-using-pipelines.yml +++ b/.github/workflows/python-sdk-tutorial-using-pipelines.yml @@ -32,7 +32,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/python-sdk-tutorial-using-pytorch-lightning.yml b/.github/workflows/python-sdk-tutorial-using-pytorch-lightning.yml index 10a190a37a..eb1df78114 100644 --- a/.github/workflows/python-sdk-tutorial-using-pytorch-lightning.yml +++ b/.github/workflows/python-sdk-tutorial-using-pytorch-lightning.yml @@ -26,7 +26,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/python-sdk-tutorial-using-rapids.yml b/.github/workflows/python-sdk-tutorial-using-rapids.yml index b9d5f75eb2..42a7f16188 100644 --- a/.github/workflows/python-sdk-tutorial-using-rapids.yml +++ b/.github/workflows/python-sdk-tutorial-using-rapids.yml @@ -26,7 +26,7 @@ jobs: - name: azure login uses: azure/login@v1 with: - creds: ${{secrets.AZ_CREDS}} + creds: ${{secrets.AZUREML_CREDENTIALS}} - name: install azmlcli run: az extension add -n azure-cli-ml -y - name: attach to workspace diff --git a/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml new file mode 100644 index 0000000000..52542d15c1 --- /dev/null +++ b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "8 2/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/** + - .github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: pip install mlflow reqs + run: pip install -r sdk/python/mlflow-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: run jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/automl-forecasting-distributed-tcn.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "automl-forecasting-distributed-tcn.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python -p compute_name automl-cpu-cluster automl-forecasting-distributed-tcn.ipynb automl-forecasting-distributed-tcn.output.ipynb + working-directory: sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: automl-forecasting-distributed-tcn + path: sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn + + - name: Remove the compute if notebook did not done it properly. + run: bash "${{ github.workspace }}/infra/bootstrapping/remove_computes.sh" "distributed-tcn-cluster" diff --git a/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml index e69d1b74d6..33fa906c7f 100644 --- a/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml +++ b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml @@ -76,7 +76,7 @@ jobs: python ${{ github.workspace }}/v1/scripts/validation/check_notebook_output.py \ --file_name automl-forecasting-orange-juice-sales-mlflow.output.ipynb \ --folder . \ - --check warning stderr \ + --check warning \ working-directory: sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales - name: check v2 experiment result run: | diff --git a/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-image-instance-segmentation-task-fridge-items-automl-image-instance-segmentation-task-fridge-items.yml b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-image-instance-segmentation-task-fridge-items-automl-image-instance-segmentation-task-fridge-items.yml index 1d9dd7ece5..e42381e255 100644 --- a/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-image-instance-segmentation-task-fridge-items-automl-image-instance-segmentation-task-fridge-items.yml +++ b/.github/workflows/sdk-jobs-automl-standalone-jobs-automl-image-instance-segmentation-task-fridge-items-automl-image-instance-segmentation-task-fridge-items.yml @@ -9,7 +9,7 @@ name: sdk-jobs-automl-standalone-jobs-automl-image-instance-segmentation-task-fr on: workflow_dispatch: schedule: - - cron: "32 8/12 * * *" + - cron: "32 10/12 * * *" pull_request: branches: - main diff --git a/.github/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml b/.github/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml new file mode 100644 index 0000000000..7af6fcd870 --- /dev/null +++ b/.github/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "0 10/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes/** + - .github/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "pipeline_with_spark_nodes.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python pipeline_with_spark_nodes.ipynb pipeline_with_spark_nodes.output.ipynb + working-directory: sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: pipeline_with_spark_nodes + path: sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes diff --git a/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml b/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml new file mode 100644 index 0000000000..222191365a --- /dev/null +++ b/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml @@ -0,0 +1,75 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "45 5/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/** + - .github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: run jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python -p compute_name automl-cpu-cluster automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb automl-forecasting-demand-hierarchical-timeseries-in-pipeline.output.ipynb + working-directory: sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: automl-forecasting-demand-hierarchical-timeseries-in-pipeline + path: sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline diff --git a/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml b/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml new file mode 100644 index 0000000000..e1285c7ad8 --- /dev/null +++ b/.github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml @@ -0,0 +1,75 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "59 7/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/** + - .github/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: run jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "automl-forecasting-demand-many-models-in-pipeline.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python -p compute_name automl-cpu-cluster automl-forecasting-demand-many-models-in-pipeline.ipynb automl-forecasting-demand-many-models-in-pipeline.output.ipynb + working-directory: sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: automl-forecasting-demand-many-models-in-pipeline + path: sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline diff --git a/.github/workflows/sdk-jobs-spark-automation-run_interactive_session_notebook.yml b/.github/workflows/sdk-jobs-spark-automation-run_interactive_session_notebook.yml new file mode 100644 index 0000000000..8a2aa179ee --- /dev/null +++ b/.github/workflows/sdk-jobs-spark-automation-run_interactive_session_notebook.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-spark-automation-run_interactive_session_notebook +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "30 11/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/spark/automation/** + - .github/workflows/sdk-jobs-spark-automation-run_interactive_session_notebook.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ jobs/spark/automation/run_interactive_session_notebook.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run jobs/spark/automation/run_interactive_session_notebook.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "run_interactive_session_notebook.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python run_interactive_session_notebook.ipynb run_interactive_session_notebook.output.ipynb + working-directory: sdk/python/jobs/spark/automation + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: run_interactive_session_notebook + path: sdk/python/jobs/spark/automation diff --git a/.github/workflows/sdk-jobs-single-step-pytorch-distributed-training-yolov5-yolov5-tutorial.yml b/.github/workflows/sdk-jobs-spark-submit_spark_pipeline_jobs.yml similarity index 76% rename from .github/workflows/sdk-jobs-single-step-pytorch-distributed-training-yolov5-yolov5-tutorial.yml rename to .github/workflows/sdk-jobs-spark-submit_spark_pipeline_jobs.yml index b7fac945a9..0c286018e8 100644 --- a/.github/workflows/sdk-jobs-single-step-pytorch-distributed-training-yolov5-yolov5-tutorial.yml +++ b/.github/workflows/sdk-jobs-spark-submit_spark_pipeline_jobs.yml @@ -3,19 +3,19 @@ # Any manual changes to this file may cause incorrect behavior. # Any manual changes will be overwritten if the code is regenerated. -name: sdk-jobs-single-step-pytorch-distributed-training-yolov5-yolov5-tutorial +name: sdk-jobs-spark-submit_spark_pipeline_jobs # This file is created by sdk/python/readme.py. # Please do not edit directly. on: workflow_dispatch: schedule: - - cron: "10 5/12 * * *" + - cron: "33 1/12 * * *" pull_request: branches: - main paths: - - sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/yolov5/** - - .github/workflows/sdk-jobs-single-step-pytorch-distributed-training-yolov5-yolov5-tutorial.yml + - sdk/python/jobs/spark/** + - .github/workflows/sdk-jobs-spark-submit_spark_pipeline_jobs.yml - sdk/python/dev-requirements.txt - infra/bootstrapping/** - sdk/python/setup.sh @@ -58,18 +58,23 @@ jobs: bash setup.sh working-directory: cli continue-on-error: true - - name: run jobs/single-step/pytorch/distributed-training-yolov5/yolov5/tutorial.ipynb + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ jobs/spark/submit_spark_pipeline_jobs.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run jobs/spark/submit_spark_pipeline_jobs.ipynb run: | source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; - bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "tutorial.ipynb"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "submit_spark_pipeline_jobs.ipynb"; [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; - papermill -k python tutorial.ipynb tutorial.output.ipynb - working-directory: sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/yolov5 + papermill -k python submit_spark_pipeline_jobs.ipynb submit_spark_pipeline_jobs.output.ipynb + working-directory: sdk/python/jobs/spark - name: upload notebook's working folder as an artifact if: ${{ always() }} uses: actions/upload-artifact@v2 with: - name: tutorial - path: sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/yolov5 + name: submit_spark_pipeline_jobs + path: sdk/python/jobs/spark diff --git a/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs.yml b/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs.yml new file mode 100644 index 0000000000..2be2661bfd --- /dev/null +++ b/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-spark-submit_spark_standalone_jobs +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "36 10/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/spark/** + - .github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ jobs/spark/submit_spark_standalone_jobs.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run jobs/spark/submit_spark_standalone_jobs.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "submit_spark_standalone_jobs.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python submit_spark_standalone_jobs.ipynb submit_spark_standalone_jobs.output.ipynb + working-directory: sdk/python/jobs/spark + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: submit_spark_standalone_jobs + path: sdk/python/jobs/spark diff --git a/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs_managed_vnet.yml b/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs_managed_vnet.yml new file mode 100644 index 0000000000..89d7aa0dc6 --- /dev/null +++ b/.github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs_managed_vnet.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-jobs-spark-submit_spark_standalone_jobs_managed_vnet +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "14 1/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/jobs/spark/** + - .github/workflows/sdk-jobs-spark-submit_spark_standalone_jobs_managed_vnet.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "submit_spark_standalone_jobs_managed_vnet.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python submit_spark_standalone_jobs_managed_vnet.ipynb submit_spark_standalone_jobs_managed_vnet.output.ipynb + working-directory: sdk/python/jobs/spark + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: submit_spark_standalone_jobs_managed_vnet + path: sdk/python/jobs/spark diff --git a/.github/workflows/sdk-resources-compute-attach_manage_spark_pools.yml b/.github/workflows/sdk-resources-compute-attach_manage_spark_pools.yml new file mode 100644 index 0000000000..33d9bab2ac --- /dev/null +++ b/.github/workflows/sdk-resources-compute-attach_manage_spark_pools.yml @@ -0,0 +1,80 @@ +# This code is autogenerated. +# Code is generated by running custom script: python3 readme.py +# Any manual changes to this file may cause incorrect behavior. +# Any manual changes will be overwritten if the code is regenerated. + +name: sdk-resources-compute-attach_manage_spark_pools +# This file is created by sdk/python/readme.py. +# Please do not edit directly. +on: + workflow_dispatch: + schedule: + - cron: "27 3/12 * * *" + pull_request: + branches: + - main + paths: + - sdk/python/resources/compute/** + - .github/workflows/sdk-resources-compute-attach_manage_spark_pools.yml + - sdk/python/dev-requirements.txt + - infra/bootstrapping/** + - sdk/python/setup.sh +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: check out repo + uses: actions/checkout@v2 + - name: setup python + uses: actions/setup-python@v2 + with: + python-version: "3.8" + - name: pip install notebook reqs + run: pip install -r sdk/python/dev-requirements.txt + - name: azure login + uses: azure/login@v1 + with: + creds: ${{secrets.AZUREML_CREDENTIALS}} + - name: bootstrap resources + run: | + echo '${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}'; + bash bootstrap.sh + working-directory: infra/bootstrapping + continue-on-error: false + - name: setup SDK + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: sdk/python + continue-on-error: true + - name: setup-cli + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash setup.sh + working-directory: cli + continue-on-error: true + - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ resources/compute/attach_manage_spark_pools.ipynb + working-directory: sdk/python + continue-on-error: true + - name: run resources/compute/attach_manage_spark_pools.ipynb + run: | + source "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh"; + source "${{ github.workspace }}/infra/bootstrapping/init_environment.sh"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" generate_workspace_config "../../.azureml/config.json"; + bash "${{ github.workspace }}/infra/bootstrapping/sdk_helpers.sh" replace_template_values "attach_manage_spark_pools.ipynb"; + [ -f "../../.azureml/config" ] && cat "../../.azureml/config"; + papermill -k python attach_manage_spark_pools.ipynb attach_manage_spark_pools.output.ipynb + working-directory: sdk/python/resources/compute + - name: upload notebook's working folder as an artifact + if: ${{ always() }} + uses: actions/upload-artifact@v2 + with: + name: attach_manage_spark_pools + path: sdk/python/resources/compute diff --git a/cli/README.md b/cli/README.md index eaa5d729e6..a1269885e9 100644 --- a/cli/README.md +++ b/cli/README.md @@ -130,6 +130,8 @@ path|status|description [jobs/basics/hello-world-output.yml](jobs/basics/hello-world-output.yml)|[![jobs/basics/hello-world-output](https://github.com/Azure/azureml-examples/workflows/cli-jobs-basics-hello-world-output/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-basics-hello-world-output.yml)|*no description* [jobs/basics/hello-world.yml](jobs/basics/hello-world.yml)|[![jobs/basics/hello-world](https://github.com/Azure/azureml-examples/workflows/cli-jobs-basics-hello-world/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-basics-hello-world.yml)|*no description* [jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/pipeline.yml](jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/pipeline.yml)|[![jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-classification-task-bankmarketing-pipeline-pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-classification-task-bankmarketing-pipeline-pipeline.yml)|Pipeline using AutoML classification task +[jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline.yml](jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline.yml)|[![jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-hierarchical-timeseries-hts_evaluation_pipeline.yml)|HTS evaluation pipeline using AutoML +[jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline.yml](jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline.yml)|[![jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-forecasting-demand-with-pipeline-components-cli-automl-forecasting-demand-many-models-many_models_evaluation_pipeline.yml)|Many models evaluation pipeline using AutoML [jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/pipeline.yml](jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/pipeline.yml)|[![jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-regression-housepricing-pipeline-pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-regression-housepricing-pipeline-pipeline.yml)|Pipeline using AutoML regression task [jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/pipeline.yml](jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/pipeline.yml)|[![jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-text-classification-multilabel-paper-categorization-pipeline-pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-text-classification-multilabel-paper-categorization-pipeline-pipeline.yml)|Pipeline using AutoML Text Classification Multilabel task [jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/pipeline.yml](jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/pipeline.yml)|[![jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/pipeline](https://github.com/Azure/azureml-examples/workflows/cli-jobs-pipelines-automl-cli-automl-text-classification-newsgroup-pipeline-pipeline/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/cli-jobs-pipelines-automl-cli-automl-text-classification-newsgroup-pipeline-pipeline.yml)|Pipeline using AutoML Text Classification task diff --git a/cli/deploy-managed-online-endpoint-workspacevnet.sh b/cli/deploy-managed-online-endpoint-workspacevnet.sh new file mode 100644 index 0000000000..a9261a7709 --- /dev/null +++ b/cli/deploy-managed-online-endpoint-workspacevnet.sh @@ -0,0 +1,88 @@ +set -e + +export RESOURCEGROUP_NAME="" +export WORKSPACE_NAME="" + +# If you want to allow outbound traffic, use below instead. +# +# az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_internet_outbound +# + +# If you want to block outbound traffic, use below instead. +# +az ml workspace create -g $RESOURCEGROUP_NAME -n $WORKSPACE_NAME -m allow_only_approved_outbound +# + +az configure --defaults workspace=$WORKSPACE_NAME group=$RESOURCEGROUP_NAME + +# +export ENDPOINT_NAME="" +# + +export ENDPOINT_NAME=endpt-moe-`echo $RANDOM` + +# If you want to allow inbound traffic, use below instead. +# +# az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml +# + +# If you want to block inbound traffic, use below instead. +# +az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml --set public_network_access=disabled +# + +# +az ml online-deployment create --name blue --endpoint $ENDPOINT_NAME -f endpoints/online/managed/sample/blue-deployment.yml --all-traffic +# + +# +az ml online-endpoint show -n $ENDPOINT_NAME +# + +# check if create was successful +endpoint_status=`az ml online-endpoint show --name $ENDPOINT_NAME --query "provisioning_state" -o tsv` +echo $endpoint_status +if [[ $endpoint_status == "Succeeded" ]] +then + echo "Endpoint created successfully" +else + echo "Endpoint creation failed" + exit 1 +fi + +deploy_status=`az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME --query "provisioning_state" -o tsv` +echo $deploy_status +if [[ $deploy_status == "Succeeded" ]] +then + echo "Deployment completed successfully" +else + echo "Deployment failed" + exit 1 +fi + +# +az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json +# + +# supress printing secret +set +x + +# +ENDPOINT_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME -o tsv --query primaryKey) +# + +set -x + +# +SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri) + +curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --data @endpoints/online/model-1/sample-request.json +# + +# +az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME +# + +# +az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait +# diff --git a/cli/deploy-moe-vnet.sh b/cli/deploy-moe-vnet-legacy.sh similarity index 96% rename from cli/deploy-moe-vnet.sh rename to cli/deploy-moe-vnet-legacy.sh index fb65e9194a..2eeceed746 100644 --- a/cli/deploy-moe-vnet.sh +++ b/cli/deploy-moe-vnet-legacy.sh @@ -2,9 +2,9 @@ set -e +# This is now a legacy script that uses the old way of creating a managed vnet endpoint. The new way is to use Workspace Managed VNet. See cli\deploy-managed-online-endpoint-workspacevnet.sh for the new way. # This is the instructions for docs.User has to execute this from a test VM - that is why user cannot use defaults from their local setup - # export SUBSCRIPTION="" export RESOURCE_GROUP="" @@ -107,4 +107,4 @@ az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait # # az vm delete -n $VM_NAME -y --no-wait -# \ No newline at end of file +# diff --git a/cli/deploy-moe-vnet-mlflow.sh b/cli/deploy-moe-vnet-mlflow-legacy.sh similarity index 96% rename from cli/deploy-moe-vnet-mlflow.sh rename to cli/deploy-moe-vnet-mlflow-legacy.sh index 780397c39b..faa5ce4b2c 100644 --- a/cli/deploy-moe-vnet-mlflow.sh +++ b/cli/deploy-moe-vnet-mlflow-legacy.sh @@ -2,6 +2,7 @@ set -e +# This is now a legacy script that uses the old way of creating a managed vnet endpoint. The new way is to use Workspace Managed VNet. See cli\deploy-managed-online-endpoint-workspacevnet.sh for the new way. # This is the instructions for docs.User has to execute this from a test VM - that is why user cannot use defaults from their local setup # @@ -106,4 +107,4 @@ az ml online-endpoint delete --name $ENDPOINT_NAME --yes --no-wait # # az vm delete -n $VM_NAME -y --no-wait -# \ No newline at end of file +# diff --git a/cli/endpoints/batch/deploy-models/imagenet-classifier/deploy-and-run.sh b/cli/endpoints/batch/deploy-models/imagenet-classifier/deploy-and-run.sh index 8a3598a8b5..b0c20a6179 100644 --- a/cli/endpoints/batch/deploy-models/imagenet-classifier/deploy-and-run.sh +++ b/cli/endpoints/batch/deploy-models/imagenet-classifier/deploy-and-run.sh @@ -26,7 +26,7 @@ az ml model create --name $MODEL_NAME --path "model" echo "Creating compute with GPU" # -az ml compute create -n gpu-cluster --type amlcompute --size STANDARD_NC6 --min-instances 0 --max-instances 2 +az ml compute create -n gpu-cluster --type amlcompute --size STANDARD_NC6s_v3 --min-instances 0 --max-instances 2 # echo "Creating batch endpoint $ENDPOINT_NAME" @@ -51,7 +51,7 @@ az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NA # # -wget https://azuremlexampledata.blob.core.windows.net/data/imagenet-1000.zip +wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip unzip imagenet-1000.zip -d data # @@ -96,7 +96,7 @@ az ml job download --name $JOB_NAME --output-name score --download-path . echo "Creating batch deployment for endpoint $ENDPOINT_NAME with high throughput" # -az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --default +az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default # echo "Invoking batch endpoint with local data" diff --git a/cli/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml b/cli/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml index 702dcdd8d1..e5ba84a8db 100644 --- a/cli/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml +++ b/cli/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/deployment.yml @@ -1,4 +1,4 @@ -$schema: http://azureml/sdk-2-0/BatchDeployment.json +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json name: uci-classifier-prepros-xgb description: A sample deployment with pre and post processing done before and after inference. endpoint_name: uci-classifier-batch diff --git a/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment-from-job.yml b/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment-from-job.yml index fc36675966..a26e2bbd79 100644 --- a/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment-from-job.yml +++ b/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment-from-job.yml @@ -1,4 +1,4 @@ -$schema: http://azureml/sdk-2-0/BatchDeployment.json +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json name: hello-batch-from-job description: A hello world deployment with a single step. This deployment is created from a pipeline job. endpoint_name: hello-pipeline-batch diff --git a/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment.yml b/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment.yml index 6381b53092..7bec95b816 100644 --- a/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment.yml +++ b/cli/endpoints/batch/deploy-pipelines/hello-batch/deployment.yml @@ -1,4 +1,4 @@ -$schema: http://azureml/sdk-2-0/BatchDeployment.json +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json name: hello-batch-dpl description: A hello world deployment with a single step. endpoint_name: hello-pipeline-batch diff --git a/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-onehot/deployment.yml b/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-onehot/deployment.yml index 40d29e4cfe..7644c3daad 100644 --- a/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-onehot/deployment.yml +++ b/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-onehot/deployment.yml @@ -1,4 +1,4 @@ -$schema: http://azureml/sdk-2-0/BatchDeployment.json +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json name: uci-classifier-train-onehot description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables. endpoint_name: uci-classifier-train diff --git a/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-ordinal/deployment.yml b/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-ordinal/deployment.yml index bf307069e0..2a78481d98 100644 --- a/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-ordinal/deployment.yml +++ b/cli/endpoints/batch/deploy-pipelines/training-with-components/deployment-ordinal/deployment.yml @@ -1,4 +1,4 @@ -$schema: http://azureml/sdk-2-0/BatchDeployment.json +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json name: uci-classifier-train-xgb description: A sample deployment that trains an XGBoost model for the UCI dataset. endpoint_name: uci-classifier-train diff --git a/cli/endpoints/online/data-collector/README.md b/cli/endpoints/online/data-collector/README.md new file mode 100644 index 0000000000..5e12d74699 --- /dev/null +++ b/cli/endpoints/online/data-collector/README.md @@ -0,0 +1,7 @@ +# Azure Model Data Collector (MDC) Examples + +This directory contains examples on how to use **AzureML Model Data Collector (MDC)**. The feature is used to collect production inference data to a Blob storage container of your choice. The data can then be used for model monitoring purposes. Please find the documentation for the feature [here](https://learn.microsoft.com/en-us/azure/machine-learning/concept-data-collection?view=azureml-api-2). + +In this directory there are two sub-folders: (1) `workspace-blob-storage` and (2) `custom-blob-storage`. These folders refer to the data sink options within the data collector configuration. If you are interested in sending the data to the default sink (the workspace Blob storage), see the examples in the `workspace-blob-storage` folder. Otherwise, if you want to use a custom Blob storage container as the sink, see the examples in the `custom-blob-storage` folder. + +**AzureML Model Data Collector (MDC)** supports data logging for online endpoints (managed and Kubernetes). \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/custom-blob-storage/README.md b/cli/endpoints/online/data-collector/custom-blob-storage/README.md new file mode 100644 index 0000000000..74f04ff298 --- /dev/null +++ b/cli/endpoints/online/data-collector/custom-blob-storage/README.md @@ -0,0 +1,11 @@ +# Collect data to workspace Blob storage + +This directory contains YAML configuration samples for **AzureML Model Data Collection (MDC)** logging production inference data to a Blob storage container of your choice. + +Before creating your deployment with these configuration YAMLs, follow the steps in [the documentation](https://learn.microsoft.com/en-us/azure/machine-learning/concept-data-collection?view=azureml-api-2) to ensure your endpoint has sufficient permissions to write to the Blob storage container of your choice. + +## Contents + +file|description +-|- +`custom-blob-storage.YAML`|Collect data to custom Blob storage sinks \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/custom-blob-storage/custom-blob-storage.YAML b/cli/endpoints/online/data-collector/custom-blob-storage/custom-blob-storage.YAML new file mode 100644 index 0000000000..3546516477 --- /dev/null +++ b/cli/endpoints/online/data-collector/custom-blob-storage/custom-blob-storage.YAML @@ -0,0 +1,18 @@ +endpoint_name: my_endpoint +name: blue +model: azureml:my-model-m1:1 +environment: azureml:env-m1:1 +data_collector: + collections: + model_inputs: + enabled: 'True' + data: + name: my_model_inputs_data_asset + path: azureml://datastores/workspaceblobstore/paths/modelDataCollector/my_endpoint/blue/model_inputs + version: 1 + model_outputs: + enabled: 'True' + data: + name: my_model_outputs_data_asset + path: azureml://datastores/workspaceblobstore/paths/modelDataCollector/my_endpoint/blue/model_outputs + version: 1 \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/workspace-blob-storage/README.md b/cli/endpoints/online/data-collector/workspace-blob-storage/README.md new file mode 100644 index 0000000000..cb74dcfa4b --- /dev/null +++ b/cli/endpoints/online/data-collector/workspace-blob-storage/README.md @@ -0,0 +1,12 @@ +# Collect data to workspace Blob storage + +This directory contains YAML configuration samples for **AzureML Model Data Collection (MDC)** with the data sink as your AzureML workspace Blob storage. + +## Contents + +file|description +-|- +`workspace-blob-storage-custom1.YAML`|Collect custom logging data (model_inputs, model_outputs) +`workspace-blob-storage-custom2.YAML`|Collect both payload data (request and response) and custom logging data (model_inputs, model_outputs), adjust rolling_rate and sampling_rate +`workspace-blob-storage-payload1.YAML`|Collect payload data (request and response) +`workspace-blob-storage-payload2.YAML`|Collect payload data (request and response), adjust rolling_rate and sampling_rate \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom1.YAML b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom1.YAML new file mode 100644 index 0000000000..d76ba419f0 --- /dev/null +++ b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom1.YAML @@ -0,0 +1,10 @@ +endpoint_name: my_endpoint +name: blue +model: azureml:my-model-m1:1 +environment: azureml:env-m1:1 +data_collector: + collections: + model_inputs: + enabled: 'True' # <'True', 'False'> + model_outputs: + enabled: 'True' # <'True', 'False'> \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom2.YAML b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom2.YAML new file mode 100644 index 0000000000..7e5907af84 --- /dev/null +++ b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-custom2.YAML @@ -0,0 +1,16 @@ +endpoint_name: my_endpoint +name: blue +model: azureml:my-model-m1:1 +environment: azureml:env-m1:1 +data_collector: + collections: + request: + enabled: 'True' # <'True', 'False'> + response: + enabled: 'True' # <'True', 'False'> + model_inputs: + enabled: 'True' # <'True', 'False'> + model_outputs: + enabled: 'True' # <'True', 'False'> + rolling_rate: hour # optional + sampling_rate: 1.0 # optional, 0.0-1.0, number to specify random sample % of traffic \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload1.YAML b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload1.YAML new file mode 100644 index 0000000000..b1f8796829 --- /dev/null +++ b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload1.YAML @@ -0,0 +1,10 @@ +endpoint_name: my_endpoint +name: blue +model: azureml:my-model-m1:1 +environment: azureml:env-m1:1 +data_collector: + collections: + request: + enabled: 'True' # <'True', 'False'> + response: + enabled: 'True' # <'True', 'False'> \ No newline at end of file diff --git a/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload2.YAML b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload2.YAML new file mode 100644 index 0000000000..5eaf3209a2 --- /dev/null +++ b/cli/endpoints/online/data-collector/workspace-blob-storage/workspace-blob-storage-payload2.YAML @@ -0,0 +1,12 @@ +endpoint_name: my_endpoint +name: blue +model: azureml:my-model-m1:1 +environment: azureml:env-m1:1 +data_collector: + collections: + request: + enabled: 'True' # <'True', 'False'> + response: + enabled: 'True' # <'True', 'False'> + rolling_rate: hour # optional + sampling_rate: 1.0 # optional, 0.0-1.0, number to specify random sample % of traffic \ No newline at end of file diff --git a/cli/endpoints/online/managed/inference-schema/env.yml b/cli/endpoints/online/managed/inference-schema/env.yml index b950f5cc74..6c575741b8 100644 --- a/cli/endpoints/online/managed/inference-schema/env.yml +++ b/cli/endpoints/online/managed/inference-schema/env.yml @@ -3,7 +3,7 @@ channels: - conda-forge dependencies: - python=3.10 - - scikit-learn + - scikit-learn=1.2.2 - numpy - pandas - pip: diff --git a/cli/foundation-models/system/evaluation/fill-mask/fill-mask-pipeline.yml b/cli/foundation-models/system/evaluation/fill-mask/fill-mask-pipeline.yml index e1aaa2c2f3..38a3b2ff05 100644 --- a/cli/foundation-models/system/evaluation/fill-mask/fill-mask-pipeline.yml +++ b/cli/foundation-models/system/evaluation/fill-mask/fill-mask-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/bert-base-uncased/versions/4 input_column_names: input_string label_column_name: title - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/fill-mask/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/question-answering/extractive-qa-pipeline.yml b/cli/foundation-models/system/evaluation/question-answering/extractive-qa-pipeline.yml index 00a75dd49a..6742a8e473 100644 --- a/cli/foundation-models/system/evaluation/question-answering/extractive-qa-pipeline.yml +++ b/cli/foundation-models/system/evaluation/question-answering/extractive-qa-pipeline.yml @@ -27,7 +27,8 @@ jobs: path: azureml://registries/azureml/models/distilbert-base-uncased-distilled-squad/versions/4 input_column_names: context,question label_column_name: answer_text - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/question-answering/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization-pipeline.yml b/cli/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization-pipeline.yml index f8aec36128..bbd318c4fc 100644 --- a/cli/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization-pipeline.yml +++ b/cli/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/sshleifer-distilbart-cnn-12-6/versions/4 input_column_names: input_string label_column_name: summary - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/summarization/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/text-classification/entailment-contradiction-pipeline.yml b/cli/foundation-models/system/evaluation/text-classification/entailment-contradiction-pipeline.yml index 3388f67580..a1c3be3bc1 100644 --- a/cli/foundation-models/system/evaluation/text-classification/entailment-contradiction-pipeline.yml +++ b/cli/foundation-models/system/evaluation/text-classification/entailment-contradiction-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/microsoft-deberta-base-mnli/versions/4 input_column_names: input_string label_column_name: label_string - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/text-classification/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/text-generation/text-generation-pipeline.yml b/cli/foundation-models/system/evaluation/text-generation/text-generation-pipeline.yml index 00fe62d16e..9bf0c265ec 100644 --- a/cli/foundation-models/system/evaluation/text-generation/text-generation-pipeline.yml +++ b/cli/foundation-models/system/evaluation/text-generation/text-generation-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/gpt2/versions/4 input_column_names: input_string label_column_name: ground_truth - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/text-generation/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition-pipeline.yml b/cli/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition-pipeline.yml index bc131919cd..9f1f781ee2 100644 --- a/cli/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition-pipeline.yml +++ b/cli/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/jean-baptiste-camembert-ner/versions/4 input_column_names: input_string label_column_name: ner_tags_str - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/token-classification/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/evaluation/translation/translation-pipeline.yml b/cli/foundation-models/system/evaluation/translation/translation-pipeline.yml index 1ddca81d27..bc6b34435a 100644 --- a/cli/foundation-models/system/evaluation/translation/translation-pipeline.yml +++ b/cli/foundation-models/system/evaluation/translation/translation-pipeline.yml @@ -28,7 +28,8 @@ jobs: path: azureml://registries/azureml/models/t5-base/versions/4 input_column_names: input_string label_column_name: ro - device: gpu + device: auto + compute_name: gpu-cluster-big evaluation_config: path: "../../../../../sdk/python/foundation-models/system/evaluation/translation/eval-config.json" type: uri_file diff --git a/cli/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.sh b/cli/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.sh new file mode 100644 index 0000000000..e121f839be --- /dev/null +++ b/cli/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-asr + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="openai-whisper-large" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="asr-$version" +job_name="asr-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS5_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/librispeech-dataset/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/automatic-speech-recognition/batch-deploy.yml b/cli/foundation-models/system/inference/automatic-speech-recognition/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/automatic-speech-recognition/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/fill-mask/batch-deploy.yml b/cli/foundation-models/system/inference/fill-mask/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/fill-mask/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/fill-mask/fill-mask-batch-endpoint.sh b/cli/foundation-models/system/inference/fill-mask/fill-mask-batch-endpoint.sh new file mode 100644 index 0000000000..217039be0c --- /dev/null +++ b/cli/foundation-models/system/inference/fill-mask/fill-mask-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-fill-mask + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="bert-base-uncased" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="fill-mask-$version" +job_name="fill-mask-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./batch/inputs" +python prepare-batch-dataset.py --model_name $model_name || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/fill-mask/prepare-batch-dataset.py b/cli/foundation-models/system/inference/fill-mask/prepare-batch-dataset.py new file mode 100644 index 0000000000..2131700967 --- /dev/null +++ b/cli/foundation-models/system/inference/fill-mask/prepare-batch-dataset.py @@ -0,0 +1,53 @@ +import os +import csv +import json +import random +import urllib +import argparse +import datasets +import pandas as pd + +# Get the model name from argument +parser = argparse.ArgumentParser() +parser.add_argument("--model_name", type=str, default="bert-base-uncased") +args = parser.parse_args() + +# Define directories and filenames as variables +dataset_dir = "dataset" +test_datafile = "test_100.csv" + +batch_dir = "batch" +batch_inputs_dir = os.path.join(batch_dir, "inputs") +batch_input_file = "batch_input.csv" +os.makedirs(dataset_dir, exist_ok=True) +os.makedirs(batch_dir, exist_ok=True) +os.makedirs(batch_inputs_dir, exist_ok=True) + +testdata = datasets.load_dataset("bookcorpus", split="train", streaming=True) + +test_df = pd.DataFrame(data=testdata.take(100)) + +# Get the right mask token from huggingface +with urllib.request.urlopen( + f"https://huggingface.co/api/models/{args.model_name}" +) as url: + data = json.load(url) + mask_token = data["mask_token"] + +# Take the value of the "text" column, replace a random word with the mask token, and save the result in the "masked_text" column +test_df["masked_text"] = test_df["text"].apply( + lambda x: x.replace(random.choice(x.split()), mask_token, 1) +) + +# Save the test_df dataframe to a csv file in the ./bookcorpus-dataset folder +test_df.to_csv(os.path.join(".", dataset_dir, test_datafile), index=False) + +batch_df = test_df[["masked_text"]].rename(columns={"masked_text": "input_string"}) + +# Divide this into files of 10 rows each +batch_size_per_predict = 10 +for i in range(0, len(batch_df), batch_size_per_predict): + j = i + batch_size_per_predict + batch_df[i:j].to_csv( + os.path.join(batch_inputs_dir, str(i) + batch_input_file), quoting=csv.QUOTE_ALL + ) diff --git a/cli/foundation-models/system/inference/question-answering/batch-deploy.yml b/cli/foundation-models/system/inference/question-answering/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/question-answering/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/question-answering/question-answering-batch-endpoint.sh b/cli/foundation-models/system/inference/question-answering/question-answering-batch-endpoint.sh new file mode 100644 index 0000000000..138210f520 --- /dev/null +++ b/cli/foundation-models/system/inference/question-answering/question-answering-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-question-answering + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="deepset-minilm-uncased-squad2" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="question-answering-$version" +job_name="question-answering-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/squad-dataset/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/summarization/batch-deploy.yml b/cli/foundation-models/system/inference/summarization/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/summarization/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/summarization/summarization-batch-endpoint.sh b/cli/foundation-models/system/inference/summarization/summarization-batch-endpoint.sh new file mode 100644 index 0000000000..b667341064 --- /dev/null +++ b/cli/foundation-models/system/inference/summarization/summarization-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-summarization + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="sshleifer-distilbart-cnn-12-6" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="summarization-$version" +job_name="summarization-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS5_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/news-dataset/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/text-classification/batch-deploy.yml b/cli/foundation-models/system/inference/text-classification/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/text-classification/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/text-classification/text-classification-batch-endpoint.sh b/cli/foundation-models/system/inference/text-classification/text-classification-batch-endpoint.sh new file mode 100644 index 0000000000..a1e31a8bb6 --- /dev/null +++ b/cli/foundation-models/system/inference/text-classification/text-classification-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-text-classification + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="microsoft-deberta-base-mnli" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="text-classification-$version" +job_name="text-classification-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/glue-mnli-dataset/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/text-generation/batch-deploy.yml b/cli/foundation-models/system/inference/text-generation/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/text-generation/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/text-generation/text-generation-batch-endpoint.sh b/cli/foundation-models/system/inference/text-generation/text-generation-batch-endpoint.sh new file mode 100644 index 0000000000..0d46a1c8ee --- /dev/null +++ b/cli/foundation-models/system/inference/text-generation/text-generation-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-text-generation + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="gpt2" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="text-generation-$version" +job_name="text-generation-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/bookcorpus-dataset/batch_generation/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/token-classification/batch-deploy.yml b/cli/foundation-models/system/inference/token-classification/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/token-classification/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/token-classification/token-classification-batch-endpoint.sh b/cli/foundation-models/system/inference/token-classification/token-classification-batch-endpoint.sh new file mode 100644 index 0000000000..c35b17412f --- /dev/null +++ b/cli/foundation-models/system/inference/token-classification/token-classification-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-token-classification + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="Jean-Baptiste-camembert-ner" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="token-classification-$version" +job_name="token-classification-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/Jean-Baptiste-wikiner_fr/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/foundation-models/system/inference/translation/batch-deploy.yml b/cli/foundation-models/system/inference/translation/batch-deploy.yml new file mode 100644 index 0000000000..2f66fbc630 --- /dev/null +++ b/cli/foundation-models/system/inference/translation/batch-deploy.yml @@ -0,0 +1,13 @@ +$schema: https://azuremlschemas.azureedge.net/latest/batchDeployment.schema.json +name: demo +compute: cpu-cluster +resources: + instance_count: 1 +error_threshold: 0 +logging_level: info +max_concurrency_per_instance: 2 +mini_batch_size: 10 +output_file_name: predictions.csv +retry_settings: + max_retries: 3 + timeout: 300 \ No newline at end of file diff --git a/cli/foundation-models/system/inference/translation/translation-batch-endpoint.sh b/cli/foundation-models/system/inference/translation/translation-batch-endpoint.sh new file mode 100644 index 0000000000..105cb829ca --- /dev/null +++ b/cli/foundation-models/system/inference/translation/translation-batch-endpoint.sh @@ -0,0 +1,96 @@ +set -x +# the commands in this file map to steps in this notebook: https://aka.ms/azureml-infer-batch-sdk-translation + +# script inputs +registry_name="azureml" +subscription_id="" +resource_group_name="" +workspace_name="" + +# This is the model from system registry that needs to be deployed +model_name="t5-small" + +# Validate the existence of the model in the registry and get the latest version +model_list=$(az ml model list --name ${model_name} --registry-name ${registry_name} 2>&1) +if [[ ${model_list} == *"[]"* ]]; then + echo "Model doesn't exist in registry. Check the model list and try again."; exit 1; +fi +version_temp=${model_list#*\"version\": \"} +model_version=${version_temp%%\"*} + +version=$(date +%s) +endpoint_name="translation-$version" +job_name="translation-job-$version" + +# todo: fetch compute_sku from the min_inference_sku tag of the model +compute_sku="Standard_DS3_v2" + +# 1. Setup pre-requisites +if [ "$subscription_id" = "" ] || \ + ["$resource_group_name" = "" ] || \ + [ "$workspace_name" = "" ]; then + echo "Please update the script with the subscription_id, resource_group_name and workspace_name" + exit 1 +fi + +az account set -s $subscription_id +workspace_info="--resource-group $resource_group_name --workspace-name $workspace_name" + +# 2. Check if the model exists in the registry +# need to confirm model show command works for registries outside the tenant (aka system registry) +if ! az ml model show --name $model_name --version $model_version --registry-name $registry_name +then + echo "Model $model_name:$model_version does not exist in registry $registry_name" + exit 1 +fi + +# Prepare the input data for the batch endpoint +inputs_dir="./input" +wget https://foundationmodelsamples.blob.core.windows.net/batch-inference-datasets/wmt16-de-en-dataset/batch/batch_input.csv -P $inputs_dir || { + echo "prepare batch inputs failed"; exit 1; +} + +# Create an AML compute for the batch deployment +az ml compute create --name cpu-cluster --type AmlCompute --min-instances 0 --max-instances 3 --size $compute_sku $workspace_info || { + echo "compute create failed"; exit 1; +} + +# 3. Deploy the model to an endpoint +# create batch endpoint +az ml batch-endpoint create --name $endpoint_name $workspace_info || { + echo "endpoint create failed"; exit 1; +} + +# deploy model from registry to endpoint in workspace +az ml batch-deployment create --file batch-deploy.yml --set-default $workspace_info --set \ + endpoint_name=$endpoint_name model=azureml://registries/$registry_name/models/$model_name/versions/$model_version || { + echo "deployment create failed"; exit 1; +} + +# 4. Invoke a job on the batch endpoint +invoke_output=$(az ml batch-endpoint invoke --name $endpoint_name --input $inputs_dir $workspace_info 2>&1) || { + echo "endpoint invoke failed"; exit 1; +} +invoke_temp=${invoke_output#*\"name\": \"} +job_name=${invoke_temp%%\"*} + +# 5. Stream the job logs +az ml job stream --name $job_name $workspace_info || { + echo "job stream-logs failed"; exit 1; +} + +# 6. Download the job output +az ml job download --name $job_name --download-path ./output $workspace_info || { + echo "job output download failed"; exit 1; +} + +# 5. Delete the endpoint +az ml batch-endpoint delete --name $endpoint_name $workspace_info --yes || { + echo "endpoint delete failed"; exit 1; +} + +# 6. Delete the compute cluster (Uncomment the below lines to delete the created cluster) +# az ml compute delete --name cpu-cluster $workspace_info --yes || { +# echo "compute delete failed"; exit 1; +# } + diff --git a/cli/jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/cli-automl-classification-task-bankmarketing-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/How to Run this AutoML Job with CLI (Forecasting).txt b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/How to Run this AutoML Job with CLI (Forecasting).txt new file mode 100644 index 0000000000..b7bfd74c46 --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/How to Run this AutoML Job with CLI (Forecasting).txt @@ -0,0 +1,9 @@ +How to Run this AutoML Job with CLI (Time-Series Forecasting) +=============================================================== + + +Run the AutoML CLI command pointing to the .YML file in this folder plus the Azure ML IDs needed: +---------------------------------------------------------------------------------------------------- + + +/> az ml job create --file ./hts_evaluation_pipeline.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION] diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/automl_settings_hts.yml b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/automl_settings_hts.yml new file mode 100644 index 0000000000..10f83eddb8 --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/automl_settings_hts.yml @@ -0,0 +1,18 @@ +debug_log: debug.txt +enable_early_stopping: true +forecast_horizon: 24 +forecast_step: 24 +hierarchy_column_names: +- group_id +- customer_id +hierarchy_training_level: customer_id +label_column_name: usage +max_trials: 25 +n_cross_validations: 3 +cv_step_size: 24 +primary_metric: normalized_root_mean_squared_error +task: forecasting +time_column_name: datetime +timeout_minutes: 60 +track_child_runs: false +trial_timeout_minutes: 5 diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline.yml b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline.yml new file mode 100644 index 0000000000..06319abd2a --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-hierarchical-timeseries/hts_evaluation_pipeline.yml @@ -0,0 +1,85 @@ +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json +type: pipeline + +description: HTS evaluation pipeline using AutoML + +display_name: hts-evaluation-pipeline +experiment_name: automl-hts-evaluation-pipeline + +settings: + default_compute: azureml:cpu-cluster + +inputs: + raw_data: + type: uri_folder + path: ../data/train + inference_data: + type: uri_folder + path: ../data/test + automl_config: + type: uri_file + path: automl_settings_hts.yml + max_concurrency_per_node: 2 + parallel_step_timeout_in_seconds: 3700 + max_nodes: 5 + forecast_level: "customer_id" + forecast_mode: "rolling" + forecast_step: 24 + compute_name: "cpu-cluster" + +outputs: + forecast_results: + type: uri_file + mode: upload + evaluation_results: + type: uri_folder + mode: upload + +jobs: + automl_hts_training: + type: command + component: azureml://registries/azureml/components/automl_hts_training + inputs: + raw_data: ${{parent.inputs.raw_data}} + automl_config: ${{parent.inputs.automl_config}} + max_nodes: ${{parent.inputs.max_nodes}} + max_concurrency_per_node: ${{parent.inputs.max_concurrency_per_node}} + parallel_step_timeout_in_seconds: ${{parent.inputs.parallel_step_timeout_in_seconds}} + compute_name: ${{parent.inputs.compute_name}} + outputs: + run_output: + type: uri_folder + + automl_hts_inference: + type: command + component: azureml://registries/azureml/components/automl_hts_inference + inputs: + raw_data: ${{parent.inputs.inference_data}} + forecast_level: ${{parent.inputs.forecast_level}} + max_concurrency_per_node: ${{parent.inputs.max_concurrency_per_node}} + parallel_step_timeout_in_seconds: ${{parent.inputs.parallel_step_timeout_in_seconds}} + forecast_mode: ${{parent.inputs.forecast_mode}} + forecast_step: ${{parent.inputs.forecast_step}} + max_nodes: ${{parent.inputs.max_nodes}} + optional_train_metadata: ${{parent.jobs.automl_hts_training.outputs.run_output}} + compute_name: ${{parent.inputs.compute_name}} + outputs: + run_output: + type: uri_folder + evaluation_configs: + type: uri_file + evaluation_data: + type: uri_file + path: ${{parent.outputs.forecast_results}} + + compute_metrics: + type: command + component: azureml://registries/azureml/components/compute_metrics/versions/0.0.10 + inputs: + task: "tabular-forecasting" + ground_truth: ${{parent.jobs.automl_hts_inference.outputs.evaluation_data}} + prediction: ${{parent.jobs.automl_hts_inference.outputs.evaluation_data}} + evaluation_config: ${{parent.jobs.automl_hts_inference.outputs.evaluation_configs}} + compute: ${{parent.inputs.compute_name}} + outputs: + evaluation_result: ${{parent.outputs.evaluation_results}} diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/How to Run this AutoML Job with CLI (Forecasting).txt b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/How to Run this AutoML Job with CLI (Forecasting).txt new file mode 100644 index 0000000000..f1e1a87047 --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/How to Run this AutoML Job with CLI (Forecasting).txt @@ -0,0 +1,9 @@ +How to Run this AutoML Job with CLI (Time-Series Forecasting) +=============================================================== + + +Run the AutoML CLI command pointing to the .YML file in this folder plus the Azure ML IDs needed: +---------------------------------------------------------------------------------------------------- + + +/> az ml job create --file ./many_models_evaluation_pipeline.yml --workspace-name [YOUR_AZURE_WORKSPACE] --resource-group [YOUR_AZURE_RESOURCE_GROUP] --subscription [YOUR_AZURE_SUBSCRIPTION] diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/automl_settings_many_models.yml b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/automl_settings_many_models.yml new file mode 100644 index 0000000000..7d20ce6b27 --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/automl_settings_many_models.yml @@ -0,0 +1,19 @@ +allow_multi_partitions: false +debug_log: debug.txt +enable_early_stopping: true +forecast_horizon: 24 +forecast_step: 24 +label_column_name: usage +max_trials: 25 +n_cross_validations: 3 +cv_step_size: 24 +partition_column_names: +- customer_id +primary_metric: normalized_root_mean_squared_error +task: forecasting +time_column_name: datetime +time_series_id_column_names: +- customer_id +timeout_minutes: 60 +track_child_runs: false +trial_timeout_minutes: 5 diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline.yml b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline.yml new file mode 100644 index 0000000000..5b7d4c225b --- /dev/null +++ b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/cli-automl-forecasting-demand-many-models/many_models_evaluation_pipeline.yml @@ -0,0 +1,85 @@ +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json +type: pipeline + +description: Many models evaluation pipeline using AutoML + +display_name: mm-evaluation-pipeline +experiment_name: automl-mm-evaluation-pipeline + +settings: + default_compute: azureml:cpu-cluster + +inputs: + raw_data: + type: uri_folder + path: ../data/train + inference_data: + type: uri_folder + path: ../data/test + automl_config: + type: uri_file + path: automl_settings_many_models.yml + max_concurrency_per_node: 2 + parallel_step_timeout_in_seconds: 3700 + max_nodes: 5 + retrain_failed_model: true + forecast_mode: "rolling" + forecast_step: 24 + compute_name: "cpu-cluster" + +outputs: + forecast_results: + type: uri_file + mode: upload + evaluation_results: + type: uri_folder + mode: upload + +jobs: + automl_mm_training: + type: command + component: azureml://registries/azureml/components/automl_many_models_training + inputs: + raw_data: ${{parent.inputs.raw_data}} + automl_config: ${{parent.inputs.automl_config}} + max_nodes: ${{parent.inputs.max_nodes}} + max_concurrency_per_node: ${{parent.inputs.max_concurrency_per_node}} + parallel_step_timeout_in_seconds: ${{parent.inputs.parallel_step_timeout_in_seconds}} + retrain_failed_model: ${{parent.inputs.retrain_failed_model}} + compute_name: ${{parent.inputs.compute_name}} + outputs: + run_output: + type: uri_folder + + automl_mm_inference: + type: command + component: azureml://registries/azureml/components/automl_many_models_inference + inputs: + raw_data: ${{parent.inputs.inference_data}} + max_concurrency_per_node: ${{parent.inputs.max_concurrency_per_node}} + parallel_step_timeout_in_seconds: ${{parent.inputs.parallel_step_timeout_in_seconds}} + forecast_mode: ${{parent.inputs.forecast_mode}} + forecast_step: ${{parent.inputs.forecast_step}} + max_nodes: ${{parent.inputs.max_nodes}} + optional_train_metadata: ${{parent.jobs.automl_mm_training.outputs.run_output}} + compute_name: ${{parent.inputs.compute_name}} + outputs: + run_output: + type: uri_folder + evaluation_configs: + type: uri_file + evaluation_data: + type: uri_file + path: ${{parent.outputs.forecast_results}} + + compute_metrics: + type: command + component: azureml://registries/azureml/components/compute_metrics/versions/0.0.10 + inputs: + task: "tabular-forecasting" + ground_truth: ${{parent.jobs.automl_mm_inference.outputs.evaluation_data}} + prediction: ${{parent.jobs.automl_mm_inference.outputs.evaluation_data}} + evaluation_config: ${{parent.jobs.automl_mm_inference.outputs.evaluation_configs}} + compute: ${{parent.inputs.compute_name}} + outputs: + evaluation_result: ${{parent.outputs.evaluation_results}} diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/inference/uci_electro_small_cli_inference.parquet b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/inference/uci_electro_small_cli_inference.parquet new file mode 100644 index 0000000000..6492c3f1c4 Binary files /dev/null and b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/inference/uci_electro_small_cli_inference.parquet differ diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/test/uci_electro_small_cli_test.parquet b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/test/uci_electro_small_cli_test.parquet new file mode 100644 index 0000000000..07743cd963 Binary files /dev/null and b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/test/uci_electro_small_cli_test.parquet differ diff --git a/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/train/uci_electro_small_cli_train.parquet b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/train/uci_electro_small_cli_train.parquet new file mode 100644 index 0000000000..364385b6e6 Binary files /dev/null and b/cli/jobs/pipelines/automl/cli-automl-forecasting-demand-with-pipeline-components/data/train/uci_electro_small_cli_train.parquet differ diff --git a/cli/jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/cli-automl-regression-housepricing-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/cli-automl-text-classification-multilabel-paper-categorization-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/cli-automl-text-classification-newsgroup-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/cli-automl-text-ner-conll-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/cli-automl-text-ner-conll-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/cli-automl-text-ner-conll-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/cli-automl-text-ner-conll-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/forecasting-energy-demand-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/forecasting-energy-demand-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/forecasting-energy-demand-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/forecasting-energy-demand-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/image-instance-segmentation-task-fridge-items-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/image-instance-segmentation-task-fridge-items-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/image-instance-segmentation-task-fridge-items-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/image-instance-segmentation-task-fridge-items-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/image-multiclass-classification-fridge-items-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/image-multiclass-classification-fridge-items-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/image-multiclass-classification-fridge-items-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/image-multiclass-classification-fridge-items-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/image-multilabel-classification-fridge-items-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/image-multilabel-classification-fridge-items-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/image-multilabel-classification-fridge-items-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/image-multilabel-classification-fridge-items-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/pipelines/automl/image-object-detection-task-fridge-items-pipeline/components/src/register.py b/cli/jobs/pipelines/automl/image-object-detection-task-fridge-items-pipeline/components/src/register.py index d473107a2d..b08dbba36d 100644 --- a/cli/jobs/pipelines/automl/image-object-detection-task-fridge-items-pipeline/components/src/register.py +++ b/cli/jobs/pipelines/automl/image-object-detection-task-fridge-items-pipeline/components/src/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/cli/jobs/single-step/julia/iris/src/iris.jl b/cli/jobs/single-step/julia/iris/src/iris.jl index 31923f7e58..7d56a6bae4 100644 --- a/cli/jobs/single-step/julia/iris/src/iris.jl +++ b/cli/jobs/single-step/julia/iris/src/iris.jl @@ -1,3 +1,5 @@ +using CSV +using DataFrames using Flux using Flux: logitcrossentropy, normalise, onecold, onehotbatch using Statistics: mean @@ -9,8 +11,11 @@ using Parameters: @with_kw end function get_processed_data(args) - labels = Flux.Data.Iris.labels() - features = Flux.Data.Iris.features() + data = CSV.read("iris_data.csv", DataFrame) + + # Extract labels and features from the DataFrame + features = Matrix{Float64}(data[1:end, 1:4])' + labels = Vector{String}(data[1:end, end]) # Subract mean, divide by std dev for normed mean of 0 and std dev of 1. normed_features = normalise(features, dims=2) diff --git a/cli/jobs/single-step/julia/iris/src/iris_data.csv b/cli/jobs/single-step/julia/iris/src/iris_data.csv new file mode 100644 index 0000000000..cbef540377 --- /dev/null +++ b/cli/jobs/single-step/julia/iris/src/iris_data.csv @@ -0,0 +1,151 @@ +sepal length (cm),sepal width (cm),petal length (cm),petal width (cm),labels +5.1,3.5,1.4,0.2,Iris-setosa +4.9,3.0,1.4,0.2,Iris-setosa +4.7,3.2,1.3,0.2,Iris-setosa +4.6,3.1,1.5,0.2,Iris-setosa +5.0,3.6,1.4,0.2,Iris-setosa +5.4,3.9,1.7,0.4,Iris-setosa +4.6,3.4,1.4,0.3,Iris-setosa +5.0,3.4,1.5,0.2,Iris-setosa +4.4,2.9,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.4,3.7,1.5,0.2,Iris-setosa +4.8,3.4,1.6,0.2,Iris-setosa +4.8,3.0,1.4,0.1,Iris-setosa +4.3,3.0,1.1,0.1,Iris-setosa +5.8,4.0,1.2,0.2,Iris-setosa +5.7,4.4,1.5,0.4,Iris-setosa +5.4,3.9,1.3,0.4,Iris-setosa +5.1,3.5,1.4,0.3,Iris-setosa +5.7,3.8,1.7,0.3,Iris-setosa +5.1,3.8,1.5,0.3,Iris-setosa +5.4,3.4,1.7,0.2,Iris-setosa +5.1,3.7,1.5,0.4,Iris-setosa +4.6,3.6,1.0,0.2,Iris-setosa +5.1,3.3,1.7,0.5,Iris-setosa +4.8,3.4,1.9,0.2,Iris-setosa +5.0,3.0,1.6,0.2,Iris-setosa +5.0,3.4,1.6,0.4,Iris-setosa +5.2,3.5,1.5,0.2,Iris-setosa +5.2,3.4,1.4,0.2,Iris-setosa +4.7,3.2,1.6,0.2,Iris-setosa +4.8,3.1,1.6,0.2,Iris-setosa +5.4,3.4,1.5,0.4,Iris-setosa +5.2,4.1,1.5,0.1,Iris-setosa +5.5,4.2,1.4,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +5.0,3.2,1.2,0.2,Iris-setosa +5.5,3.5,1.3,0.2,Iris-setosa +4.9,3.1,1.5,0.1,Iris-setosa +4.4,3.0,1.3,0.2,Iris-setosa +5.1,3.4,1.5,0.2,Iris-setosa +5.0,3.5,1.3,0.3,Iris-setosa +4.5,2.3,1.3,0.3,Iris-setosa +4.4,3.2,1.3,0.2,Iris-setosa +5.0,3.5,1.6,0.6,Iris-setosa +5.1,3.8,1.9,0.4,Iris-setosa +4.8,3.0,1.4,0.3,Iris-setosa +5.1,3.8,1.6,0.2,Iris-setosa +4.6,3.2,1.4,0.2,Iris-setosa +5.3,3.7,1.5,0.2,Iris-setosa +5.0,3.3,1.4,0.2,Iris-setosa +7.0,3.2,4.7,1.4,Iris-versicolor +6.4,3.2,4.5,1.5,Iris-versicolor +6.9,3.1,4.9,1.5,Iris-versicolor +5.5,2.3,4.0,1.3,Iris-versicolor +6.5,2.8,4.6,1.5,Iris-versicolor +5.7,2.8,4.5,1.3,Iris-versicolor +6.3,3.3,4.7,1.6,Iris-versicolor +4.9,2.4,3.3,1.0,Iris-versicolor +6.6,2.9,4.6,1.3,Iris-versicolor +5.2,2.7,3.9,1.4,Iris-versicolor +5.0,2.0,3.5,1.0,Iris-versicolor +5.9,3.0,4.2,1.5,Iris-versicolor +6.0,2.2,4.0,1.0,Iris-versicolor +6.1,2.9,4.7,1.4,Iris-versicolor +5.6,2.9,3.6,1.3,Iris-versicolor +6.7,3.1,4.4,1.4,Iris-versicolor +5.6,3.0,4.5,1.5,Iris-versicolor +5.8,2.7,4.1,1.0,Iris-versicolor +6.2,2.2,4.5,1.5,Iris-versicolor +5.6,2.5,3.9,1.1,Iris-versicolor +5.9,3.2,4.8,1.8,Iris-versicolor +6.1,2.8,4.0,1.3,Iris-versicolor +6.3,2.5,4.9,1.5,Iris-versicolor +6.1,2.8,4.7,1.2,Iris-versicolor +6.4,2.9,4.3,1.3,Iris-versicolor +6.6,3.0,4.4,1.4,Iris-versicolor +6.8,2.8,4.8,1.4,Iris-versicolor +6.7,3.0,5.0,1.7,Iris-versicolor +6.0,2.9,4.5,1.5,Iris-versicolor +5.7,2.6,3.5,1.0,Iris-versicolor +5.5,2.4,3.8,1.1,Iris-versicolor +5.5,2.4,3.7,1.0,Iris-versicolor +5.8,2.7,3.9,1.2,Iris-versicolor +6.0,2.7,5.1,1.6,Iris-versicolor +5.4,3.0,4.5,1.5,Iris-versicolor +6.0,3.4,4.5,1.6,Iris-versicolor +6.7,3.1,4.7,1.5,Iris-versicolor +6.3,2.3,4.4,1.3,Iris-versicolor +5.6,3.0,4.1,1.3,Iris-versicolor +5.5,2.5,4.0,1.3,Iris-versicolor +5.5,2.6,4.4,1.2,Iris-versicolor +6.1,3.0,4.6,1.4,Iris-versicolor +5.8,2.6,4.0,1.2,Iris-versicolor +5.0,2.3,3.3,1.0,Iris-versicolor +5.6,2.7,4.2,1.3,Iris-versicolor +5.7,3.0,4.2,1.2,Iris-versicolor +5.7,2.9,4.2,1.3,Iris-versicolor +6.2,2.9,4.3,1.3,Iris-versicolor +5.1,2.5,3.0,1.1,Iris-versicolor +5.7,2.8,4.1,1.3,Iris-versicolor +6.3,3.3,6.0,2.5,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +7.1,3.0,5.9,2.1,Iris-virginica +6.3,2.9,5.6,1.8,Iris-virginica +6.5,3.0,5.8,2.2,Iris-virginica +7.6,3.0,6.6,2.1,Iris-virginica +4.9,2.5,4.5,1.7,Iris-virginica +7.3,2.9,6.3,1.8,Iris-virginica +6.7,2.5,5.8,1.8,Iris-virginica +7.2,3.6,6.1,2.5,Iris-virginica +6.5,3.2,5.1,2.0,Iris-virginica +6.4,2.7,5.3,1.9,Iris-virginica +6.8,3.0,5.5,2.1,Iris-virginica +5.7,2.5,5.0,2.0,Iris-virginica +5.8,2.8,5.1,2.4,Iris-virginica +6.4,3.2,5.3,2.3,Iris-virginica +6.5,3.0,5.5,1.8,Iris-virginica +7.7,3.8,6.7,2.2,Iris-virginica +7.7,2.6,6.9,2.3,Iris-virginica +6.0,2.2,5.0,1.5,Iris-virginica +6.9,3.2,5.7,2.3,Iris-virginica +5.6,2.8,4.9,2.0,Iris-virginica +7.7,2.8,6.7,2.0,Iris-virginica +6.3,2.7,4.9,1.8,Iris-virginica +6.7,3.3,5.7,2.1,Iris-virginica +7.2,3.2,6.0,1.8,Iris-virginica +6.2,2.8,4.8,1.8,Iris-virginica +6.1,3.0,4.9,1.8,Iris-virginica +6.4,2.8,5.6,2.1,Iris-virginica +7.2,3.0,5.8,1.6,Iris-virginica +7.4,2.8,6.1,1.9,Iris-virginica +7.9,3.8,6.4,2.0,Iris-virginica +6.4,2.8,5.6,2.2,Iris-virginica +6.3,2.8,5.1,1.5,Iris-virginica +6.1,2.6,5.6,1.4,Iris-virginica +7.7,3.0,6.1,2.3,Iris-virginica +6.3,3.4,5.6,2.4,Iris-virginica +6.4,3.1,5.5,1.8,Iris-virginica +6.0,3.0,4.8,1.8,Iris-virginica +6.9,3.1,5.4,2.1,Iris-virginica +6.7,3.1,5.6,2.4,Iris-virginica +6.9,3.1,5.1,2.3,Iris-virginica +5.8,2.7,5.1,1.9,Iris-virginica +6.8,3.2,5.9,2.3,Iris-virginica +6.7,3.3,5.7,2.5,Iris-virginica +6.7,3.0,5.2,2.3,Iris-virginica +6.3,2.5,5.0,1.9,Iris-virginica +6.5,3.0,5.2,2.0,Iris-virginica +6.2,3.4,5.4,2.3,Iris-virginica +5.9,3.0,5.1,1.8,Iris-virginica diff --git a/cli/jobs/single-step/julia/iris/src/run.jl b/cli/jobs/single-step/julia/iris/src/run.jl index 4ed6e6b5fb..3e336b96fb 100644 --- a/cli/jobs/single-step/julia/iris/src/run.jl +++ b/cli/jobs/single-step/julia/iris/src/run.jl @@ -1 +1 @@ -using Pkg; Pkg.activate("."); Pkg.instantiate(); include("iris.jl") \ No newline at end of file +using Pkg; Pkg.activate("."); Pkg.instantiate(); Pkg.add("CSV"); Pkg.add("DataFrames"); include("iris.jl") \ No newline at end of file diff --git a/cli/jobs/spark/attached-spark-pipeline-default-identity.yaml b/cli/jobs/spark/attached-spark-pipeline-default-identity.yml similarity index 76% rename from cli/jobs/spark/attached-spark-pipeline-default-identity.yaml rename to cli/jobs/spark/attached-spark-pipeline-default-identity.yml index 03a8d10c6d..7105321221 100644 --- a/cli/jobs/spark/attached-spark-pipeline-default-identity.yaml +++ b/cli/jobs/spark/attached-spark-pipeline-default-identity.yml @@ -1,5 +1,5 @@ # attached-spark-pipeline-default-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-3 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file @@ -20,4 +20,4 @@ jobs: path: azureml://datastores/workspaceblobstore/paths/data/wrangled/ mode: direct - compute: mysparkcompute + compute: diff --git a/cli/jobs/spark/attached-spark-pipeline-managed-identity.yaml b/cli/jobs/spark/attached-spark-pipeline-managed-identity.yml similarity index 77% rename from cli/jobs/spark/attached-spark-pipeline-managed-identity.yaml rename to cli/jobs/spark/attached-spark-pipeline-managed-identity.yml index 01958ec7f9..0d9a9a658d 100644 --- a/cli/jobs/spark/attached-spark-pipeline-managed-identity.yaml +++ b/cli/jobs/spark/attached-spark-pipeline-managed-identity.yml @@ -1,5 +1,5 @@ # attached-spark-pipeline-managed-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-1 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file @@ -23,4 +23,4 @@ jobs: identity: type: managed - compute: mysparkcompute + compute: diff --git a/cli/jobs/spark/attached-spark-pipeline-user-identity.yaml b/cli/jobs/spark/attached-spark-pipeline-user-identity.yml similarity index 77% rename from cli/jobs/spark/attached-spark-pipeline-user-identity.yaml rename to cli/jobs/spark/attached-spark-pipeline-user-identity.yml index 673123b600..9e248b0c69 100644 --- a/cli/jobs/spark/attached-spark-pipeline-user-identity.yaml +++ b/cli/jobs/spark/attached-spark-pipeline-user-identity.yml @@ -1,5 +1,5 @@ # attached-spark-pipeline-user-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-2 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file @@ -23,4 +23,4 @@ jobs: identity: type: user_identity - compute: mysparkcompute + compute: diff --git a/cli/jobs/spark/attached-spark-standalone-default-identity.yaml b/cli/jobs/spark/attached-spark-standalone-default-identity.yml similarity index 84% rename from cli/jobs/spark/attached-spark-standalone-default-identity.yaml rename to cli/jobs/spark/attached-spark-standalone-default-identity.yml index f672bb447b..b437e7c8ec 100644 --- a/cli/jobs/spark/attached-spark-standalone-default-identity.yaml +++ b/cli/jobs/spark/attached-spark-standalone-default-identity.yml @@ -1,5 +1,5 @@ # attached-spark-standalone-default-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src @@ -29,4 +29,4 @@ args: >- --titanic_data ${{inputs.titanic_data}} --wrangled_data ${{outputs.wrangled_data}} -compute: yuachengcompute \ No newline at end of file +compute: \ No newline at end of file diff --git a/cli/jobs/spark/attached-spark-standalone-managed-identity.yaml b/cli/jobs/spark/attached-spark-standalone-managed-identity.yml similarity index 85% rename from cli/jobs/spark/attached-spark-standalone-managed-identity.yaml rename to cli/jobs/spark/attached-spark-standalone-managed-identity.yml index c2c57a3627..9db0804399 100644 --- a/cli/jobs/spark/attached-spark-standalone-managed-identity.yaml +++ b/cli/jobs/spark/attached-spark-standalone-managed-identity.yml @@ -1,5 +1,5 @@ # attached-spark-standalone-managed-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src @@ -32,4 +32,4 @@ args: >- identity: type: managed -compute: mysparkcompute \ No newline at end of file +compute: \ No newline at end of file diff --git a/cli/jobs/spark/attached-spark-standalone-user-identity.yaml b/cli/jobs/spark/attached-spark-standalone-user-identity.yml similarity index 85% rename from cli/jobs/spark/attached-spark-standalone-user-identity.yaml rename to cli/jobs/spark/attached-spark-standalone-user-identity.yml index b35d9b135d..68e35c2def 100644 --- a/cli/jobs/spark/attached-spark-standalone-user-identity.yaml +++ b/cli/jobs/spark/attached-spark-standalone-user-identity.yml @@ -1,5 +1,5 @@ # attached-spark-standalone-user-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src @@ -32,4 +32,4 @@ args: >- identity: type: user_identity -compute: mysparkcompute \ No newline at end of file +compute: \ No newline at end of file diff --git a/cli/jobs/spark/serverless-spark-pipeline-default-identity.yaml b/cli/jobs/spark/serverless-spark-pipeline-default-identity.yml similarity index 83% rename from cli/jobs/spark/serverless-spark-pipeline-default-identity.yaml rename to cli/jobs/spark/serverless-spark-pipeline-default-identity.yml index 89bd887e8f..a334b5d824 100644 --- a/cli/jobs/spark/serverless-spark-pipeline-default-identity.yaml +++ b/cli/jobs/spark/serverless-spark-pipeline-default-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-pipeline-default-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-6 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file diff --git a/cli/jobs/spark/serverless-spark-pipeline-managed-identity.yaml b/cli/jobs/spark/serverless-spark-pipeline-managed-identity.yml similarity index 84% rename from cli/jobs/spark/serverless-spark-pipeline-managed-identity.yaml rename to cli/jobs/spark/serverless-spark-pipeline-managed-identity.yml index 4807083944..225d51ffc9 100644 --- a/cli/jobs/spark/serverless-spark-pipeline-managed-identity.yaml +++ b/cli/jobs/spark/serverless-spark-pipeline-managed-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-pipeline-managed-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-4 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file diff --git a/cli/jobs/spark/serverless-spark-pipeline-user-identity.yaml b/cli/jobs/spark/serverless-spark-pipeline-user-identity.yml similarity index 84% rename from cli/jobs/spark/serverless-spark-pipeline-user-identity.yaml rename to cli/jobs/spark/serverless-spark-pipeline-user-identity.yml index 585dacfad9..9c1dcd6ea8 100644 --- a/cli/jobs/spark/serverless-spark-pipeline-user-identity.yaml +++ b/cli/jobs/spark/serverless-spark-pipeline-user-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-pipeline-user-identity.yaml -$schema: http://azureml/sdk-2-0/PipelineJob.json +$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json type: pipeline display_name: Titanic-Spark-CLI-Pipeline-5 description: Spark component for Titanic data in Pipeline @@ -7,7 +7,7 @@ description: Spark component for Titanic data in Pipeline jobs: spark_job: type: spark - component: ./spark-job-component.yaml + component: ./spark-job-component.yml inputs: titanic_data: type: uri_file diff --git a/cli/jobs/spark/serverless-spark-standalone-default-identity.yaml b/cli/jobs/spark/serverless-spark-standalone-default-identity.yml similarity index 90% rename from cli/jobs/spark/serverless-spark-standalone-default-identity.yaml rename to cli/jobs/spark/serverless-spark-standalone-default-identity.yml index 98fb3cc637..5f6683b1cf 100644 --- a/cli/jobs/spark/serverless-spark-standalone-default-identity.yaml +++ b/cli/jobs/spark/serverless-spark-standalone-default-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-standalone-default-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src diff --git a/cli/jobs/spark/serverless-spark-standalone-managed-identity.yaml b/cli/jobs/spark/serverless-spark-standalone-managed-identity.yml similarity index 90% rename from cli/jobs/spark/serverless-spark-standalone-managed-identity.yaml rename to cli/jobs/spark/serverless-spark-standalone-managed-identity.yml index 4f9fddfdd4..f84f841a3b 100644 --- a/cli/jobs/spark/serverless-spark-standalone-managed-identity.yaml +++ b/cli/jobs/spark/serverless-spark-standalone-managed-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-standalone-managed-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src diff --git a/cli/jobs/spark/serverless-spark-standalone-user-identity.yaml b/cli/jobs/spark/serverless-spark-standalone-user-identity.yml similarity index 90% rename from cli/jobs/spark/serverless-spark-standalone-user-identity.yaml rename to cli/jobs/spark/serverless-spark-standalone-user-identity.yml index bd58971e51..a4d448d2d6 100644 --- a/cli/jobs/spark/serverless-spark-standalone-user-identity.yaml +++ b/cli/jobs/spark/serverless-spark-standalone-user-identity.yml @@ -1,5 +1,5 @@ # serverless-spark-standalone-user-identity.yaml -$schema: http://azureml/sdk-2-0/SparkJob.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkJob.schema.json type: spark code: ./src diff --git a/cli/jobs/spark/setup-attached-resources.sh b/cli/jobs/spark/setup-attached-resources.sh new file mode 100644 index 0000000000..9be90a487b --- /dev/null +++ b/cli/jobs/spark/setup-attached-resources.sh @@ -0,0 +1,60 @@ +# +SUBSCRIPTION_ID=$(az account show --query id -o tsv) +LOCATION=$(az ml workspace show --query location -o tsv) +RESOURCE_GROUP=$(az group show --query name -o tsv) +AML_WORKSPACE_NAME=$(az configure -l --query "[?name=='workspace'].value" -o tsv) +API_VERSION="2022-05-01" +TOKEN=$(az account get-access-token --query accessToken -o tsv) + +GEN2_STORAGE_NAME=${RESOURCE_GROUP}gen2 +GEN2_FILE_SYSTEM=${RESOURCE_GROUP}file +SYNAPSE_WORKSPACE_NAME=${AML_WORKSPACE_NAME}-syws +SQL_ADMIN_LOGIN_USER="automation" +SQL_ADMIN_LOGIN_PASSWORD="auto123!" +SPARK_POOL_NAME="automationpool" +SPARK_POOL_ADMIN_ROLE_ID="6e4bf58a-b8e1-4cc3-bbf9-d73143322b78" +ATTACHED_COMPUTE_NAME="mysparkcompute" +# + +# +AML_USER_MANAGED_ID=${RESOURCE_GROUP}-uai +az identity create --name $AML_USER_MANAGED_ID --resource-group $RESOURCE_GROUP --location $LOCATION +AML_USER_MANAGED_ID_OID=$(az identity show --resource-group $RESOURCE_GROUP -n $AML_USER_MANAGED_ID --query principalId -o tsv) +# + +# +az storage account create --name $GEN2_STORAGE_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true +az storage fs create -n $GEN2_FILE_SYSTEM --account-name $GEN2_STORAGE_NAME +az synapse workspace create --name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --storage-account $GEN2_STORAGE_NAME --file-system $GEN2_FILE_SYSTEM --sql-admin-login-user $SQL_ADMIN_LOGIN_USER --sql-admin-login-password $SQL_ADMIN_LOGIN_PASSWORD --location $LOCATION +az role assignment create --role "Storage Blob Data Owner" --assignee $AML_USER_MANAGED_ID_OID --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$GEN2_STORAGE_NAME/blobServices/default/containers/$GEN2_FILE_SYSTEM +az synapse spark pool create --name $SPARK_POOL_NAME --workspace-name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --spark-version 3.2 --node-count 3 --node-size Medium --min-node-count 3 --max-node-count 10 --enable-auto-scale true +az synapse workspace firewall-rule create --name allowAll --workspace-name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255 + +if [[ "$2" == *"managed-identity"* ]] +then + ATTACHED_COMPUTE_NAME=${ATTACHED_COMPUTE_NAME}mi +elif [[ "$2" == *"user-identity"* ]] +then + ATTACHED_COMPUTE_NAME=${ATTACHED_COMPUTE_NAME}ui +fi + +sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$SYNAPSE_WORKSPACE_NAME/g; + s//$SPARK_POOL_NAME/g; + s//$AML_USER_MANAGED_ID/g; + s//$ATTACHED_COMPUTE_NAME/g;" $1 + +sed -i "s//$ATTACHED_COMPUTE_NAME/g;" $2 + +az ml compute attach --file $1 --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --workspace-name $AML_WORKSPACE_NAME +az synapse role assignment create --workspace-name $SYNAPSE_WORKSPACE_NAME --role $SPARK_POOL_ADMIN_ROLE_ID --assignee $AML_USER_MANAGED_ID_OID + +COMPUTE_MANAGED_IDENTITY=$(az ml compute show --name $ATTACHED_COMPUTE_NAME --resource-group $RESOURCE_GROUP --workspace-name $AML_WORKSPACE_NAME --query identity.principal_id --out tsv) + +if [[ ! -z "$COMPUTE_MANAGED_IDENTITY" ]] +then + az synapse role assignment create --workspace-name $SYNAPSE_WORKSPACE_NAME --role $SPARK_POOL_ADMIN_ROLE_ID --assignee $COMPUTE_MANAGED_IDENTITY +fi + +# \ No newline at end of file diff --git a/cli/jobs/spark/setup-identities.sh b/cli/jobs/spark/setup-identities.sh new file mode 100644 index 0000000000..782ee671e7 --- /dev/null +++ b/cli/jobs/spark/setup-identities.sh @@ -0,0 +1,24 @@ +# +SUBSCRIPTION_ID=$(az account show --query id -o tsv) +LOCATION=$(az ml workspace show --query location -o tsv) +RESOURCE_GROUP=$(az group show --query name -o tsv) +AML_WORKSPACE_NAME=$(az configure -l --query "[?name=='workspace'].value" -o tsv) +API_VERSION="2022-05-01" +TOKEN=$(az account get-access-token --query accessToken -o tsv) + +AML_USER_MANAGED_ID=${RESOURCE_GROUP}-uai +# + +# +az identity create --name $AML_USER_MANAGED_ID --resource-group $RESOURCE_GROUP --location $LOCATION +# + +TEMP_UAI_FILE="temp-user-assigned-identity.yml" +cp user-assigned-identity.yml $TEMP_UAI_FILE +sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_USER_MANAGED_ID/g;" $TEMP_UAI_FILE + +# +az ml workspace update --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --name $AML_WORKSPACE_NAME --file $TEMP_UAI_FILE +# \ No newline at end of file diff --git a/cli/jobs/spark/spark-job-component.yaml b/cli/jobs/spark/spark-job-component.yml similarity index 89% rename from cli/jobs/spark/spark-job-component.yaml rename to cli/jobs/spark/spark-job-component.yml index d7908e08c3..3dbee239f9 100644 --- a/cli/jobs/spark/spark-job-component.yaml +++ b/cli/jobs/spark/spark-job-component.yml @@ -1,5 +1,5 @@ # spark-job-component.yaml -$schema: http://azureml/sdk-2-0/SparkComponent.json +$schema: https://azuremlschemas.azureedge.net/latest/sparkComponent.schema.json name: titanic_spark_component type: spark version: 1 diff --git a/cli/jobs/spark/storage_pe.yaml b/cli/jobs/spark/storage_pe.yml similarity index 100% rename from cli/jobs/spark/storage_pe.yaml rename to cli/jobs/spark/storage_pe.yml diff --git a/cli/jobs/spark/user-assigned-identity.yaml b/cli/jobs/spark/user-assigned-identity.yaml deleted file mode 100644 index 6c21e7dc09..0000000000 --- a/cli/jobs/spark/user-assigned-identity.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# user-assigned-identity.yaml -identity: - type: "system_assigned,user_assigned" - user_assigned_identities: - - resource_id: /subscriptions//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ - tenant_id: 00x000xx-00x0-00xx-00xx-0x0xx000xx00 - \ No newline at end of file diff --git a/cli/jobs/spark/user-assigned-identity.yml b/cli/jobs/spark/user-assigned-identity.yml new file mode 100644 index 0000000000..02b41187d5 --- /dev/null +++ b/cli/jobs/spark/user-assigned-identity.yml @@ -0,0 +1,6 @@ +# user-assigned-identity.yaml +identity: + type: "system_assigned,user_assigned" + user_assigned_identities: + "/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/" : {} + \ No newline at end of file diff --git a/cli/monitoring/README.md b/cli/monitoring/README.md new file mode 100644 index 0000000000..849709689d --- /dev/null +++ b/cli/monitoring/README.md @@ -0,0 +1,29 @@ +# AzureML Model Monitoring + +AzureML model monitoring enables you to track the performance of your model from a data science perspective in production. This directory contains samples for different scenarios you may encounter when trying to monitor your models. Comprehensive documentation on model monitoring can be found [here](https://learn.microsoft.com/en-us/azure/machine-learning/concept-model-monitoring?view=azureml-api-2). + +## Scenario coverage + +### 1. Deploy model with AzureML online endpoints; out-of-box configuration + +In this scenario, you have deployed your model to AzureML online endpoints (managed or kubernetes). You have enabled production inference data collection (documentation for it can be found [here](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-collect-production-data?view=azureml-api-2&tabs=azure-cli)) for your deployment. With the `out-of-box-monitoring.yaml`, you can create a model monitor with the default signals (data drift, prediction drift, data quality), metrics, and thresholds - all of which can be adjusted later. + +Schedule your model monitor with this command: `az ml schedule create -f out-of-box-monitoring.yaml` + +### 2. Deploy model with AzureML online endpoints; advanced configuration with feature importance + +In this scenario, you have deployed your model to AzureML online endpoints (managed or kubernetes). You have enabled production inference data collection (documentation for it can be found [here](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-collect-production-data?view=azureml-api-2&tabs=azure-cli)) for your deployment. With the `advanced-monitoring.yaml`, you can create a model monitor with configurable signals, metrics, and thresholds. The provided sample also determines the most important features and only computes the metrics for those features. + +Schedule your model monitor with this command: `az ml schedule create -f advanced-with-feature-importance-monitoring.yaml` + +### 3. Deploy model with AzureML batch endpoints, AKS, or outside of AzureML + +In this scenario, you can bring your own data to use as input to your monitoring job. When you bring your own production data, you need to provide a custom preprocessing component to get the data into MLTable format for the monitoring job to use. An example custom preprocessing component can be found in the `components/custom_preprocessing` directory. You will need to register your custom preprocessing component. From that directory, you can use the command `az ml component create -f spec.yaml --subscription --workspace --resource-group ` to register the component. Then, you can schedule your monitoring job (found in the main `monitoring/` directory) with the following command: `az ml schedule create -f custom_monitoring.yaml --subscription --workspace --resource-group `. + +**Note**: The `custom-monitoring.yaml` configuration file is configured to use both custom preprocessing component and a custom monitoring signal. If you only want to use a custom preprocessing component to bring your own data, then format the configuration file with the included signals in the documentation. + +### 4. Create your own custom monitoring signal + +In this scenario, you can create your own custom monitoring signal. The custom signal component can be found in the `components/custom_signal/` directory. You will need to register your custom signal component. From that directory, you can use the command `az ml component create -f spec.yaml --subscription --workspace --resource-group ` to register the component. Then, you can schedule your monitoring job (found in the main `monitoring/` directory) with the following command: `az ml schedule create -f custom_monitoring.yaml --subscription --workspace --resource-group `. + +**Note**: The `custom-monitoring.yaml` configuration file is configured to use both custom preprocessing component and a custom monitoring signal. If you only want to use a custom signal, you can remove the custom preprocessing component line. \ No newline at end of file diff --git a/cli/monitoring/advanced-monitoring.yaml b/cli/monitoring/advanced-monitoring.yaml new file mode 100644 index 0000000000..e35203e332 --- /dev/null +++ b/cli/monitoring/advanced-monitoring.yaml @@ -0,0 +1,82 @@ +$schema: http://azureml/sdk-2-0/Schedule.json +name: fraud_detection_model_monitoring +display_name: Fraud detection model monitoring +description: Fraud detection model monitoring with advanced configurations + +trigger: + # perform model monitoring activity daily at 3:15am + type: recurrence + frequency: day #can be minute, hour, day, week, month + interval: 1 # #every day + schedule: + hours: 3 # at 3am + minutes: 15 # at 15 mins after 3am + +create_monitor: + compute: + instance_type: standard_e4s_v3 + runtime_version: 3.2 + monitoring_target: + endpoint_deployment_id: azureml:fraud-detection-endpoint:fraud-detection-deployment + + monitoring_signals: + advanced_data_drift: # monitoring signal name, any user defined name works + type: data_drift + # target_dataset is optional. By default target dataset is the production inference data associated with Azure Machine Learning online endpoint + baseline_dataset: + input_dataset: + path: azureml:my_model_training_data:1 # use training data as comparison baseline + type: mltable + dataset_context: training + target_column_name: fraud_detected + features: + top_n_feature_importance: 20 # monitor drift for top 20 features + metric_thresholds: + - applicable_feature_type: numerical + metric_name: jensen_shannon_distance + threshold: 0.01 + - applicable_feature_type: categorical + metric_name: pearsons_chi_squared_test + threshold: 0.02 + advanced_data_quality: + type: data_quality + # target_dataset is optional. By default target dataset is the production inference data associated with Azure Machine Learning online depoint + baseline_dataset: + input_dataset: + path: azureml:my_model_training_data:1 + type: mltable + dataset_context: training + features: # monitor data quality for 3 individual features only + - feature_A + - feature_B + - feature_C + metric_thresholds: + - applicable_feature_type: numerical + metric_name: null_value_rate + # use default threshold from training data baseline + - applicable_feature_type: categorical + metric_name: out_of_bounds_rate + # use default threshold from training data baseline + feature_attribution_drift_signal: + type: feature_attribution_drift + target_dataset: + dataset: + input_dataset: + path: azureml:my_model_production_data:1 + type: uri_folder + dataset_context: model_inputs_outputs + baseline_dataset: + input_dataset: + path: azureml:my_model_training_data:1 + type: mltable + dataset_context: training + target_column_name: fraud_detected + model_type: classification + # if no metric_thresholds defined, use the default metric_thresholds + metric_thresholds: + threshold: 0.9 + + alert_notification: + emails: + - abc@example.com + - def@example.com \ No newline at end of file diff --git a/cli/monitoring/components/custom_preprocessing/spec.yaml b/cli/monitoring/components/custom_preprocessing/spec.yaml new file mode 100644 index 0000000000..32b5baf228 --- /dev/null +++ b/cli/monitoring/components/custom_preprocessing/spec.yaml @@ -0,0 +1,53 @@ +$schema: http://azureml/sdk-2-0/SparkComponent.json +type: spark + +name: custom_preprocessor +display_name: My Custom Preprocessor +description: Filters the data based on the window provided. +version: 1.0.0 +is_deterministic: true + +code: ./src +entry: + file: ./run.py + +inputs: + data_window_end: + type: string + data_window_start: + type: string + input_data: + type: uri_folder + mode: direct +outputs: + preprocessed_input_data: + type: mltable + mode: direct +conf: + spark.driver.cores: 1 + spark.driver.memory: 2g + spark.executor.cores: 2 + spark.executor.memory: 2g + spark.executor.instances: 1 + spark.dynamicAllocation.enabled: True + spark.dynamicAllocation.minExecutors: 1 + spark.dynamicAllocation.maxExecutors: 4 + spark.synapse.library.python.env: | + channels: + - conda-forge + dependencies: + - python=3.8 + - pip: + - scipy~=1.10.0 + - numpy~=1.21.0 + - pandas~=1.4.3 + - azureml-mlflow~=1.49.0 + - mltable~=1.3.0 + - azureml-fsspec + - fsspec~=2023.4.0 + name: momo-base-spark +args: >- + --data_window_end ${{inputs.data_window_end}} + --data_window_start ${{inputs.data_window_start}} + --input_data ${{inputs.input_data}} + --preprocessed_input_data ${{outputs.preprocessed_input_data}} diff --git a/cli/monitoring/components/custom_preprocessing/src/run.py b/cli/monitoring/components/custom_preprocessing/src/run.py new file mode 100644 index 0000000000..4e3e125302 --- /dev/null +++ b/cli/monitoring/components/custom_preprocessing/src/run.py @@ -0,0 +1,139 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Entry script for Model Data Collector Data Window Component.""" + +import argparse +import pandas as pd +import mltable +import tempfile +from azureml.fsspec import AzureMachineLearningFileSystem +from datetime import datetime +from dateutil import parser +from pyspark.sql import SparkSession + + +def init_spark(): + """Get or create spark session.""" + spark = SparkSession.builder.appName("AccessParquetFiles").getOrCreate() + return spark + + +def read_mltable_in_spark(mltable_path: str): + """Read mltable in spark.""" + spark = init_spark() + df = spark.read.mltable(mltable_path) + return df + + +def save_spark_df_as_mltable(metrics_df, folder_path: str): + """Save spark dataframe as mltable.""" + metrics_df.write.option("output_format", "parquet").option( + "overwrite", True + ).mltable(folder_path) + + +def preprocess( + data_window_start: str, + data_window_end: str, + input_data: str, + preprocessed_input_data: str, +): + """Extract data based on window size provided and preprocess it into MLTable. + + Args: + production_data: The data asset on which the date filter is applied. + monitor_current_time: The current time of the window (inclusive). + window_size_in_days: Number of days from current time to start time window (exclusive). + preprocessed_data: The mltable path pointing to location where the outputted mltable will be written to. + """ + format_data = "%Y-%m-%d %H:%M:%S" + start_datetime = parser.parse(data_window_start) + start_datetime = datetime.strptime( + str(start_datetime.strftime(format_data)), format_data + ) + + # TODO Validate window size + end_datetime = parser.parse(data_window_end) + end_datetime = datetime.strptime( + str(end_datetime.strftime(format_data)), format_data + ) + + # Create mltable, create column with partitionFormat + # Extract partition format + table = mltable.from_json_lines_files( + paths=[{"pattern": f"{input_data}**/*.jsonl"}] + ) + # Uppercase HH for hour info + partitionFormat = "{PartitionDate:yyyy/MM/dd/HH}/{fileName}.jsonl" + table = table.extract_columns_from_partition_format(partitionFormat) + + # Filter on partitionFormat based on user data window + filterStr = f"PartitionDate >= datetime({start_datetime.year}, {start_datetime.month}, {start_datetime.day}, {start_datetime.hour}) and PartitionDate <= datetime({end_datetime.year}, {end_datetime.month}, {end_datetime.day}, {end_datetime.hour})" # noqa + table = table.filter(filterStr) + + # Data column is a list of objects, convert it into string because spark.read_json cannot read object + table = table.convert_column_types({"data": mltable.DataType.to_string()}) + + # Create MLTable in different location + save_path = tempfile.mktemp() + table.save(save_path) + + # Save preprocessed_data MLTable to temp location + des_path = preprocessed_input_data + "temp" + fs = AzureMachineLearningFileSystem(des_path) + print("MLTable path:", des_path) + # TODO: Evaluate if we need to overwrite + fs.upload( + lpath=save_path, + rpath="", + **{"overwrite": "MERGE_WITH_OVERWRITE"}, + recursive=True, + ) + + # Read mltable from preprocessed_data + df = read_mltable_in_spark(mltable_path=des_path) + + if df.count() == 0: + raise Exception( + "The window for this current run contains no data. " + + "Please visit aka.ms/mlmonitoringhelp for more information." + ) + + # Output MLTable + first_data_row = df.select("data").rdd.map(lambda x: x).first() + + spark = init_spark() + data_as_df = spark.createDataFrame(pd.read_json(first_data_row["data"])) + + def tranform_df_function(iterator): + for df in iterator: + yield pd.concat(pd.read_json(entry) for entry in df["data"]) + + transformed_df = df.select("data").mapInPandas( + tranform_df_function, schema=data_as_df.schema + ) + + save_spark_df_as_mltable(transformed_df, preprocessed_input_data) + + +def run(): + """Compute data window and preprocess data from MDC.""" + # Parse arguments + parser = argparse.ArgumentParser() + parser.add_argument("--data_window_start", type=str) + parser.add_argument("--data_window_end", type=str) + parser.add_argument("--input_data", type=str) + parser.add_argument("--preprocessed_input_data", type=str) + args = parser.parse_args() + + preprocess( + args.data_window_start, + args.data_window_end, + args.input_data, + args.preprocessed_input_data, + ) + + +if __name__ == "__main__": + run() diff --git a/cli/monitoring/components/custom_signal/spec.yaml b/cli/monitoring/components/custom_signal/spec.yaml new file mode 100644 index 0000000000..f0e17b5653 --- /dev/null +++ b/cli/monitoring/components/custom_signal/spec.yaml @@ -0,0 +1,58 @@ +$schema: http://azureml/sdk-2-0/SparkComponent.json +type: spark + +name: my_custom_signal +display_name: Custom - Compute Metrics +description: Compute metrics given a baseline and a deployment's model data input. +version: 1.0.0 +is_deterministic: true + +code: ./src +entry: + file: ./run.py + +inputs: + production_data: + mode: direct + type: mltable + std_deviation_threshold: + type: number +outputs: + signal_metrics: + mode: direct + type: mltable +conf: + spark.driver.cores: 1 + spark.driver.memory: 2g + spark.executor.cores: 2 + spark.executor.memory: 2g + spark.executor.instances: 1 + spark.dynamicAllocation.enabled: True + spark.dynamicAllocation.minExecutors: 1 + spark.dynamicAllocation.maxExecutors: 4 + spark.jars.packages: com.microsoft.azure:synapseml_2.12:0.11.0-26-52919ce4-SNAPSHOT,org.apache.spark:spark-avro_2.12:3.3.1 + spark.jars.repositories: https://mmlspark.azureedge.net/maven + spark.jars.excludes: org.scala-lang:scala-reflect,org.apache.spark:spark-tags_2.12,org.scalactic:scalactic_2.12,org.scalatest:scalatest_2.12,com.fasterxml.jackson.core:jackson-databind + spark.yarn.user.classpath.first: true + spark.sql.parquet.enableVectorizedReader: false + spark.sql.legacy.replaceDatabricksSparkAvro.enabled: true + spark.driver.userClassPathFirst: false + spark.executor.userClassPathFirst: false + spark.synapse.library.python.env: | + channels: + - conda-forge + dependencies: + - python=3.8 + - pip: + - scipy~=1.10.0 + - numpy~=1.21.0 + - pandas~=1.4.3 + - azureml-mlflow~=1.49.0 + - mltable~=1.3.0 + - azureml-fsspec + - fsspec~=2023.4.0 + name: momo-base-spark +args: >- + --production_data ${{inputs.production_data}} + --std_deviation_threshold ${{inputs.std_deviation_threshold}} + --signal_metrics ${{outputs.signal_metrics}} diff --git a/cli/monitoring/components/custom_signal/src/run.py b/cli/monitoring/components/custom_signal/src/run.py new file mode 100644 index 0000000000..83754b569f --- /dev/null +++ b/cli/monitoring/components/custom_signal/src/run.py @@ -0,0 +1,100 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Entry script for Data Drift Compute Metrics Spark Component.""" + +import argparse +from pyspark.sql import SparkSession +from pyspark.sql.types import StructType, StructField, StringType, FloatType +from pyspark.sql.functions import stddev + + +def init_spark(): + """Get or create spark session.""" + spark = SparkSession.builder.appName("AccessParquetFiles").getOrCreate() + return spark + + +def read_mltable_in_spark(mltable_path: str): + """Read mltable in spark.""" + spark = init_spark() + df = spark.read.mltable(mltable_path) + return df + + +def save_spark_df_as_mltable(metrics_df, folder_path: str): + """Save spark dataframe as mltable.""" + metrics_df.write.option("output_format", "parquet").option( + "overwrite", True + ).mltable(folder_path) + + +def _create_output_dataframe(data): + """Get Output DataFrame Schema.""" + schema = StructType( + [ + StructField("group", StringType(), True), + StructField("metric_value", FloatType(), True), + StructField("metric_name", StringType(), True), + StructField("group_pivot", StringType(), True), + StructField("threshold_value", FloatType(), True), + ] + ) + return init_spark().createDataFrame(data=data, schema=schema) + + +def _create_row(metric, group, group_pivot, value, threshold): + return { + "metric_name": metric, + "group": group, + "metric_value": value, + "threshold_value": threshold, + "group_pivot": group_pivot, + } + + +def _compute_max_standard_deviation(df, std_deviation_threshold: float): + standard_deviations = df.agg( + *[stddev(column).alias(column) for column in df.columns] + ).collect()[0] + + rows = [] + for feature in df.columns: + + if feature == None: + continue + + rows.append( + _create_row( + metric="MaxStandardDeviation", + group=feature, + group_pivot="", + value=standard_deviations[feature], + threshold=std_deviation_threshold, + ) + ) + + return _create_output_dataframe(rows) + + +def run(): + """Compute metrics.""" + # Parse argument + parser = argparse.ArgumentParser() + parser.add_argument("--production_data", type=str) + parser.add_argument("--std_deviation_threshold", type=str) + parser.add_argument("--signal_metrics", type=str) + args = parser.parse_args() + + df = read_mltable_in_spark(args.production_data) + + signal_metrics = _compute_max_standard_deviation( + df, float(args.std_deviation_threshold) + ) + signal_metrics.show() + + save_spark_df_as_mltable(signal_metrics, args.signal_metrics) + + +if __name__ == "__main__": + run() diff --git a/cli/monitoring/custom-monitoring.yaml b/cli/monitoring/custom-monitoring.yaml new file mode 100644 index 0000000000..93b1a9c140 --- /dev/null +++ b/cli/monitoring/custom-monitoring.yaml @@ -0,0 +1,31 @@ +name: my-custom-signal +trigger: + type: recurrence + frequency: day #can be minute, hour, day, week, month + interval: 7 # #every day +create_monitor: + compute: + instance_type: "standard_e8s_v3" + runtime_version: "3.2" + monitoring_signals: + customSignal: + type: custom + data_window_size: 360 + component_id: azureml:my_custom_signal:1.0.0 + input_datasets: + production_data: + input_dataset: + type: uri_folder + path: azureml:custom_without_drift:1 + dataset_context: test + pre_processing_component: azureml:custom_preprocessor:1.0.0 + metric_thresholds: + - metric_name: std_deviation + threshold: 2 + alert_notification: + emails: + - abc@example.com +properties: + prop1: value +tags: + tag1: tag \ No newline at end of file diff --git a/cli/monitoring/out-of-box-monitoring.yaml b/cli/monitoring/out-of-box-monitoring.yaml new file mode 100644 index 0000000000..ac03dc667c --- /dev/null +++ b/cli/monitoring/out-of-box-monitoring.yaml @@ -0,0 +1,20 @@ +$schema: http://azureml/sdk-2-0/Schedule.json +name: fraud_detection_model_monitoring +display_name: Fraud detection model monitoring +description: Loan approval model monitoring setup with minimal configurations + +trigger: + # perform model monitoring activity daily at 3:15am + type: recurrence + frequency: day #can be minute, hour, day, week, month + interval: 1 # #every day + schedule: + hours: 3 # at 3am + minutes: 15 # at 15 mins after 3am + +create_monitor: + compute: # specify a spark compute for monitoring job + instance_type: standard_e4s_v3 + runtime_version: 3.2 + monitoring_target: + endpoint_deployment_id: azureml:fraud-detection-endpoint:fraud-detection-deployment \ No newline at end of file diff --git a/cli/readme.py b/cli/readme.py index 1f6012fcc1..a59a462020 100644 --- a/cli/readme.py +++ b/cli/readme.py @@ -9,7 +9,7 @@ import yaml # define constants -EXCLUDED_JOBS = ["java", "spark"] +EXCLUDED_JOBS = ["java", "spark-job-component", "storage_pe", "user-assigned-identity"] # TODO: Re-include these below endpoints and deployments when the workflow generation code supports substituting vars in .yaml files. EXCLUDED_ENDPOINTS = [ "1-uai-create-endpoint", @@ -77,6 +77,7 @@ def main(args): jobs += sorted(glob.glob("jobs/basics/*.yml", recursive=False)) jobs += sorted(glob.glob("jobs/*/basics/**/*job*.yml", recursive=True)) jobs += sorted(glob.glob("jobs/pipelines/**/*pipeline*.yml", recursive=True)) + jobs += sorted(glob.glob("jobs/spark/*.yml", recursive=False)) jobs += sorted( glob.glob("jobs/automl-standalone-jobs/**/cli-automl-*.yml", recursive=True) ) @@ -420,6 +421,7 @@ def write_job_workflow(job): filename, project_dir, hyphenated = parse_path(job) posix_project_dir = project_dir.replace(os.sep, "/") is_pipeline_sample = "jobs/pipelines" in job + is_spark_sample = "jobs/spark" in job creds = CREDENTIALS schedule_hour, schedule_minute = get_schedule_time(filename) # Duplicate name in working directory during checkout @@ -439,6 +441,8 @@ def write_job_workflow(job): - .github/workflows/cli-{hyphenated}.yml\n""" if is_pipeline_sample: workflow_yaml += " - cli/run-pipeline-jobs.sh\n" "" + if is_spark_sample: + workflow_yaml += " - cli/jobs/spark/data/titanic.csv\n" "" workflow_yaml += f""" - cli/setup.sh concurrency: group: {GITHUB_CONCURRENCY_GROUP} @@ -465,8 +469,10 @@ def write_job_workflow(job): source "{GITHUB_WORKSPACE}/infra/bootstrapping/init_environment.sh"; bash setup.sh working-directory: cli - continue-on-error: true - - name: run job + continue-on-error: true\n""" + if is_spark_sample: + workflow_yaml += get_spark_setup_workflow(job, posix_project_dir, filename) + workflow_yaml += f""" - name: run job run: | source "{GITHUB_WORKSPACE}/infra/bootstrapping/sdk_helpers.sh"; source "{GITHUB_WORKSPACE}/infra/bootstrapping/init_environment.sh";\n""" @@ -581,7 +587,9 @@ def write_endpoint_workflow(endpoint): if "endpoints/batch/" in endpoint else "unknown" ) - endpoint_name = hyphenated[-32:].replace("-", "") + endpoint_name = hyphenated[-28:].replace("-", "") + str( + random.randrange(1000, 9999) + ) create_endpoint_yaml = f"""{READONLY_HEADER} name: cli-{hyphenated} @@ -614,7 +622,7 @@ def write_endpoint_workflow(endpoint): - name: bootstrap resources run: | bash bootstrap.sh - working-directory: infra + working-directory: infra/bootstrapping continue-on-error: false - name: setup-cli run: | @@ -701,7 +709,7 @@ def write_asset_workflow(asset): creds: {creds} - name: bootstrap resources run: | - bash bootstrap.sh + bash bootstrapping/bootstrap.sh working-directory: infra continue-on-error: false - name: setup-cli @@ -856,6 +864,42 @@ def get_endpoint_name(filename, hyphenated): return endpoint_name +def get_spark_setup_workflow(job, posix_project_dir, filename): + is_attached = "attached-spark" in job + is_user_identity = "user-identity" in job + is_managed_identity = "managed-identity" in job + is_default_identity = "default-identity" in job + workflow = f""" - name: upload data + run: | + bash -x upload-data-to-blob.sh jobs/spark/ + working-directory: cli + continue-on-error: true\n""" + if is_managed_identity: + workflow += f""" - name: setup identities + run: | + bash -x setup-identities.sh + working-directory: cli/{posix_project_dir} + continue-on-error: true\n""" + if is_attached: + workflow += f""" - name: setup attached spark + working-directory: cli + continue-on-error: true""" + if is_attached and is_user_identity: + workflow += f""" + run: | + bash -x {posix_project_dir}/setup-attached-resources.sh resources/compute/attached-spark-user-identity.yml {posix_project_dir}/{filename}.yml\n""" + if is_attached and is_managed_identity: + workflow += f""" + run: | + bash -x {posix_project_dir}/setup-attached-resources.sh resources/compute/attached-spark-system-identity.yml {posix_project_dir}/{filename}.yml\n""" + if is_attached and is_default_identity: + workflow += f""" + run: | + bash -x {posix_project_dir}/setup-attached-resources.sh resources/compute/attached-spark.yml {posix_project_dir}/{filename}.yml\n""" + + return workflow + + # run functions if __name__ == "__main__": # setup argparse diff --git a/cli/resources/compute/attached-spark-system-identity.yaml b/cli/resources/compute/attached-spark-system-identity.yaml deleted file mode 100644 index 93442937bd..0000000000 --- a/cli/resources/compute/attached-spark-system-identity.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# attached-spark-system-identity.yaml -name: my-spark-pool - -type: synapsespark - -resource_id: /subscriptions//providers/Microsoft.Synapse/workspaces//bigDataPools/ - -identity: - type: system_assigned diff --git a/cli/resources/compute/attached-spark-system-identity.yml b/cli/resources/compute/attached-spark-system-identity.yml new file mode 100644 index 0000000000..c1b5662cdd --- /dev/null +++ b/cli/resources/compute/attached-spark-system-identity.yml @@ -0,0 +1,9 @@ +# attached-spark-system-identity.yaml +name: + +type: synapsespark + +resource_id: /subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/ + +identity: + type: system_assigned diff --git a/cli/resources/compute/attached-spark-user-identity.yaml b/cli/resources/compute/attached-spark-user-identity.yaml deleted file mode 100644 index ad1833a999..0000000000 --- a/cli/resources/compute/attached-spark-user-identity.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# attached-spark-user-identity.yaml -name: my-spark-pool - -type: synapsespark - -resource_id: /subscriptions//providers/Microsoft.Synapse/workspaces//bigDataPools/ - -identity: - type: user_assigned - user_assigned_identities: - - resource_id: /subscriptions//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ diff --git a/cli/resources/compute/attached-spark-user-identity.yml b/cli/resources/compute/attached-spark-user-identity.yml new file mode 100644 index 0000000000..19646d5eb0 --- /dev/null +++ b/cli/resources/compute/attached-spark-user-identity.yml @@ -0,0 +1,11 @@ +# attached-spark-user-identity.yml +name: + +type: synapsespark + +resource_id: /subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/ + +identity: + type: user_assigned + user_assigned_identities: + - resource_id: /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ diff --git a/cli/resources/compute/attached-spark.yaml b/cli/resources/compute/attached-spark.yaml deleted file mode 100644 index cb58f0cb25..0000000000 --- a/cli/resources/compute/attached-spark.yaml +++ /dev/null @@ -1,6 +0,0 @@ -# attached-spark.yaml -name: my-spark-pool - -type: synapsespark - -resource_id: /subscriptions//providers/Microsoft.Synapse/workspaces//bigDataPools/ diff --git a/cli/resources/compute/attached-spark.yml b/cli/resources/compute/attached-spark.yml new file mode 100644 index 0000000000..d66fa454e5 --- /dev/null +++ b/cli/resources/compute/attached-spark.yml @@ -0,0 +1,6 @@ +# attached-spark.yaml +name: + +type: synapsespark + +resource_id: /subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/ diff --git a/cli/setup.sh b/cli/setup.sh index 33ac7c42a5..8914f24309 100644 --- a/cli/setup.sh +++ b/cli/setup.sh @@ -1,28 +1,27 @@ #!/bin/bash -# rc install - uncomment and adjust below to run all tests on a CLI release candidate -# az extension remove -n ml -# -az extension add -n ml -y -# +### If installing a release candidate: +### * Update the "$wheel_url" +### * Uncomment the following block surrounded by {} +### * Comment the ml extension install within -# Use a daily build -# az extension add --source https://azuremlsdktestpypi.blob.core.windows.net/wheels/sdk-cli-v2-public/ml-2.9.0-py3-none-any.whl --yes -# remove ml extension if it is installed -# if az extension show -n ml &>/dev/null; then -# echo -n 'Removing ml extension...' -# if ! az extension remove -n ml -o none --only-show-errors &>/dev/null; then -# echo 'Error failed to remove ml extension' >&2 -# fi -# echo -n 'Re-installing ml...' -# fi +# { +# wheel_url='https://azuremlsdktestpypi.blob.core.windows.net/wheels/sdk-cli-v2-public/ml-2.9.0-py3-none-any.whl' +# +# az extension remove -n ml +# if ! az extension add --yes --upgrade --source "$wheel_url"; then +# +# echo "Error: Failed to install release candidate" +# exit 1 +# fi +# az version +# unset wheel_url +# } -# if ! az extension add --yes --source "https://azuremlsdktestpypi.blob.core.windows.net/wheels/sdk-cli-v2-public/ml-2.10.0-py3-none-any.whl" -o none --only-show-errors &>/dev/null; then -# echo 'Error failed to install ml azure-cli extension' >&2 -# exit 1 -# fi -# az version +# +az extension add -n ml -y +# ## For backward compatibility - running on old subscription # diff --git a/cli/upload-data-to-blob.sh b/cli/upload-data-to-blob.sh new file mode 100644 index 0000000000..c665625efa --- /dev/null +++ b/cli/upload-data-to-blob.sh @@ -0,0 +1,19 @@ +# +SUBSCRIPTION_ID=$(az account show --query id -o tsv) +LOCATION=$(az ml workspace show --query location -o tsv) +RESOURCE_GROUP=$(az group show --query name -o tsv) +WORKSPACE=$(az configure -l --query "[?name=='workspace'].value" -o tsv) +API_VERSION="2022-05-01" +TOKEN=$(az account get-access-token --query accessToken -o tsv) +# + +# +response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$WORKSPACE/datastores?api-version=$API_VERSION&isDefault=true" \ +--header "Authorization: Bearer $TOKEN") +AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName') +export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName') +# + +# +az storage blob upload-batch -s $1 --pattern *.csv -d $AZUREML_DEFAULT_CONTAINER --account-name $AZURE_STORAGE_ACCOUNT --overwrite true +# \ No newline at end of file diff --git a/infra/bootstrapping/bootstrap.sh b/infra/bootstrapping/bootstrap.sh index 5364ae9a88..f09bea4b87 100644 --- a/infra/bootstrapping/bootstrap.sh +++ b/infra/bootstrapping/bootstrap.sh @@ -100,8 +100,8 @@ if [[ ! -z "${RUN_BOOTSTRAP:-}" ]]; then "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "cpu-cluster-lg" 0 4 "Standard_DS15_v2" echo_title "Ensuring GPU compute" - "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "gpu-cluster" 0 20 "Standard_NC6" - "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "automl-gpu-cluster" 0 4 "STANDARD_NC6" + "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "gpu-cluster" 0 20 "STANDARD_NC6s_v3" + "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "automl-gpu-cluster" 0 4 "STANDARD_NC6s_v3" # v100 single GPU cluster for pytorch 2.0 based notebooks "$SCRIPT_DIR"/sdk_helpers.sh ensure_aml_compute "gpu-v100-1GPU-cluster" 0 4 "Standard_NC6s_v3" # v100 GPU cluster for deepspeed cli examples diff --git a/sdk/dotnet/AzureML-Samples-CSharp/Resources/Compute/AMLComputeOperations.cs b/sdk/dotnet/AzureML-Samples-CSharp/Resources/Compute/AMLComputeOperations.cs index 408d331a9e..589581ee83 100644 --- a/sdk/dotnet/AzureML-Samples-CSharp/Resources/Compute/AMLComputeOperations.cs +++ b/sdk/dotnet/AzureML-Samples-CSharp/Resources/Compute/AMLComputeOperations.cs @@ -48,7 +48,7 @@ public static async Task GetOrCreateAMLComputeAs { ScaleSettings = new ScaleSettings(4), VmSize = "Standard_DS3_v2", - // VmSize = "STANDARD_NC6", + // VmSize = "STANDARD_NC6s_v3", } }, }; diff --git a/sdk/python/README.md b/sdk/python/README.md index 517d7ef3ef..8bd244a11e 100644 --- a/sdk/python/README.md +++ b/sdk/python/README.md @@ -1,3 +1,4 @@ + --- page_type: sample languages: @@ -73,6 +74,7 @@ Test Status is for branch - **_main_** |foundation-models|system|[summarization-batch-endpoint](foundation-models/system/inference/summarization/summarization-batch-endpoint.ipynb)|*no description*|[![summarization-batch-endpoint](https://github.com/Azure/azureml-examples/actions/workflows/sdk-foundation-models-system-inference-summarization-summarization-batch-endpoint.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-foundation-models-system-inference-summarization-summarization-batch-endpoint.yml)| |jobs|automl-standalone-jobs|[automl-classification-task-bankmarketing](jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/automl-classification-task-bankmarketing.ipynb)|*no description*|[![automl-classification-task-bankmarketing](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-classification-task-bankmarketing-automl-classification-task-bankmarketing.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-classification-task-bankmarketing-automl-classification-task-bankmarketing.yml)| |jobs|automl-standalone-jobs|[mlflow-model-local-inference-test](jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/mlflow-model-local-inference-test.ipynb)|*no description* - _This sample is excluded from automated tests_|[![mlflow-model-local-inference-test](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-classification-task-bankmarketing-mlflow-model-local-inference-test.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-classification-task-bankmarketing-mlflow-model-local-inference-test.yml)| +|jobs|automl-standalone-jobs|[automl-forecasting-distributed-tcn](jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/automl-forecasting-distributed-tcn.ipynb)|*no description*|[![automl-forecasting-distributed-tcn](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-distributed-tcn-automl-forecasting-distributed-tcn.yml)| |jobs|automl-standalone-jobs|[auto-ml-forecasting-github-dau](jobs/automl-standalone-jobs/automl-forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb)|*no description*|[![auto-ml-forecasting-github-dau](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-github-dau-auto-ml-forecasting-github-dau.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-github-dau-auto-ml-forecasting-github-dau.yml)| |jobs|automl-standalone-jobs|[automl-forecasting-orange-juice-sales-mlflow](jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.ipynb)|*no description*|[![automl-forecasting-orange-juice-sales-mlflow](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-orange-juice-sales-automl-forecasting-orange-juice-sales-mlflow.yml)| |jobs|automl-standalone-jobs|[automl-forecasting-recipe-univariate-experiment-settings](jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/automl-forecasting-recipe-univariate-experiment-settings.ipynb)|*no description*|[![automl-forecasting-recipe-univariate-experiment-settings](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-recipes-univariate-automl-forecasting-recipe-univariate-experiment-settings.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-automl-standalone-jobs-automl-forecasting-recipes-univariate-automl-forecasting-recipe-univariate-experiment-settings.yml)| @@ -122,6 +124,8 @@ Test Status is for branch - **_main_** |jobs|pipelines|[pipeline_with_spark_nodes](jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb)|Create pipeline with spark node - _This sample is excluded from automated tests_|[![pipeline_with_spark_nodes](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml)| |jobs|pipelines|[nyc_taxi_data_regression_with_pipeline_component](jobs/pipelines/1j_pipeline_with_pipeline_component/nyc_taxi_data_regression_with_pipeline_component/nyc_taxi_data_regression_with_pipeline_component.ipynb)|Create pipeline with CommandComponents from local YAML file|[![nyc_taxi_data_regression_with_pipeline_component](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component.yml)| |jobs|pipelines|[pipeline_with_train_eval_pipeline_component](jobs/pipelines/1j_pipeline_with_pipeline_component/pipeline_with_train_eval_pipeline_component/pipeline_with_train_eval_pipeline_component.ipynb)|Create pipeline with CommandComponents from local YAML file|[![pipeline_with_train_eval_pipeline_component](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-pipeline_with_train_eval_pipeline_component-pipeline_with_train_eval_pipeline_component.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-pipeline_with_train_eval_pipeline_component-pipeline_with_train_eval_pipeline_component.yml)| +|jobs|pipelines|[automl-forecasting-demand-hierarchical-timeseries-in-pipeline](jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb)|*no description*|[![automl-forecasting-demand-hierarchical-timeseries-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml)| +|jobs|pipelines|[automl-forecasting-demand-many-models-in-pipeline](jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb)|*no description*|[![automl-forecasting-demand-many-models-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml)| |jobs|pipelines|[train_mnist_with_tensorflow](jobs/pipelines/2a_train_mnist_with_tensorflow/train_mnist_with_tensorflow.ipynb)|Create pipeline using components to run a distributed job with tensorflow|[![train_mnist_with_tensorflow](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2a_train_mnist_with_tensorflow-train_mnist_with_tensorflow.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2a_train_mnist_with_tensorflow-train_mnist_with_tensorflow.yml)| |jobs|pipelines|[train_cifar_10_with_pytorch](jobs/pipelines/2b_train_cifar_10_with_pytorch/train_cifar_10_with_pytorch.ipynb)|Get data, train and evaluate a model in pipeline with Components|[![train_cifar_10_with_pytorch](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2b_train_cifar_10_with_pytorch-train_cifar_10_with_pytorch.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2b_train_cifar_10_with_pytorch-train_cifar_10_with_pytorch.yml)| |jobs|pipelines|[nyc_taxi_data_regression](jobs/pipelines/2c_nyc_taxi_data_regression/nyc_taxi_data_regression.ipynb)|Build pipeline with components for 5 jobs - prep data, transform data, train model, predict results and evaluate model performance|[![nyc_taxi_data_regression](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2c_nyc_taxi_data_regression-nyc_taxi_data_regression.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2c_nyc_taxi_data_regression-nyc_taxi_data_regression.yml)| diff --git a/sdk/python/data-wrangling/interactive_data_wrangling.ipynb b/sdk/python/data-wrangling/interactive_data_wrangling.ipynb index f5939089b2..14e34f4b68 100644 --- a/sdk/python/data-wrangling/interactive_data_wrangling.ipynb +++ b/sdk/python/data-wrangling/interactive_data_wrangling.ipynb @@ -49,11 +49,15 @@ "source": [ "from pyspark.sql import SparkSession\n", "\n", + "key_vault_name = \"\"\n", + "access_key_secret_name = \"\"\n", + "storage_account_name = \"\"\n", + "\n", "sc = SparkSession.builder.getOrCreate()\n", "token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary\n", - "access_key = token_library.getSecret(\"\", \"\")\n", + "access_key = token_library.getSecret(key_vault_name, access_key_secret_name)\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.key..blob.core.windows.net\", access_key\n", + " f\"fs.azure.account.key.{storage_account_name}.blob.core.windows.net\", access_key\n", ")" ] }, @@ -84,8 +88,11 @@ "import pyspark.pandas as pd\n", "from pyspark.ml.feature import Imputer\n", "\n", + "blob_container_name = \"\"\n", + "storage_account_name = \"\"\n", + "\n", "df = pd.read_csv(\n", - " \"wasbs://@.blob.core.windows.net/data/titanic.csv\",\n", + " f\"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/titanic.csv\",\n", " index_col=\"PassengerId\",\n", ")\n", "imputer = Imputer(inputCols=[\"Age\"], outputCol=\"Age\").setStrategy(\n", @@ -96,7 +103,7 @@ ") # Fill Cabin column with value \"None\" if missing\n", "df.dropna(inplace=True) # Drop the rows which still have any missing value\n", "df.to_csv(\n", - " \"wasbs://@.blob.core.windows.net/data/wrangled\",\n", + " f\"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/wrangled\",\n", " index_col=\"PassengerId\",\n", ")" ] @@ -141,11 +148,16 @@ "source": [ "from pyspark.sql import SparkSession\n", "\n", + "key_vault_name = \"\"\n", + "sas_token_secret_name = \"\"\n", + "blob_container_name = \"\"\n", + "storage_account_name = \"\"\n", + "\n", "sc = SparkSession.builder.getOrCreate()\n", "token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary\n", - "sas_token = token_library.getSecret(\"\", \"\")\n", + "sas_token = token_library.getSecret(key_vault_name, sas_token_secret_name)\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.sas...blob.core.windows.net\",\n", + " f\"fs.azure.sas.{blob_container_name}.{storage_account_name}.blob.core.windows.net\",\n", " sas_token,\n", ")" ] @@ -177,8 +189,11 @@ "import pyspark.pandas as pd\n", "from pyspark.ml.feature import Imputer\n", "\n", + "blob_container_name = \"\"\n", + "storage_account_name = \"\"\n", + "\n", "df = pd.read_csv(\n", - " \"wasbs://@.blob.core.windows.net/data/titanic.csv\",\n", + " f\"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/titanic.csv\",\n", " index_col=\"PassengerId\",\n", ")\n", "imputer = Imputer(inputCols=[\"Age\"], outputCol=\"Age\").setStrategy(\n", @@ -189,7 +204,7 @@ ") # Fill Cabin column with value \"None\" if missing\n", "df.dropna(inplace=True) # Drop the rows which still have any missing value\n", "df.to_csv(\n", - " \"wasbs://@.blob.core.windows.net/data/wrangled\",\n", + " f\"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/wrangled\",\n", " index_col=\"PassengerId\",\n", ")" ] @@ -236,8 +251,11 @@ "import pyspark.pandas as pd\n", "from pyspark.ml.feature import Imputer\n", "\n", + "file_system_name = \"\"\n", + "gen2_storage_account_name = \"\"\n", + "\n", "df = pd.read_csv(\n", - " \"abfss://@.dfs.core.windows.net/data/titanic.csv\",\n", + " f\"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/titanic.csv\",\n", " index_col=\"PassengerId\",\n", ")\n", "imputer = Imputer(inputCols=[\"Age\"], outputCol=\"Age\").setStrategy(\n", @@ -248,7 +266,7 @@ ") # Fill Cabin column with value \"None\" if missing\n", "df.dropna(inplace=True) # Drop the rows which still have any missing value\n", "df.to_csv(\n", - " \"abfss://@.dfs.core.windows.net/data/wrangled\",\n", + " f\"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/wrangled\",\n", " index_col=\"PassengerId\",\n", ")" ] @@ -272,7 +290,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- To enable read and write access, assign **Contributor** and **Storage Blob Data Contributor** roles to the user identity.\n", + "- To enable read and write access, assign **Contributor** and **Storage Blob Data Contributor** roles to the Service Principal.\n", "- Set configuration properties as follows:\n", " - Client ID property: `fs.azure.account.oauth2.client.id..dfs.core.windows.net`\n", " - Client secret property: `fs.azure.account.oauth2.client.secret..dfs.core.windows.net`\n", @@ -298,32 +316,39 @@ "source": [ "from pyspark.sql import SparkSession\n", "\n", + "key_vault_name = \"\"\n", + "client_id_secret_name = \"\"\n", + "tenant_id_secret_name = \"\"\n", + "client_secret_name = \"\"\n", + "gen2_storage_account_name = \"\"\n", + "\n", "sc = SparkSession.builder.getOrCreate()\n", "token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary\n", "\n", "# Set up service principal tenant ID, client ID and secret from Azure Key Vault\n", - "client_id = token_library.getSecret(\"\", \"\")\n", - "tenant_id = token_library.getSecret(\"\", \"\")\n", - "client_secret = token_library.getSecret(\"\", \"\")\n", + "client_id = token_library.getSecret(key_vault_name, client_id_secret_name)\n", + "tenant_id = token_library.getSecret(key_vault_name, tenant_id_secret_name)\n", + "client_secret = token_library.getSecret(key_vault_name, client_secret_name)\n", "\n", "# Set up service principal which has access of the data\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.auth.type..dfs.core.windows.net\", \"OAuth\"\n", + " f\"fs.azure.account.auth.type.{gen2_storage_account_name}.dfs.core.windows.net\",\n", + " \"OAuth\",\n", ")\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.oauth.provider.type..dfs.core.windows.net\",\n", + " f\"fs.azure.account.oauth.provider.type.{gen2_storage_account_name}.dfs.core.windows.net\",\n", " \"org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider\",\n", ")\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.oauth2.client.id..dfs.core.windows.net\",\n", + " f\"fs.azure.account.oauth2.client.id.{gen2_storage_account_name}.dfs.core.windows.net\",\n", " client_id,\n", ")\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.oauth2.client.secret..dfs.core.windows.net\",\n", + " f\"fs.azure.account.oauth2.client.secret.{gen2_storage_account_name}.dfs.core.windows.net\",\n", " client_secret,\n", ")\n", "sc._jsc.hadoopConfiguration().set(\n", - " \"fs.azure.account.oauth2.client.endpoint..dfs.core.windows.net\",\n", + " f\"fs.azure.account.oauth2.client.endpoint.{gen2_storage_account_name}.dfs.core.windows.net\",\n", " \"https://login.microsoftonline.com/\" + tenant_id + \"/oauth2/token\",\n", ")" ] @@ -355,8 +380,11 @@ "import pyspark.pandas as pd\n", "from pyspark.ml.feature import Imputer\n", "\n", + "file_system_name = \"\"\n", + "gen2_storage_account_name = \"\"\n", + "\n", "df = pd.read_csv(\n", - " \"abfss://@.dfs.core.windows.net/data/titanic.csv\",\n", + " f\"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/titanic.csv\",\n", " index_col=\"PassengerId\",\n", ")\n", "imputer = Imputer(inputCols=[\"Age\"], outputCol=\"Age\").setStrategy(\n", @@ -367,7 +395,7 @@ ") # Fill Cabin column with value \"None\" if missing\n", "df.dropna(inplace=True) # Drop the rows which still have any missing value\n", "df.to_csv(\n", - " \"abfss://@.dfs.core.windows.net/data/wrangled\",\n", + " f\"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/wrangled\",\n", " index_col=\"PassengerId\",\n", ")" ] diff --git a/sdk/python/data-wrangling/interactive_data_wrangling.py b/sdk/python/data-wrangling/interactive_data_wrangling.py new file mode 100644 index 0000000000..6d30261ef8 --- /dev/null +++ b/sdk/python/data-wrangling/interactive_data_wrangling.py @@ -0,0 +1,152 @@ +## Interactive Data Wrangling using Apache Spark in Azure Machine Learning. Before executing these sample codes in an Azure Machine Learning Notebook, select **Serverless Spark Compute** under **Azure Machine Learning Serverless Spark** or select an attached Synapse Spark pool under **Synapse Spark pools** from the **Compute** selection menu. It is highly recommened to follow the documentation page: [Interactive data wrangling with Apache Spark in Azure Machine Learning](https://learn.microsoft.com/azure/machine-learning/interactive-data-wrangling-with-apache-spark-azure-ml) for more details related to the code samples provided in this notebook. + +### Access and wrangle Azure Blob storage data using Access Key + +#### First, Set the access key as configuration property `fs.azure.account.key..blob.core.windows.net`. + +from pyspark.sql import SparkSession + +key_vault_name = "" +access_key_secret_name = "" +storage_account_name = "" + +sc = SparkSession.builder.getOrCreate() +token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary +access_key = token_library.getSecret(key_vault_name, access_key_secret_name) +sc._jsc.hadoopConfiguration().set( + f"fs.azure.account.key.{storage_account_name}.blob.core.windows.net", access_key +) + +#### Access data using `wasbs://` URI and perform data wrangling. +import pyspark.pandas as pd +from pyspark.ml.feature import Imputer + +blob_container_name = "" +storage_account_name = "" + +df = pd.read_csv( + f"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/titanic.csv", + index_col="PassengerId", +) +imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy( + "mean" +) # Replace missing values in Age column with the mean value +df.fillna( + value={"Cabin": "None"}, inplace=True +) # Fill Cabin column with value "None" if missing +df.dropna(inplace=True) # Drop the rows which still have any missing value +df.to_csv( + f"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/wrangled", + index_col="PassengerId", +) + +### Access and wrangle Azure Blob storage data using SAS token + +#### First, set the SAS token as configuration property `fs.azure.sas...blob.core.windows.net`. +from pyspark.sql import SparkSession + +key_vault_name = "" +sas_token_secret_name = "" +blob_container_name = "" +storage_account_name = "" + +sc = SparkSession.builder.getOrCreate() +token_library = sc._jvm.com.microsoft.azure.synapse.tokenlibrary.TokenLibrary +sas_token = token_library.getSecret(key_vault_name, sas_token_secret_name) +sc._jsc.hadoopConfiguration().set( + f"fs.azure.sas.{blob_container_name}.{storage_account_name}.blob.core.windows.net", + sas_token, +) + +#### Access data using `wasbs://` URI and perform data wrangling. +import pyspark.pandas as pd +from pyspark.ml.feature import Imputer + +blob_container_name = "" +storage_account_name = "" + +df = pd.read_csv( + f"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/titanic.csv", + index_col="PassengerId", +) +imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy( + "mean" +) # Replace missing values in Age column with the mean value +df.fillna( + value={"Cabin": "None"}, inplace=True +) # Fill Cabin column with value "None" if missing +df.dropna(inplace=True) # Drop the rows which still have any missing value +df.to_csv( + f"wasbs://{blob_container_name}@{storage_account_name}.blob.core.windows.net/data/wrangled", + index_col="PassengerId", +) + +### Access and wrangle ADLS Gen 2 data using User Identity passthrough + +#### - To enable read and write access, assign **Contributor** and **Storage Blob Data Contributor** roles to the user identity. +#### - Access data using `abfss://` URI and perform data wrangling. +import pyspark.pandas as pd +from pyspark.ml.feature import Imputer + +file_system_name = "" +gen2_storage_account_name = "" + +df = pd.read_csv( + f"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/titanic.csv", + index_col="PassengerId", +) +imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy( + "mean" +) # Replace missing values in Age column with the mean value +df.fillna( + value={"Cabin": "None"}, inplace=True +) # Fill Cabin column with value "None" if missing +df.dropna(inplace=True) # Drop the rows which still have any missing value +df.to_csv( + f"abfss://{file_system_name}@{gen2_storage_account_name}.dfs.core.windows.net/data/wrangled", + index_col="PassengerId", +) + + +### Access and wrangle data using credentialed AzureML Blob Datastore +#### - Access data using `azureml://` URI and perform data wrangling. +import pyspark.pandas as pd +from pyspark.ml.feature import Imputer + +df = pd.read_csv( + "azureml://datastores/workspaceblobstore/paths/data/titanic.csv", + index_col="PassengerId", +) +imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy( + "mean" +) # Replace missing values in Age column with the mean value +df.fillna( + value={"Cabin": "None"}, inplace=True +) # Fill Cabin column with value "None" if missing +df.dropna(inplace=True) # Drop the rows which still have any missing value +df.to_csv( + "azureml://datastores/workspaceblobstore/paths/data/wrangled", + index_col="PassengerId", +) + +### Access and wrangle data using credentialless AzureML Blob Datastore +#### - To enable read and write access, assign **Contributor** and **Storage Blob Data Contributor** roles to the user identity on the Azure Blob storage account that the datastore points to. +#### - Access data using `azureml://` URI and perform data wrangling. +import pyspark.pandas as pd +from pyspark.ml.feature import Imputer + +df = pd.read_csv( + "azureml://datastores/credlessblobdatastore/paths/data/titanic.csv", + index_col="PassengerId", +) +imputer = Imputer(inputCols=["Age"], outputCol="Age").setStrategy( + "mean" +) # Replace missing values in Age column with the mean value +df.fillna( + value={"Cabin": "None"}, inplace=True +) # Fill Cabin column with value "None" if missing +df.dropna(inplace=True) # Drop the rows which still have any missing value +df.to_csv( + "azureml://datastores/credlessblobdatastore/paths/data/wrangled", + index_col="PassengerId", +) diff --git a/sdk/python/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/sdk-deploy-and-test.ipynb b/sdk/python/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/sdk-deploy-and-test.ipynb index 2734836d55..2891651157 100644 --- a/sdk/python/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/sdk-deploy-and-test.ipynb +++ b/sdk/python/endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing/sdk-deploy-and-test.ipynb @@ -324,14 +324,6 @@ " return {\"scores\": scored_data.outputs.scores}" ] }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "> In the pipeline, the `transformations` input is missing; therefore, the script will learn the parameters from the input data." - ] - }, { "attachments": {}, "cell_type": "markdown", diff --git a/sdk/python/endpoints/online/managed/inference-schema/env.yml b/sdk/python/endpoints/online/managed/inference-schema/env.yml index b950f5cc74..6c575741b8 100644 --- a/sdk/python/endpoints/online/managed/inference-schema/env.yml +++ b/sdk/python/endpoints/online/managed/inference-schema/env.yml @@ -3,7 +3,7 @@ channels: - conda-forge dependencies: - python=3.10 - - scikit-learn + - scikit-learn=1.2.2 - numpy - pandas - pip: diff --git a/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml b/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml index 7b588e3fa9..c0bf3ac72e 100644 --- a/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml +++ b/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml @@ -9,6 +9,7 @@ specification: path: ./spec materialization_settings: offline_enabled: true + online_enabled: false resource: instance_type: Standard_E8S_V3 spark_configuration: diff --git a/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled_with_schedule.yaml b/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled_with_schedule.yaml index 9e11758372..46193a0a5d 100644 --- a/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled_with_schedule.yaml +++ b/sdk/python/featurestore_sample/featurestore/featuresets/transactions/featureset_asset_offline_enabled_with_schedule.yaml @@ -9,6 +9,7 @@ specification: path: ./spec materialization_settings: offline_enabled: true + online_enabled: false schedule: type: recurrence interval: 3 diff --git a/sdk/python/featurestore_sample/notebooks/sdk_and_cli/2. Enable materialization and backfill feature data.ipynb b/sdk/python/featurestore_sample/notebooks/sdk_and_cli/2. Enable materialization and backfill feature data.ipynb index c2cf072a06..90e8fea73e 100644 --- a/sdk/python/featurestore_sample/notebooks/sdk_and_cli/2. Enable materialization and backfill feature data.ipynb +++ b/sdk/python/featurestore_sample/notebooks/sdk_and_cli/2. Enable materialization and backfill feature data.ipynb @@ -926,7 +926,7 @@ }, "outputs": [], "source": [ - "# The below code creeates a feature stor\n", + "# The below code creates a feature store\n", "import yaml\n", "\n", "config = {\n", diff --git a/sdk/python/featurestore_sample/notebooks/sdk_and_cli/network_isolation/Network Isolation for Feature store.ipynb b/sdk/python/featurestore_sample/notebooks/sdk_and_cli/network_isolation/Network Isolation for Feature store.ipynb new file mode 100644 index 0000000000..c2b2653538 --- /dev/null +++ b/sdk/python/featurestore_sample/notebooks/sdk_and_cli/network_isolation/Network Isolation for Feature store.ipynb @@ -0,0 +1,64400 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "# Tutorial : Network isolation with feature store" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Important\n", + "\n", + "This feature is currently in public preview. This preview version is provided without a service-level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities. For more information, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/)." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Azure ML managed feature store lets you discover, create and operationalize features. Features are the connective tissue in ML lifecycle, starting from prototyping where you experiment with various features to operationalization where models are deployed and feature data is looked up during inference. For information on basic concept of feature store, see [feature store concepts](fs-concepts).\n", + "\n", + "In this tutorial you will learn how to configure secure ingress through private endpoint and secure egress through managed VNET.\n", + "\n", + "This tutorial contains the necessary information to setup network isolation for managed feature store. In this tutorial you will:\n", + "- Setup necessary resources required for network isolation of managed feature store.\n", + "- Create a new feature store resource\n", + "- Setup your feature store to support network isolation scenarios.\n", + "- Update your project workspace (current workspace) to support network isolation scenarios.\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Prerequisites\n", + "Before following the steps in this article, make sure you have the following prerequisites:\n", + "\n", + "* Project workspace: You need to have a Azure Machine Learning workspace enabled with Managed VNet for **serverless spark jobs**. You can follow the steps in the document [Configure for serverless spark job](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-managed-network?view=azureml-api-2&tabs=azure-cli#configure-for-serverless-spark-jobs).\n", + "\n", + "__Important__: When following the above instructions, set the isolation_mode as `allow_internet_outbound`. Currently only this mode is supported, however we are actively working on supporting `allow_only_approved_outbound`. However as you will see in this notebook, you can connect to sources, materialization store and observation data securely through private endpoints.\n", + "\n", + "* To perform the steps in this article, your user account must be assigned the `owner` or `contributor`` role to a resource group where the feature store will be created. And you need the `User Access Administrator` role." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Setup " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Prepare the notebook environment for development\n", + "Note: This tutorial uses Azure Machine Learning spark notebook for development.\n", + "\n", + "1. Clone the examples repository to your local machine: To run the tutorial, first clone the [examples repository - (azureml-examples)](https://github.com/azure/azureml-examples) with this command:\n", + "\n", + " `git clone --depth 1 https://github.com/Azure/azureml-examples`\n", + "\n", + " You can also download a zip file from the [examples repository (azureml-examples)](https://github.com/azure/azureml-examples). At this page, first select the `code` dropdown, and then select `Download ZIP`. Then, unzip the contents into a folder on your local device.\n", + "\n", + "1. Upload the feature store samples directory to project workspace.\n", + " * Open Azure Machine Learning studio UI of your Azure Machine Learning workspace\n", + " * Select **Notebooks** in left nav\n", + " * Select your user name in the directory listing\n", + " * Select **upload folder**\n", + " * Select the feature store samples folder from the cloned directory path: `azureml-examples/sdk/python/featurestore-sample`\n", + "\n", + "1. Running the tutorial:\n", + "* Option 1: Create a new notebook, and execute the instructions in this document step by step. \n", + "* Option 2: Open the existing notebook `featurestore_sample/notebooks/sdk_and_cli/network_isolation/Network Isolation for Feature store.ipynb`. You may keep this document open and refer to it for additional explanation and documentation links.\n", + "\n", + "1. Select **Serverless Spark compute** in the top nav \"Compute\" dropdown. This operation might take one to two minutes. Wait for a status bar in the top to display **configure session**.\n", + "\n", + "1. Select \"configure session\" from the top nav (this could take one to two minutes to display):\n", + "\n", + " 1. Select **configure session** in the top status bar\n", + " 1. Select **Python packages**\n", + " 1. Select **Upload conda file**\n", + " 1. Select file `azureml-examples/sdk/python/featurestore-sample/project/env/conda.yml` located on your local device\n", + " 1. (Optional) Increase the session time-out (idle time) to reduce the serverless spark cluster startup time." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Start spark session" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689027051852 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "start-spark-session", + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "# run this cell to start the spark session (any code block will start the session ). This can take around 10 mins.\n", + "print(\"start spark session\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Setup root directory for the samples" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689019491793 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "root-dir", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# Please update your alias below (or any custom directory you uploaded the samples to).\n", + "# You can find the name from the directory structure in the left nav\n", + "root_dir = \"./Users//featurestore_sample\"\n", + "\n", + "if os.path.isdir(root_dir):\n", + " print(\"The folder exists.\")\n", + "else:\n", + " print(\"The folder does not exist. Please create or fix the path\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Setup CLI\n", + "\n", + "1. Install azure ml cli extention\n", + "1. Authenticate\n", + "1. Set the default subscription" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689019538290 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "install-ml-ext-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# install azure ml cli extension\n", + "!az extension add --name ml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689019889191 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "auth-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# authenticate\n", + "!az login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689019901244 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "set-default-subs-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Set default subscription\n", + "import os\n", + "\n", + "subscription_id = os.environ[\"AZUREML_ARM_SUBSCRIPTION\"]\n", + "\n", + "!az account set -s $subscription_id" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Note\n", + "Feature store Vs Project workspace: You will use a featurestore to reuse features across projects. You will use a project workspace(the current workspace) to train and inference models, by leveraging features from feature stores. Many project workspaces can share and reuse a same feature store.\n", + "\n", + "## Note\n", + "In this tutorial you will be using cli and feature store core SDK:\n", + "Uses CLI for CRUD operations (create/update/delete) and python SDK for feature set development and testing only. This is useful in ci/cd or GitOps scenarios where CLI/yaml is preferred.\n", + "\n", + "1. CLI: You will use CLI for CRUD operations (create/update/delete) on feature-store, feature-set and feature-store-entity.\n", + "2. Feature store core sdk: This sdk (`azureml-featurestore`) is meant to be used for feature set development and consumption (you will learn more about these operations later):\n", + "- List/Get registered feature set\n", + "- Generate/resolve feature retrieval spec\n", + "- Execute featureset definition to generate Spark dataframe\n", + "- Generate training using a point-in-time join\n", + "\n", + "For this tutorial so you do not need to install any of these explicitly, since the instructions already cover them (conda yaml in the above step include these)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Step 1. Setup necessary resources\n", + "\n", + "You can create a new gen2 storage account and containers, or reuse existing one to be used for the feature store.\n", + "\n", + "We would need three separate storage containers for each of \n", + "- Source data\n", + "- Offline store\n", + "- Observation data\n", + "\n", + "For the purpose of these demo, we are going to create three containers in the same gen2 storage account.\n", + "\n", + "For the real scenarios, each of these containers can be in different storage accounts or the same account depending on your organizational need. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "##### Step 1a. Create an adls gen 2 storage account that will be used to store source, offline store and observation data.\n", + "You can optionally override the default settings" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689019985812 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "## Default Setting\n", + "# We use the subscription, resource group, region of this active project workspace,\n", + "# We hard-coded default resource names for creating new resources\n", + "\n", + "## Overwrite\n", + "# You can replace them if you want to create the resources in a different subsciprtion/resourceGroup, or use existing resources\n", + "\n", + "storage_subscription_id = os.environ[\"AZUREML_ARM_SUBSCRIPTION\"]\n", + "storage_resource_group_name = os.environ[\"AZUREML_ARM_RESOURCEGROUP\"]\n", + "storage_account_name = \"\"\n", + "\n", + "storage_location = \"eastus\"\n", + "storage_file_system_name_offline_store = \"offline-store\"\n", + "storage_file_system_name_source_data = \"source-data\"\n", + "storage_file_system_name_observation_data = \"observation-data\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020013837 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# create new storage account\n", + "!az storage account create --name $storage_account_name --enable-hierarchical-namespace true --resource-group $storage_resource_group_name --location $storage_location --subscription $storage_subscription_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020028669 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# create a new storage container for offline store\n", + "!az storage fs create --name $storage_file_system_name_offline_store --account-name $storage_account_name --subscription $storage_subscription_id --auth-mode login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020043780 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# create a new storage container for source data\n", + "!az storage fs create --name $storage_file_system_name_source_data --account-name $storage_account_name --subscription $storage_subscription_id --auth-mode login" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020049808 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# create a new storage container for observation data\n", + "!az storage fs create --name $storage_file_system_name_observation_data --account-name $storage_account_name --subscription $storage_subscription_id --auth-mode login" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 1b. Copy the sample data required for this tutorial series to the newly created storage containers." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020108998 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Copy the sample source data for transactions featureset used in this tutorial series from the public storage account to the newly created storage account\n", + "transactions_source_data_path = \"wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/transactions-source/*.parquet\"\n", + "transactions_src_df = spark.read.parquet(transactions_source_data_path)\n", + "\n", + "transactions_src_df.write.parquet(\n", + " f\"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020127039 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Copy the sample source data for account featureset used in this tutorial series from the public storage account to the newly created storage account\n", + "accounts_data_path = \"wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/datasources/accounts-precalculated/*.parquet\"\n", + "accounts_data_df = spark.read.parquet(accounts_data_path)\n", + "\n", + "accounts_data_df.write.parquet(\n", + " f\"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/accounts-precalculated/\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020142079 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Copy the sample observation data used for training from the public storage account to the newly created storage account\n", + "observation_data_train_path = \"wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/train/*.parquet\"\n", + "observation_data_train_df = spark.read.parquet(observation_data_train_path)\n", + "\n", + "observation_data_train_df.write.parquet(\n", + " f\"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/train/\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020171282 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Copy the sample observation data used for batch inference from the public storage account to the newly created storage account\n", + "observation_data_inference_path = \"wasbs://data@azuremlexampledata.blob.core.windows.net/feature-store-prp/observation_data/batch_inference/*.parquet\"\n", + "observation_data_inference_df = spark.read.parquet(observation_data_inference_path)\n", + "\n", + "observation_data_inference_df.write.parquet(\n", + " f\"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/batch_inference/\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 1c. Disable the public network access on the newly created storage account." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020198563 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Disable the public network access for the above created gen2 storage account\n", + "!az storage account update --name $storage_account_name --resource-group $storage_resource_group_name --subscription $storage_subscription_id --public-network-access disabled" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020636714 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# set the container arm id\n", + "offline_store_gen2_container_arm_id = \"/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}\".format(\n", + " sub_id=storage_subscription_id,\n", + " rg=storage_resource_group_name,\n", + " account=storage_account_name,\n", + " container=storage_file_system_name_offline_store,\n", + ")\n", + "\n", + "print(offline_store_gen2_container_arm_id)\n", + "\n", + "source_data_gen2_container_arm_id = \"/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}\".format(\n", + " sub_id=storage_subscription_id,\n", + " rg=storage_resource_group_name,\n", + " account=storage_account_name,\n", + " container=storage_file_system_name_source_data,\n", + ")\n", + "\n", + "print(source_data_gen2_container_arm_id)\n", + "\n", + "observation_data_gen2_container_arm_id = \"/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.Storage/storageAccounts/{account}/blobServices/default/containers/{container}\".format(\n", + " sub_id=storage_subscription_id,\n", + " rg=storage_resource_group_name,\n", + " account=storage_account_name,\n", + " container=storage_file_system_name_observation_data,\n", + ")\n", + "\n", + "print(observation_data_gen2_container_arm_id)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Step 2. Setup user assigned managed identity (UAI)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 2a. Create a new User-assigned managed identity." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020667854 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# User assigned managed identity values. Optionally you may change the values.\n", + "uai_subscription_id = os.environ[\"AZUREML_ARM_SUBSCRIPTION\"]\n", + "uai_resource_group_name = os.environ[\"AZUREML_ARM_RESOURCEGROUP\"]\n", + "uai_name = \"\"\n", + "# feature store location is used by default. You can change it.\n", + "uai_location = storage_location" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az identity create --subscription $uai_subscription_id --resource-group $uai_resource_group_name --location $uai_location --name $uai_name" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "##### Retrieve UAI properties" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020712174 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azure.mgmt.msi import ManagedServiceIdentityClient\n", + "from azure.mgmt.msi.models import Identity\n", + "from azure.ai.ml.identity import AzureMLOnBehalfOfCredential\n", + "\n", + "msi_client = ManagedServiceIdentityClient(\n", + " AzureMLOnBehalfOfCredential(), uai_subscription_id\n", + ")\n", + "managed_identity = msi_client.user_assigned_identities.get(\n", + " resource_name=uai_name, resource_group_name=uai_resource_group_name\n", + ")\n", + "\n", + "uai_principal_id = managed_identity.principal_id\n", + "uai_client_id = managed_identity.client_id\n", + "uai_arm_id = managed_identity.id" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "##### Step 2b. Grant RBAC permission to the user assigned managed identity (UAI)\n", + "\n", + "This UAI will be assigned to the feature store shortly. It requires the following permissions:\n", + "\n", + "|Scope|\tAction/Role|\n", + "|--|--|\n", + "|Feature store\t|AzureML Data Scientist role|\n", + "|Storage account of feature store offline store\t|Blob storage data contributor role|\n", + "|Storage accounts of source data\t|Blob storage data reader role|\n", + "\n", + "The below cli commands will assign the first two roles to the UAI. In this example \"Storage accounts of source data\" is not applicable since we are reading the sample data from a public access blob storage. If you have your own data sources then you want to assign the required roles to the UAI. To learn more about access control, see access control document in the docs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"Storage Blob Data Contributor\" --assignee-object-id $uai_principal_id --assignee-principal-type ServicePrincipal --scope $offline_store_gen2_container_arm_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"Storage Blob Data Reader\" --assignee-object-id $uai_principal_id --assignee-principal-type ServicePrincipal --scope $source_data_gen2_container_arm_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"Storage Blob Data Reader\" --assignee-object-id $uai_principal_id --assignee-principal-type ServicePrincipal --scope $observation_data_gen2_container_arm_id" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Grant your user account \"Blob data reader\" role on the offline store\n", + "If feature data is materialized, then you need this role to read feature data from offline materialization store.\n", + "\n", + "Get your AAD object id from Azure portal following this instruction: https://learn.microsoft.com/en-us/partner-center/find-ids-and-domain-names#find-the-user-object-id\n", + "\n", + "To learn more about access control, see access control document in the docs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020847521 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# This utility function is created for ease of use in the docs tutorials. It uses standard azure API's. You can optionally inspect it `featurestore/setup/setup_storage_uai.py`\n", + "your_aad_objectid = \"\"\n", + "\n", + "!az role assignment create --role \"Storage Blob Data Reader\" --assignee-object-id $your_aad_objectid --assignee-principal-type User --scope $offline_store_gen2_container_arm_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020857258 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"Storage Blob Data Reader\" --assignee-object-id $your_aad_objectid --assignee-principal-type User --scope $source_data_gen2_container_arm_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659470970 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"Storage Blob Data Reader\" --assignee-object-id $your_aad_objectid --assignee-principal-type User --scope $observation_data_gen2_container_arm_id" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step 3. Create a feature store with materialization enabled" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 3a. Set feature store parameters\n", + "Set name, location and other values for the feature store" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020890909 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "fs-params", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# We use the subscription, resource group, region of this active project workspace.\n", + "# You can optionally replace them to create the resources in a different subsciprtion/resourceGroup, or use existing resources\n", + "import os\n", + "\n", + "featurestore_name = \"\"\n", + "# It is recommended to create featurestore in the same location as the storage\n", + "featurestore_location = storage_location\n", + "featurestore_subscription_id = os.environ[\"AZUREML_ARM_SUBSCRIPTION\"]\n", + "featurestore_resource_group_name = os.environ[\"AZUREML_ARM_RESOURCEGROUP\"]\n", + "\n", + "feature_store_arm_id = \"/subscriptions/{sub_id}/resourceGroups/{rg}/providers/Microsoft.MachineLearningServices/workspaces/{ws_name}\".format(\n", + " sub_id=featurestore_subscription_id,\n", + " rg=featurestore_resource_group_name,\n", + " ws_name=featurestore_name,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689020922382 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# The below code creates a feature store with enabled materialization\n", + "import yaml\n", + "\n", + "config = {\n", + " \"$schema\": \"http://azureml/sdk-2-0/FeatureStore.json\",\n", + " \"name\": featurestore_name,\n", + " \"location\": featurestore_location,\n", + " \"compute_runtime\": {\"spark_runtime_version\": \"3.2\"},\n", + " \"offline_store\": {\n", + " \"type\": \"azure_data_lake_gen2\",\n", + " \"target\": offline_store_gen2_container_arm_id,\n", + " },\n", + " \"materialization_identity\": {\"client_id\": uai_client_id, \"resource_id\": uai_arm_id},\n", + "}\n", + "\n", + "feature_store_yaml = root_dir + \"/featurestore/featurestore_with_offline_setting.yaml\"\n", + "\n", + "with open(feature_store_yaml, \"w\") as outfile:\n", + " yaml.dump(config, outfile, default_flow_style=False)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 3b. Create the feature store" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1683415482376 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "create-fs-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az ml feature-store create --file $feature_store_yaml --subscription $featurestore_subscription_id --resource-group $featurestore_resource_group_name" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 3c. Initialize AzureML feature store core SDK client\n", + "As explained above, this is used to develop and consume features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659590130 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "init-fs-core-sdk", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# feature store client\n", + "from azureml.featurestore import FeatureStoreClient\n", + "from azure.ai.ml.identity import AzureMLOnBehalfOfCredential\n", + "\n", + "featurestore = FeatureStoreClient(\n", + " credential=AzureMLOnBehalfOfCredential(),\n", + " subscription_id=featurestore_subscription_id,\n", + " resource_group_name=featurestore_resource_group_name,\n", + " name=featurestore_name,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 3d. Grant UAI access to the featurestore" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az role assignment create --role \"AzureML Data Scientist\" --assignee-object-id $uai_principal_id --assignee-principal-type ServicePrincipal --scope $feature_store_arm_id" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659603514 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "your_aad_objectid = \"\"\n", + "\n", + "!az role assignment create --role \"AzureML Data Scientist\" --assignee-object-id $your_aad_objectid --assignee-principal-type User --scope $feature_store_arm_id" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 3e. Get default storage account and keyvault for the featurestore and disable the public network access to the corresponding resources." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659632563 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "fs = featurestore.feature_stores.get()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659633093 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Copy the n properties storage_account and key_vault from the response returned in feature-store show command respectively\n", + "default_fs_storage_account_name = fs.storage_account.rsplit(\"/\", 1)[-1]\n", + "default_key_vault_name = fs.key_vault.rsplit(\"/\", 1)[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659638035 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Disable the public network access for the above created default featurestore gen2 storage account\n", + "!az storage account update --name $default_fs_storage_account_name --resource-group $featurestore_resource_group_name --subscription $featurestore_subscription_id --public-network-access disabled" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659638574 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "print(default_key_vault_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Disable the public network access for the above created default featurestore key vault\n", + "\n", + "- Open the default keyvault from the previous cell in the azure portal.\n", + "- Go to the Networking tab.\n", + "- Select `Disable Public Access` and click on `Apply` on the bottom left of the page." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 4. Enable Managed Vnet for the featurestore workspace" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 4a. Update the featurestore with the necessary outbound rules." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659680671 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# The below code creates a configuration for managed-vnet for the feature store workspace\n", + "import yaml\n", + "\n", + "config = {\n", + " \"public_network_access\": \"disabled\",\n", + " \"managed_network\": {\n", + " \"isolation_mode\": \"allow_internet_outbound\",\n", + " \"outbound_rules\": [\n", + " # You need to add multiple rules here if you have separate storage account for source, observation data and offline store.\n", + " {\n", + " \"name\": \"sourcerulefs\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"dfs\",\n", + " \"service_resource_id\": f\"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{storage_account_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " # This rule is added currently because spark doesn't automatically create PE to default key vault.\n", + " {\n", + " \"name\": \"defaultkeyvault\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"vault\",\n", + " \"service_resource_id\": f\"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Keyvault/vaults/{default_key_vault_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " ],\n", + " },\n", + "}\n", + "\n", + "feature_store_managed_vnet_yaml = (\n", + " root_dir + \"/featurestore/feature_store_managed_vnet_config.yaml\"\n", + ")\n", + "\n", + "with open(feature_store_managed_vnet_yaml, \"w\") as outfile:\n", + " yaml.dump(config, outfile, default_flow_style=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688659723547 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# This command will change to `az ml featurestore update` in future for parity.\n", + "!az ml workspace update --file $feature_store_managed_vnet_yaml --name $featurestore_name --resource-group $featurestore_resource_group_name" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 4b. Execute provision network commands to actually create private endpoints for the above mentioned rules.\n", + "\n", + "Provision network command will create PE's from the managed vnet where the materialization job will execute to the source, offline store, observation data, default blob store for the featurestore and the default keyvault for the featurestore. This command can take 10-15 minutes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661066505 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "#### Provision network to create necessary PE's (it may take 15-20 mins)\n", + "!az ml workspace provision-network --name $featurestore_name --resource-group $featurestore_resource_group_name --include-spark" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661072566 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "### Check that managed vnet is correctly enabled\n", + "### After provisioning the network, all the outbound rules should become active\n", + "### For this tutorial, you will see 5 outbound rules\n", + "!az ml workspace show --name $featurestore_name --resource-group $featurestore_resource_group_name" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Step 5. Update Managed Vnet for project workspace (current workspace)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661073321 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# lookup the subscription id, resource group and workspace name of the current workspace\n", + "project_ws_sub_id = os.environ[\"AZUREML_ARM_SUBSCRIPTION\"]\n", + "project_ws_rg = os.environ[\"AZUREML_ARM_RESOURCEGROUP\"]\n", + "project_ws_name = os.environ[\"AZUREML_ARM_WORKSPACE_NAME\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 5a. Update project workspace with necessary outbound rules.\n", + "\n", + "Project workspace needs access to the following resources :\n", + "- Source data\n", + "- Offline store\n", + "- Observation data\n", + "- Featurestore\n", + "- Default storage account of featurestore" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661073858 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# The below code creates a configuration for managed-vnet for the feature store workspace\n", + "import yaml\n", + "\n", + "config = {\n", + " \"managed_network\": {\n", + " \"isolation_mode\": \"allow_internet_outbound\",\n", + " \"outbound_rules\": [\n", + " # Incase you have separate storage accounts for source, observation data and offline store, you need to add multiple rules here . No action needed otherwise.\n", + " {\n", + " \"name\": \"projectsourcerule\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"dfs\",\n", + " \"service_resource_id\": f\"/subscriptions/{storage_subscription_id}/resourcegroups/{storage_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{storage_account_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " # Rule to create PE to default storage of feature store\n", + " {\n", + " \"name\": \"defaultfsstoragerule\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"blob\",\n", + " \"service_resource_id\": f\"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Storage/storageAccounts/{default_fs_storage_account_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " # Rule to create PE to default key vault of feature store\n", + " {\n", + " \"name\": \"defaultfskeyvaultrule\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"vault\",\n", + " \"service_resource_id\": f\"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.Keyvault/vaults/{default_key_vault_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " # Rule to create PE to featurestore\n", + " {\n", + " \"name\": \"featurestorerule\",\n", + " \"destination\": {\n", + " \"spark_enabled\": \"true\",\n", + " \"subresource_target\": \"amlworkspace\",\n", + " \"service_resource_id\": f\"/subscriptions/{featurestore_subscription_id}/resourcegroups/{featurestore_resource_group_name}/providers/Microsoft.MachineLearningServices/workspaces/{featurestore_name}\",\n", + " },\n", + " \"type\": \"private_endpoint\",\n", + " },\n", + " ],\n", + " }\n", + "}\n", + "\n", + "project_ws_managed_vnet_yaml = (\n", + " root_dir + \"/featurestore/project_ws_managed_vnet_config.yaml\"\n", + ")\n", + "\n", + "with open(project_ws_managed_vnet_yaml, \"w\") as outfile:\n", + " yaml.dump(config, outfile, default_flow_style=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az ml workspace update --file $project_ws_managed_vnet_yaml --name $project_ws_name --resource-group $project_ws_rg" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "!az ml workspace show --name $project_ws_name --resource-group $project_ws_rg" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step : Prototype and develop a transaction rolling aggregation featureset in this notebook" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 6a: Explore the transactions source data\n", + "\n", + "#### Note\n", + "The sample data used in this notebook is hosted in a public accessible blob container. It can only be read in Spark via `wasbs` driver. When you create feature sets using your own source data, please host them in adls gen2 account and use `abfss` driver in the data path. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661554645 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "explore-txn-src-data", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# remove the \".\" in the roor directory path as we need to generate absolute path to read from spark\n", + "transactions_source_data_path = f\"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/*.parquet\"\n", + "transactions_src_df = spark.read.parquet(transactions_source_data_path)\n", + "\n", + "display(transactions_src_df.head(5))\n", + "# Note: display(training_df.head(5)) displays the timestamp column in a different format. You can can call transactions_src_df.show() to see correctly formatted value" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 6b: Develop a transactions featureset locally\n", + "\n", + "Featureset specification is a self-contained definition of feature set that can be developed and tested locally.\n", + "\n", + "Lets create the following rolling window aggregate features:\n", + "- transactions 3-day count\n", + "- transactions amount 3-day sum\n", + "- transactions amount 3-day avg\n", + "- transactions 7-day count\n", + "- transactions amount 7-day sum\n", + "- transactions amount 7-day avg\n", + "\n", + "__Action__:\n", + "- Inspect the feature transformation code file: `featurestore/featuresets/transactions/spec/transformation_code/transaction_transform.py`. You will see how is the rolling aggregation defined for the features. This is a spark transformer.\n", + "\n", + "To understand the feature set and transformations in more detail, see [feature store concepts](fs-concepts-url-todo) and [transformation concepts](fs-transformation-concepts-todo)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688661563999 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "develop-txn-fset-locally", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azureml.featurestore import create_feature_set_spec, FeatureSetSpec\n", + "from azureml.featurestore.contracts import (\n", + " DateTimeOffset,\n", + " FeatureSource,\n", + " TransformationCode,\n", + " Column,\n", + " ColumnType,\n", + " SourceType,\n", + " TimestampColumn,\n", + ")\n", + "\n", + "\n", + "transactions_featureset_code_path = (\n", + " root_dir + \"/featurestore/featuresets/transactions/transformation_code\"\n", + ")\n", + "\n", + "transactions_featureset_spec = create_feature_set_spec(\n", + " source=FeatureSource(\n", + " type=SourceType.parquet,\n", + " path=f\"abfss://{storage_file_system_name_source_data}@{storage_account_name}.dfs.core.windows.net/transactions-source/*.parquet\",\n", + " timestamp_column=TimestampColumn(name=\"timestamp\"),\n", + " source_delay=DateTimeOffset(days=0, hours=0, minutes=20),\n", + " ),\n", + " transformation_code=TransformationCode(\n", + " path=transactions_featureset_code_path,\n", + " transformer_class=\"transaction_transform.TransactionFeatureTransformer\",\n", + " ),\n", + " index_columns=[Column(name=\"accountID\", type=ColumnType.string)],\n", + " source_lookback=DateTimeOffset(days=7, hours=0, minutes=0),\n", + " temporal_join_lookback=DateTimeOffset(days=1, hours=0, minutes=0),\n", + " infer_schema=True,\n", + ")\n", + "# Generate a spark dataframe from the feature set specification\n", + "transactions_fset_df = transactions_featureset_spec.to_spark_dataframe()\n", + "# display few records\n", + "display(transactions_fset_df.head(5))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 6c: Export as feature set spec\n", + "Inorder to register the feature set spec with the feature store, it needs to be saved in a specific format. \n", + "Action: Please inspect the generated `transactions` FeaturesetSpec: Open this file from the file tree to see the spec: `featurestore/featuresets/accounts/spec/FeaturesetSpec.yaml`\n", + "\n", + "Spec contains these important elements:\n", + "\n", + "1. `source`: reference to a storage. In this case a parquet file in a blob storage.\n", + "1. `features`: list of features and their datatypes. If you provide transformation code (see Day 2 section), the code has to return a dataframe that maps to the features and datatypes.\n", + "1. `index_columns`: the join keys required to access values from the feature set\n", + "\n", + "Learn more about it in the [top level feature store entities document](fs-concepts-todo) and the [feature set spec yaml reference](reference-yaml-featureset-spec.md).\n", + "\n", + "The additional benefit of persisting it is that it can be source controlled." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688662030197 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "dump-transactions-fs-spec", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "# create a new folder to dump the feature set spec\n", + "transactions_featureset_spec_folder = (\n", + " root_dir + \"/featurestore/featuresets/transactions/spec\"\n", + ")\n", + "\n", + "# check if the folder exists, create one if not\n", + "if not os.path.exists(transactions_featureset_spec_folder):\n", + " os.makedirs(transactions_featureset_spec_folder)\n", + "\n", + "transactions_featureset_spec.dump(transactions_featureset_spec_folder)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step 7: Register a feature-store entity\n", + "Entity helps enforce best practice that same join key definitions are used across featuresets which uses the same logical entities. Examples of entities are account entity, customer entity etc. Entities are typically created once and reused across feature-sets. For information on basics concept of feature store, see [feature store concepts](fs-concepts)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688662055421 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "register-acct-entity-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "account_entity_path = root_dir + \"/featurestore/entities/account.yaml\"\n", + "!az ml feature-store-entity create --file $account_entity_path --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step 8: Register the transaction featureset with the featurestore and submit a materialization job\n", + "You register a feature set asset with the feature store so that you can share and reuse with others. You also get managed capabilities like versioning and materialization (we will learn in this tutorial series).\n", + "\n", + "The feature set asset has reference to the feature set spec that you created earlier and additional properties like version and materialization settings." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 8a: Create a featureset" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688662272689 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "register-txn-fset-cli", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "transactions_featureset_path = (\n", + " root_dir\n", + " + \"/featurestore/featuresets/transactions/featureset_asset_offline_enabled.yaml\"\n", + ")\n", + "!az ml feature-set create --file $transactions_featureset_path --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688662072032 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Preview the newly created featureset\n", + "\n", + "!az ml feature-set show --resource-group $featurestore_resource_group_name --workspace-name $featurestore_name -n transactions -v 1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 8b: Submit a backfill materialization job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688662216849 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "feature_window_start_time = \"2023-02-01T00:00.000Z\"\n", + "feature_window_end_time = \"2023-03-01T00:00.000Z\"\n", + "\n", + "!az ml feature-set backfill --name transactions --version 1 --workspace-name $featurestore_name --resource-group $featurestore_resource_group_name --feature-window-start-time $feature_window_start_time --feature-window-end-time $feature_window_end_time" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688663401276 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "### Check the job status\n", + "\n", + "!az ml job show --name -g $featurestore_resource_group_name -w $featurestore_name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688663338712 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "### List all the materialization jobs for the current featureset\n", + "\n", + "!az ml feature-set list-materialization-operation --name transactions --version 1 -g $featurestore_resource_group_name -w $featurestore_name" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step 9: Generate a training data dataframe using the registered features" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 9a: Load observation data\n", + "\n", + "We start by exploring the observation data. Observation data is typically the core data used in training and inference data. This is then joined with feature data to create the full training data. Observation data is the data captured during the time of the event: in this case it has core transaction data including transaction id, account id, transaction amount. In this case, since it is for training, it also has the target variable appended (is_fraud).\n", + "\n", + "To learn more core concepts including observation data, refer to the docs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1687990501186 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "load-obs-data", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "observation_data_path = f\"abfss://{storage_file_system_name_observation_data}@{storage_account_name}.dfs.core.windows.net/train/*.parquet\"\n", + "observation_data_df = spark.read.parquet(observation_data_path)\n", + "obs_data_timestamp_column = \"timestamp\"\n", + "\n", + "display(observation_data_df)\n", + "# Note: the timestamp column is displayed in a different format. Optionally, you can can call training_df.show() to see correctly formatted value" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 9b: Get the registered featureset and list its features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1687990510143 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "get-txn-fset", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# look up the featureset by providing name and version\n", + "transactions_featureset = featurestore.feature_sets.get(\"transactions\", \"1\")\n", + "# list its features\n", + "transactions_featureset.features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1687990544156 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "print-txn-fset-sample-values", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# print sample values\n", + "display(transactions_featureset.to_spark_dataframe().head(5))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "#### Step 9c: Select features and generate training data\n", + "In this step we will select features that we would like to be part of training data and use the feature store sdk to generate the training data." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1687990567785 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "name": "select-features-and-gen-training-data", + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azureml.featurestore import get_offline_features\n", + "\n", + "# you can select features in pythonic way\n", + "features = [\n", + " transactions_featureset.get_feature(\"transaction_amount_7d_sum\"),\n", + " transactions_featureset.get_feature(\"transaction_amount_7d_avg\"),\n", + "]\n", + "\n", + "# you can also specify features in string form: featurestore:featureset:version:feature\n", + "more_features = [\n", + " \"transactions:1:transaction_3d_count\",\n", + " \"transactions:1:transaction_amount_3d_avg\",\n", + "]\n", + "\n", + "more_features = featurestore.resolve_feature_uri(more_features)\n", + "features.extend(more_features)\n", + "\n", + "# generate training dataframe by using feature data and observation data\n", + "training_df = get_offline_features(\n", + " features=features,\n", + " observation_data=observation_data_df,\n", + " timestamp_column=obs_data_timestamp_column,\n", + ")\n", + "\n", + "# Ignore the message that says feature set is not materialized (materialization is optional). We will enable materialization in the next part of the tutorial.\n", + "display(training_df)\n", + "# Note: the timestamp column is displayed in a different format. Optionally, you can can call training_df.show() to see correctly formatted value" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "You can see how the features are appended to the training data using a point-in-time join.\n", + "\n", + "We have reached the end of the tutorial. Now you have your training data using features from feature store. You can either save it to storage for later use, or run model training on it directly." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## Step 10: Optional next Steps\n", + "\n", + "Now, you have successfully created a secure feature store and submitted a successful materialization run. You can go through the tutorial notebook series to get an understanding of the featurestore. This notebook contained mixture of steps from tutorial series 1 and 2. Please replace the necessary public storage containers used in the other notebooks with the ones created in this notebook for the network isolation.\n", + "- [Tutorial 3: Experiment and train models using features](https://learn.microsoft.com/en-us/azure/machine-learning/tutorial-experiment-train-models-using-features)\n", + "- [Tutorial 4: Enable recurrent materialization and run batch inference](https://learn.microsoft.com/en-us/azure/machine-learning/tutorial-enable-recurrent-materialization-run-batch-inference)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "celltoolbar": "Edit Metadata", + "kernel_info": { + "name": "synapse_pyspark" + }, + "kernelspec": { + "display_name": "Synapse PySpark", + "language": "Python", + "name": "synapse_pyspark" + }, + "language_info": { + "codemirror_mode": "ipython", + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython", + "version": "3.8.0" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_ignore_dictionary": [ + "dataframe", + "featureset", + "operationalization", + "operationalize" + ], + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + }, + "synapse_widget": { + "state": { + "0aed8fac-f840-4534-9183-40cdc3b538f2": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "1a394c71-e12e-4808-a6c4-f6c1ad5554e6": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "2e7e400b-1040-48a9-8072-674506232823": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "30ba0c7c-e0fc-4dff-a45d-4423b8fff6fd": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "30c45d33-bd5d-4b98-8212-2918b729b501": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "9": "1", + "index": 1 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "5": "1143.856282", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 2 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "9": "1", + "index": 3 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 4 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "9": "1", + "index": 5 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "5": "99.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 6 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "9": "1", + "index": 7 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "9": "1", + "index": 8 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "9": "1", + "index": 9 + }, + { + "0": "DDE0B1F6-40B2-44CA-B0A7-AE46453D51A0", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:25:29", + "9": "1", + "index": 10 + }, + { + "0": "E6789403-5C39-4D44-BA7C-3A1F481E718B", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:37:59", + "9": "1", + "index": 11 + }, + { + "0": "287F81B6-06F6-4C3B-8714-401FA70EC7DA", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:29:49", + "9": "1", + "index": 12 + }, + { + "0": "5CE4020A-ABA5-4B60-9BC3-131A126670C6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:03:22", + "9": "1", + "index": 13 + }, + { + "0": "A1979FD7-32C8-4BE2-AB5F-3FFDDD7C584A", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:24:17", + "9": "1", + "index": 14 + }, + { + "0": "11FAFE8A-E9F5-4FB4-BC04-4C96AE6E852F", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:16:26", + "9": "1", + "index": 15 + }, + { + "0": "C110E452-388B-4D53-A271-DE2C06DB410A", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:17:45", + "9": "1", + "index": 16 + }, + { + "0": "667490FD-D4B7-4039-A69B-C4E70A9F5DE3", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:23:04", + "9": "1", + "index": 17 + }, + { + "0": "E617D42C-798C-455C-8372-BC06259DE735", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:11:03", + "9": "1", + "index": 18 + }, + { + "0": "ACB1088D-CB05-45F9-9B3E-4709989A7443", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:06:03", + "9": "1", + "index": 19 + }, + { + "0": "51729D46-986A-4AD6-927B-959AA1FF1749", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:35:19", + "9": "1", + "index": 20 + }, + { + "0": "81D69AD5-E46F-46A4-8317-14C6F2908E0D", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:32:17", + "9": "1", + "index": 21 + }, + { + "0": "A45B5295-84D3-47CD-AFA3-E074A9DF9EF6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:43:38", + "9": "1", + "index": 22 + }, + { + "0": "E44AA2DD-8814-4746-839A-4A3D8EE5F243", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:12:20", + "9": "1", + "index": 23 + }, + { + "0": "DE15CA12-F07E-4C7C-9C30-19EF38B2B3E6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:42:16", + "9": "1", + "index": 24 + }, + { + "0": "5F5F30FC-7EA0-41CE-B5A4-FA459FDDBE38", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:09:49", + "9": "1", + "index": 25 + }, + { + "0": "B2F718B0-6639-44C6-9E86-04BCCB6765B6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:15:03", + "9": "1", + "index": 26 + }, + { + "0": "A8E3D8C2-10C0-429E-B6E1-743A0D5C3C17", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:26:46", + "9": "1", + "index": 27 + }, + { + "0": "AC86DB3A-EEED-44C1-85CF-79DA0AF47B0F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:39:29", + "9": "1", + "index": 28 + }, + { + "0": "A161FE84-6920-43CD-9AFE-7D1A04800640", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:20:14", + "9": "1", + "index": 29 + }, + { + "0": "D0F517D0-F18C-41DE-A53F-65C3264C4C5E", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:13:40", + "9": "1", + "index": 30 + }, + { + "0": "B117C813-5EB9-4747-92B5-C52D520AC13F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:36:39", + "9": "1", + "index": 31 + }, + { + "0": "AED3F5DA-87AB-45C8-A0FF-426E353FB102", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:31:04", + "9": "1", + "index": 32 + }, + { + "0": "4BCAC6B0-3937-47E3-9AB8-6519D09321B1", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:01:57", + "9": "1", + "index": 33 + }, + { + "0": "FEE49FF0-87EB-402B-8EBB-8F9F4C9CB225", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:33:55", + "9": "1", + "index": 34 + }, + { + "0": "826E2F8E-D033-4287-A065-A26210923F90", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:40:40", + "9": "1", + "index": 35 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 36 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 37 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 38 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "9": "1", + "index": 39 + }, + { + "0": "72399945-3AC5-461E-BF85-228552DF71E1", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:35:42", + "9": "1", + "index": 40 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 41 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "9": "1", + "index": 42 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "9": "1", + "index": 43 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "9": "1", + "index": 44 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "9": "1", + "index": 45 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "9": "1", + "index": 46 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "9": "1", + "index": 47 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "9": "1", + "index": 48 + }, + { + "0": "5AF9F5B3-7386-426B-878E-3F1B7BBF48D9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:56:55", + "9": "1", + "index": 49 + }, + { + "0": "9E012F96-E7AA-4046-8F24-0C85FBB36CF5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:07:57", + "9": "1", + "index": 50 + }, + { + "0": "68D83F37-50D4-484B-8652-EAA245BFD48D", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:33:26", + "9": "1", + "index": 51 + }, + { + "0": "2DC3FDC7-C677-4479-A4C4-85C9A5E2F4FC", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:11:32", + "9": "1", + "index": 52 + }, + { + "0": "1353C004-23CE-4887-8611-0986140B9411", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:22:26", + "9": "1", + "index": 53 + }, + { + "0": "6D96EB12-FD10-4D59-8262-C477E3B4A7FF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:18:40", + "9": "1", + "index": 54 + }, + { + "0": "64A65086-D78C-4C67-994D-06DC95737FB5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:09:49", + "9": "1", + "index": 55 + }, + { + "0": "4186FC50-1BBE-4188-94FD-5659E850B7A3", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:45:29", + "9": "1", + "index": 56 + }, + { + "0": "442116BE-E400-48F2-80E8-C15B1DECFB1E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:51:35", + "9": "1", + "index": 57 + }, + { + "0": "61841EEB-00BE-478C-8142-677F86A55BD1", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:26:54", + "9": "1", + "index": 58 + }, + { + "0": "73F74DE9-9679-417D-A7A8-6D1D74769D9D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:28:23", + "9": "1", + "index": 59 + }, + { + "0": "298F7C38-80B2-4CC3-8D84-29A2B5B7797C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:48:42", + "9": "1", + "index": 60 + }, + { + "0": "4B54A952-E219-4AD1-8DB2-CAD464FCC43A", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:46:44", + "9": "1", + "index": 61 + }, + { + "0": "D02E8FB4-3170-4C47-8886-ABE470F197C3", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:03:30", + "9": "1", + "index": 62 + }, + { + "0": "3F556D13-8CCB-400E-B9BD-582162BE610B", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:36:12", + "9": "1", + "index": 63 + }, + { + "0": "897B514D-E758-4690-84B8-6549559C52EE", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:50:29", + "9": "1", + "index": 64 + }, + { + "0": "985F137B-2E34-46E7-9AB6-EBF9D2C220F4", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:06:48", + "9": "1", + "index": 65 + }, + { + "0": "D247B57A-BE03-44A2-ABCB-E73EA6FCD843", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:29:52", + "9": "1", + "index": 66 + }, + { + "0": "40F8D07E-67EF-4678-8612-FC130DC84F5E", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:00:08", + "9": "1", + "index": 67 + }, + { + "0": "F15CE4DA-A189-42BF-931E-66398ED48CA6", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:21:51", + "9": "1", + "index": 68 + }, + { + "0": "973F228D-6E34-4E2C-A8ED-86A560FFE993", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:37:33", + "9": "1", + "index": 69 + }, + { + "0": "BCBDF6C6-1D5A-42F2-A912-E295526FF9B7", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:04:05", + "9": "1", + "index": 70 + }, + { + "0": "C1040C0D-A701-4AD0-B4E3-1BC1F06AB4AA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:13:25", + "9": "1", + "index": 71 + }, + { + "0": "4C5EC030-CD2E-4097-B706-42BE9D808509", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:05:37", + "9": "1", + "index": 72 + }, + { + "0": "3CF32319-BFF3-4CFE-8792-8C4775AD619F", + "1": "A1899946873142120", + "2": "99.98", + "3": "13.0", + "4": "2023-01-03 18:45:18", + "9": "1", + "index": 73 + }, + { + "0": "F6FBBB59-BFD5-4736-B635-64301B04D71C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:42:53", + "9": "1", + "index": 74 + }, + { + "0": "AD22A063-D3FB-4623-B7A2-69A6C8E5CEE0", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:53:28", + "9": "1", + "index": 75 + }, + { + "0": "9E9BB950-7681-4213-B8D7-1E71AE232C43", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:55:40", + "9": "1", + "index": 76 + }, + { + "0": "4EC3DEEC-D21B-4515-A3DE-5CC895397F21", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:59:16", + "9": "1", + "index": 77 + }, + { + "0": "2120F51D-E109-4481-88D7-023757351EDF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:05:23", + "9": "1", + "index": 78 + }, + { + "0": "D8EFBBA0-BEF9-4BEA-A6F0-4A5CBE4C1287", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:09:43", + "9": "1", + "index": 79 + }, + { + "0": "C2440D4D-3768-4108-BCAF-E43441537783", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:38:15", + "9": "1", + "index": 80 + }, + { + "0": "19DB47CE-E027-4D8D-8439-ADCC4BBE9879", + "1": "A1899946873142120", + "2": "59.99", + "3": "13.0", + "4": "2023-01-03 18:42:51", + "9": "1", + "index": 81 + }, + { + "0": "88A8FA38-800E-459D-A11C-77477E41FC5B", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:08:13", + "9": "1", + "index": 82 + }, + { + "0": "038E2738-E619-431A-8597-5952B7710EF8", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:20:26", + "9": "1", + "index": 83 + }, + { + "0": "34DE06CA-82E2-44D3-8E83-E650A493EE27", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:50:42", + "9": "1", + "index": 84 + }, + { + "0": "DDBCD8B8-C45B-45BB-8373-E184F6776E09", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:01:13", + "9": "1", + "index": 85 + }, + { + "0": "2FF854D4-3A50-4F9B-9AF9-861612051389", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:33:06", + "9": "1", + "index": 86 + }, + { + "0": "BE25CE28-7142-4EB4-8157-77654E4816D0", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:24:35", + "9": "1", + "index": 87 + }, + { + "0": "57C6D5D6-43F4-4BD0-9FF5-67E4BB395B99", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:15:43", + "9": "1", + "index": 88 + }, + { + "0": "F5606360-D929-4903-8771-E51207DAF2C6", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:53:31", + "9": "1", + "index": 89 + }, + { + "0": "7898FC86-CDBF-469B-B369-5E70B9BAC1F1", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:01:54", + "9": "1", + "index": 90 + }, + { + "0": "AF64911E-A295-4337-BBAF-835F82DD77BA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:41:16", + "9": "1", + "index": 91 + }, + { + "0": "F825E26E-89D0-43AB-B281-D62588C4779A", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:49:42", + "9": "1", + "index": 92 + }, + { + "0": "C7D4CBEF-2E68-41A2-B83A-D064795E296E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:16:55", + "9": "1", + "index": 93 + }, + { + "0": "A75939D1-EE17-4E78-8478-6937CD08D5E9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:52:01", + "9": "1", + "index": 94 + }, + { + "0": "422D5F57-6B6E-4803-AD06-9BF33330F102", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:48:55", + "9": "1", + "index": 95 + }, + { + "0": "CA193A45-31F8-4EB5-A19D-BF5D2602277D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:40:11", + "9": "1", + "index": 96 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 97 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 98 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 99 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 100 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 101 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 102 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 103 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "9": "1", + "index": 104 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "9": "1", + "index": 105 + }, + { + "0": "90BAD1BA-E6EE-4EA6-B27F-7162B22CDBFA", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:39:16", + "9": "1", + "index": 106 + }, + { + "0": "D2CE31CE-7D5A-4E80-8D3E-F2E184DFAC98", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:27:17", + "9": "1", + "index": 107 + }, + { + "0": "8875BFC3-B41E-416A-A334-65EB49672BEC", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:29:02", + "9": "1", + "index": 108 + }, + { + "0": "6B3337E4-83E7-49DA-97BA-D0DC2B44F42F", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:41:07", + "9": "1", + "index": 109 + }, + { + "0": "9D92C6BC-E560-4C32-A034-1E1F0814E46E", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:42:58", + "9": "1", + "index": 110 + }, + { + "0": "E9D36D5B-FDCD-440A-BC1A-C53A9110CF22", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:46:52", + "9": "1", + "index": 111 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "5": "107.52", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 112 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 113 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "9": "1", + "index": 114 + }, + { + "0": "4324B9F6-5D21-4327-B80F-99057A3B541C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:33:20", + "9": "1", + "index": 115 + }, + { + "0": "EFFCEF09-9E31-4B39-AD1B-8E169D27C749", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:34:26", + "9": "1", + "index": 116 + }, + { + "0": "28C2478A-7236-40ED-A5C4-5BB8A29E561B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:43:14", + "9": "1", + "index": 117 + }, + { + "0": "EAD34905-DE0B-4FC8-A4AE-C2248AF29A08", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:37:32", + "9": "1", + "index": 118 + }, + { + "0": "7DDF174A-C6BF-4245-8148-650BBEC82DA8", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:36:35", + "9": "1", + "index": 119 + }, + { + "0": "D3F14FD5-C8C3-4401-8053-A5DCB4086473", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:30:44", + "9": "1", + "index": 120 + }, + { + "0": "92C5B50A-E46E-404D-9EFB-7043D6DD7C68", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:32:00", + "9": "1", + "index": 121 + }, + { + "0": "D1884A1A-0865-47C3-A8DC-43DC991D661C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:41:02", + "9": "1", + "index": 122 + }, + { + "0": "F7690559-B2FA-42E4-910F-DF65A0250586", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:29:47", + "9": "1", + "index": 123 + }, + { + "0": "17B73DB4-D6C9-4F0D-A8CA-A1BD9334FABC", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:42:15", + "9": "1", + "index": 124 + }, + { + "0": "A3BEE7DE-D634-4C72-A05D-77A80D7D613B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:44:48", + "9": "1", + "index": 125 + }, + { + "0": "A25BC911-EAA9-47D1-B8D2-4086F6CC94CB", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:35:29", + "9": "1", + "index": 126 + }, + { + "0": "B30F54F2-BBB5-4DFC-B4D6-F3BA03220790", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:28:43", + "9": "1", + "index": 127 + }, + { + "0": "8D4F3115-A1D5-459A-A847-A4C3E43A74A7", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:39:35", + "9": "1", + "index": 128 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 129 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "9": "1", + "index": 130 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 131 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "9": "1", + "index": 132 + }, + { + "0": "EE63EE82-8A5F-4422-8CFA-3CF0C48D05FD", + "1": "A1688853524321290", + "2": "49.98", + "3": "19.0", + "4": "2023-01-05 00:32:25", + "9": "1", + "index": 133 + }, + { + "0": "14B43B88-2D00-4D03-BDDA-3484C0D86769", + "1": "A1688853524321290", + "2": "24.99", + "3": "19.0", + "4": "2023-01-05 00:26:00", + "9": "1", + "index": 134 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "5": "74.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 135 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "9": "1", + "index": 136 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "5": "24.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 137 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "9": "1", + "index": 138 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "5": "442.12214400000005", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 139 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "9": "1", + "index": 140 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 141 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "9": "1", + "index": 142 + }, + { + "0": "53F9A1F3-DB12-474B-8E9B-E6ADF22699AF", + "1": "A914800996051170", + "2": "139.99", + "3": "17.0", + "4": "2023-01-07 22:30:40", + "9": "1", + "index": 143 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 144 + }, + { + "0": "D1A1DEF3-8373-40A4-8337-742C4BC68770", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:50:44", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 145 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "9": "1", + "index": 146 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 147 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "9": "1", + "index": 148 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 149 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "9": "1", + "index": 150 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 151 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "9": "1", + "index": 152 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "5": "279.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 153 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "9": "1", + "index": 154 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "5": "176.66415", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 155 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "9": "1", + "index": 156 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 157 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "9": "1", + "index": 158 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "5": "145.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 159 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "9": "1", + "index": 160 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "5": "86.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 161 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "9": "1", + "index": 162 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "9": "1", + "index": 163 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "9": "1", + "index": 164 + }, + { + "0": "CA5F63D9-CA1B-41E6-8C42-7F89EA103D1D", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:31:01", + "9": "1", + "index": 165 + }, + { + "0": "0A82E4ED-93EC-4386-AA16-0EA1FC946B6C", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 19:20:25", + "9": "1", + "index": 166 + }, + { + "0": "D1834580-E9C8-4D34-9433-0BA410FA0DF4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:30:31", + "9": "1", + "index": 167 + }, + { + "0": "DE53E28B-69C9-4C7D-AF79-E725235C87F4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:31:56", + "9": "1", + "index": 168 + }, + { + "0": "9E492C70-9940-4103-9414-FC8F0C741490", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:27:34", + "9": "1", + "index": 169 + }, + { + "0": "DABB8679-0A5B-46D1-9421-D443A45907F8", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:48:21", + "9": "1", + "index": 170 + }, + { + "0": "630F1681-99D1-4F3C-BCE0-69C6B28E5A98", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:43:12", + "9": "1", + "index": 171 + }, + { + "0": "961FCF4A-7930-4C04-B37B-A5FDFA414D9E", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:41:14", + "9": "1", + "index": 172 + }, + { + "0": "41F4234C-1659-48C5-A9D1-4C2324A0891B", + "1": "A1899946895455190", + "2": "19.99", + "3": "11.0", + "4": "2023-01-13 16:52:56", + "9": "1", + "index": 173 + }, + { + "0": "6A2D4479-6262-4C32-95B5-AC5BE0205E24", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:47:34", + "9": "1", + "index": 174 + }, + { + "0": "F3606B8D-3008-4781-AC9C-BA159F1BF3B5", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:24:09", + "9": "1", + "index": 175 + }, + { + "0": "99E39E43-B8E7-48C8-8C6E-EE09902A63E0", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:36:07", + "9": "1", + "index": 176 + }, + { + "0": "B375BB8C-242A-4DC6-8FC3-F35EA5ADDADD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:21:25", + "9": "1", + "index": 177 + }, + { + "0": "E112F541-98DE-420B-B009-FAA21420164B", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:00", + "9": "1", + "index": 178 + }, + { + "0": "4A7523C3-17EE-4AB6-92D9-6535A3A41331", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:22:20", + "9": "1", + "index": 179 + }, + { + "0": "2F6CE5C9-1702-4E7A-8A88-40CE991E99BB", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:34:17", + "9": "1", + "index": 180 + }, + { + "0": "E7F77A61-785B-4E7D-8C99-6A237E368BC5", + "1": "A1899946895455190", + "2": "19.99", + "3": "12.0", + "4": "2023-01-13 17:22:25", + "9": "1", + "index": 181 + }, + { + "0": "C077446E-640F-4769-9527-5A727F34A4B4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:38:29", + "9": "1", + "index": 182 + }, + { + "0": "27B1F6C4-E881-408C-A29E-CA13AD07997B", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:49:35", + "9": "1", + "index": 183 + }, + { + "0": "DF9AFB75-2D64-4A8A-8743-AA39724E34AD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:39:41", + "9": "1", + "index": 184 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 185 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 186 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 187 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "9": "1", + "index": 188 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "5": "161.722522", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 189 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "9": "1", + "index": 190 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 191 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "9": "1", + "index": 192 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 193 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "9": "1", + "index": 194 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "5": "62.39", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 195 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "9": "1", + "index": 196 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "5": "64.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 197 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "9": "1", + "index": 198 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "5": "79.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 199 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "9": "1", + "index": 200 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "5": "86.74", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 201 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "9": "1", + "index": 202 + }, + { + "0": "06CA7673-9504-44D4-A9B1-49EC29233AD5", + "1": "A844428040495230", + "2": "73.11", + "3": "13.0", + "4": "2023-01-19 18:43:29", + "9": "1", + "index": 203 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 204 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "9": "1", + "index": 205 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "5": "237.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 206 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "9": "1", + "index": 207 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 208 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "9": "1", + "index": 209 + }, + { + "0": "CFF67307-A9EF-43AC-AE45-D448E2991474", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:39:12", + "9": "1", + "index": 210 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "5": "157.474251", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 211 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "9": "1", + "index": 212 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "5": "62.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 213 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "9": "1", + "index": 214 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 215 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "9": "1", + "index": 216 + }, + { + "0": "98D7E9CF-D308-4B97-BF45-00263A93B702", + "1": "A914801004943538", + "2": "59.99", + "4": "2023-01-20 02:02:01", + "9": "1", + "index": 217 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "5": "31.94", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 218 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "9": "1", + "index": 219 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 220 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "9": "1", + "index": 221 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "5": "259.62185800000003", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 222 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "9": "1", + "index": 223 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "5": "102.48", + "6": "false", + "7": "2.0", + "8": "1.0", + "9": "1", + "index": 224 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "9": "1", + "index": 225 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "5": "149.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 226 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "9": "1", + "index": 227 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 228 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "9": "1", + "index": 229 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "5": "626.16465", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 230 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "9": "1", + "index": 231 + }, + { + "0": "C8AA8B84-1C89-4B76-B2BF-3C10C3444D89", + "1": "A914801007105746", + "2": "80.73", + "3": "9.0", + "4": "2023-01-25 18:07:59", + "9": "1", + "index": 232 + }, + { + "0": "F2CD36F5-0FC9-4DBF-9D5A-D6B043795C0C", + "1": "A914801007105746", + "2": "83.06", + "3": "8.0", + "4": "2023-01-23 16:39:58", + "9": "1", + "index": 233 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "5": "93.85", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 234 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "9": "1", + "index": 235 + }, + { + "0": "A8410FBF-9EE3-4200-A0ED-05631423E0F9", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 08:58:29", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 236 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 237 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "9": "1", + "index": 238 + }, + { + "0": "13A9B365-CFF1-44F7-A1EB-19327EDE18C2", + "1": "A1688853647393240", + "2": "295.38", + "3": "8.0", + "4": "2023-01-25 16:49:33", + "9": "1", + "index": 239 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "5": "147.69", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 240 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "9": "1", + "index": 241 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 242 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "9": "1", + "index": 243 + }, + { + "0": "CACD0238-79D3-4506-B78A-F24E494B3AAC", + "1": "A1055521395048230", + "2": "81.6", + "3": "2.0", + "4": "2023-01-25 08:02:13", + "9": "1", + "index": 244 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "5": "83.14", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 245 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "9": "1", + "index": 246 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "5": "134.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 247 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "9": "1", + "index": 248 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "5": "80.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 249 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "9": "1", + "index": 250 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 251 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "9": "1", + "index": 252 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 253 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "9": "1", + "index": 254 + }, + { + "0": "C09DE962-3605-4A0E-B82F-A09B2B618D1F", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:54:27", + "9": "1", + "index": 255 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 256 + }, + { + "0": "C61F74AD-F654-4042-9DFF-567978FA7CF7", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:57:11", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 257 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "9": "1", + "index": 258 + }, + { + "0": "A92EA0F2-90D5-413B-A2FE-8A91F3DA1255", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:50:57", + "9": "1", + "index": 259 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 260 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "9": "1", + "index": 261 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "5": "231.56", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 262 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "9": "1", + "index": 263 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "5": "102.999897", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 264 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "9": "1", + "index": 265 + }, + { + "0": "F1FE235C-84E4-4770-BA47-2F70994718C1", + "1": "A914801011218316", + "2": "330.86", + "3": "17.0", + "4": "2023-02-12 23:03:05", + "9": "1", + "index": 266 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "5": "224.11", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 267 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "9": "1", + "index": 268 + }, + { + "0": "3FBAFD91-D3AC-41CB-BC17-4CAAAC0C52EA", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:36:34", + "9": "1", + "index": 269 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 270 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "9": "1", + "index": 271 + }, + { + "0": "56BAD8D6-088E-4AD9-99E4-2C23D10C32B0", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:48:24", + "9": "1", + "index": 272 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 273 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "9": "1", + "index": 274 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "5": "65.54", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 275 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "9": "1", + "index": 276 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "5": "106.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 277 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "9": "1", + "index": 278 + }, + { + "0": "0C064A95-7D41-4C84-A18E-816228CAB89E", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:56:13", + "9": "1", + "index": 279 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 280 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "9": "1", + "index": 281 + }, + { + "0": "E261B8E8-F241-46F3-89AA-5CC0283C8040", + "1": "A985156999024771", + "2": "92.5", + "3": "2.0", + "4": "2023-02-01 10:37:54", + "9": "1", + "index": 282 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "5": "93.07", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 283 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "9": "1", + "index": 284 + }, + { + "0": "105FE6E4-4E43-4042-937C-4E6748781A3D", + "1": "A914801012822158", + "2": "92.63", + "3": "0.0", + "4": "2023-02-03 05:37:23", + "9": "1", + "index": 285 + }, + { + "0": "6BA9D314-0ECC-425F-BCA8-FE3DC74581C8", + "1": "A914801012822158", + "2": "104.25", + "3": "6.0", + "4": "2023-02-01 11:41:23", + "9": "1", + "index": 286 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 287 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "9": "1", + "index": 288 + }, + { + "0": "A5D379FD-D933-4F68-8763-0C5AF07F7834", + "1": "A914801013785993", + "2": "86.98", + "3": "4.0", + "4": "2023-02-03 09:47:07", + "9": "1", + "index": 289 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "5": "95.02", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 290 + }, + { + "0": "3CFD786C-1D49-4D2D-94DA-C3A0E26ACB02", + "1": "A914801013785993", + "2": "93.94", + "3": "0.0", + "4": "2023-02-08 06:19:27", + "5": "93.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 291 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "9": "1", + "index": 292 + }, + { + "0": "AB06E897-E5CB-408B-957A-9E77B9EBD71E", + "1": "A914801013775218", + "2": "93.62", + "3": "9.0", + "4": "2023-02-02 14:49:48", + "9": "1", + "index": 293 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 294 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "9": "1", + "index": 295 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "5": "170.67264", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 296 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "9": "1", + "index": 297 + }, + { + "0": "AF5BC5D5-9280-4F4A-860B-D8A4772823AD", + "1": "A985157000299534", + "2": "281.37", + "3": "14.0", + "4": "2023-02-03 19:43:12", + "9": "1", + "index": 298 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 299 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "9": "1", + "index": 300 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 301 + }, + { + "0": "AFC2F084-490B-4B4F-AF6A-05B999BC0C81", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:45:40", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 302 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "9": "1", + "index": 303 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "5": "346.462251", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 304 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "9": "1", + "index": 305 + }, + { + "0": "ECC38318-E094-4FAA-9638-6C664AB49DB8", + "1": "A985157000491580", + "2": "299.0", + "3": "19.0", + "4": "2023-02-05 10:03:12", + "9": "1", + "index": 306 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "5": "418.129547", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 307 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "9": "1", + "index": 308 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 309 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "9": "1", + "index": 310 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 311 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "9": "1", + "index": 312 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "9": "1", + "index": 313 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 314 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 315 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "9": "1", + "index": 316 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "5": "149.93", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 317 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "9": "1", + "index": 318 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "5": "64.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 319 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "9": "1", + "index": 320 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "5": "21.6", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 321 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "9": "1", + "index": 322 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 323 + }, + { + "0": "9B6410A2-B896-4E0E-9929-B3D3FF23D091", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:43:38", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 324 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "9": "1", + "index": 325 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "5": "99.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 326 + }, + { + "0": "23FB57DD-40E6-49D4-8F47-29EC2357E548", + "1": "A564049508937862", + "2": "0.0", + "4": "2023-03-06 19:52:07", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 327 + }, + { + "0": "EC085107-C5DF-4814-8E31-374D3D8BD5AD", + "1": "A564049508937862", + "2": "482.68", + "3": "10.0", + "4": "2023-03-06 18:31:45", + "5": "482.68", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 328 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "9": "1", + "index": 329 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "9": "1", + "index": 330 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 331 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 332 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "9": "1", + "index": 333 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "5": "118.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 334 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "9": "1", + "index": 335 + }, + { + "0": "0D385B17-41FC-4D3B-8C36-BFD0FAF6AA20", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:26:33", + "9": "1", + "index": 336 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "5": "423.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 337 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "9": "1", + "index": 338 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 339 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "9": "1", + "index": 340 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "5": "542.25145", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 341 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "9": "1", + "index": 342 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 343 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "9": "1", + "index": 344 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 345 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "9": "1", + "index": 346 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "5": "66.05", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 347 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "9": "1", + "index": 348 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "5": "149.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 349 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "9": "1", + "index": 350 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "5": "1154.4", + "6": "false", + "7": "0.0", + "8": "3.0", + "9": "1", + "index": 351 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "9": "1", + "index": 352 + }, + { + "0": "44D80959-7137-4EDB-AEEE-1B7654A9A2A2", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-23 01:16:41", + "9": "1", + "index": 353 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "5": "119.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 354 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "9": "1", + "index": 355 + }, + { + "0": "C173A9A3-90B7-4B38-8DAC-D001CDD47814", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:51:29", + "9": "1", + "index": 356 + }, + { + "0": "76824E16-8144-4C10-8769-DF9049DE4BB3", + "1": "A1899946873128090", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 03:38:31", + "9": "1", + "index": 357 + }, + { + "0": "D141370E-DD9D-4316-A2F9-A5D8244C61A2", + "1": "A1899946873128090", + "2": "119.98", + "3": "20.0", + "4": "2023-02-15 02:37:52", + "9": "1", + "index": 358 + }, + { + "0": "673A772C-71A1-4541-8468-7298A4FC0844", + "1": "A1899946873128090", + "2": "75.58", + "3": "20.0", + "4": "2023-02-15 02:34:45", + "9": "1", + "index": 359 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "5": "127.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 360 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "9": "1", + "index": 361 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 362 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "9": "1", + "index": 363 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 364 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "9": "1", + "index": 365 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "5": "105.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 366 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "9": "1", + "index": 367 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 368 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "9": "1", + "index": 369 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 370 + }, + { + "0": "BD6E876C-4420-4359-B25A-35BE542F82C0", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:30:03", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 371 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "9": "1", + "index": 372 + }, + { + "0": "66F28A11-228E-4CF9-9872-0677EF57CCCD", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:50:09", + "9": "1", + "index": 373 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "5": "50.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 374 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "9": "1", + "index": 375 + }, + { + "0": "077961F4-BD88-4A14-9607-D267E3882119", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:57:34", + "9": "1", + "index": 376 + }, + { + "0": "6083FE06-FDAB-4725-8CB2-DDB0B978E826", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:58:56", + "9": "1", + "index": 377 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "5": "60.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 378 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "9": "1", + "index": 379 + }, + { + "0": "3826E27E-AAFD-4443-A7E9-A0586D2F0729", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:26:58", + "9": "1", + "index": 380 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "5": "127.18", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 381 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "9": "1", + "index": 382 + }, + { + "0": "5BDE388B-8A30-4D45-8122-F7CA341442C8", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 13:00:25", + "9": "1", + "index": 383 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "5": "53.36", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 384 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "9": "1", + "index": 385 + }, + { + "0": "1935138A-D934-4B52-B3F5-FA99C47F03AC", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:40:57", + "9": "1", + "index": 386 + }, + { + "0": "10366C01-E5BE-4DD8-BD52-1B22971F1F4B", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:39:39", + "9": "1", + "index": 387 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 388 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "9": "1", + "index": 389 + }, + { + "0": "52961216-05ED-4183-8EF5-5237F0352C41", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:17:31", + "9": "1", + "index": 390 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 391 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "9": "1", + "index": 392 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "9": "1", + "index": 393 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "9": "1", + "index": 394 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 395 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 396 + }, + { + "0": "72B7AED1-0944-4DE8-8BEF-74680BBAC3F1", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:55:28", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 397 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 398 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "9": "1", + "index": 399 + }, + { + "0": "4FD412FF-3716-4007-8C81-80FDA381E04A", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:37:03", + "9": "1", + "index": 400 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "5": "53.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 401 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "9": "1", + "index": 402 + }, + { + "0": "E9AE2FFC-1BA4-45CC-858C-DCE5E3BA51B8", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:51:45", + "9": "1", + "index": 403 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "5": "108.38", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 404 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "9": "1", + "index": 405 + }, + { + "0": "D74E0304-9D1B-40AC-8418-33C7FD7FDBD9", + "1": "A844428056745591", + "2": "249.95", + "3": "12.0", + "4": "2023-02-16 20:40:53", + "9": "1", + "index": 406 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "5": "49.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 407 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "9": "1", + "index": 408 + }, + { + "0": "07C1A129-EF6A-4B87-BFE4-C4D4CDF7049B", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:01:39", + "9": "1", + "index": 409 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "5": "54.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 410 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "9": "1", + "index": 411 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "5": "65.16", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 412 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "9": "1", + "index": 413 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "5": "63.95", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 414 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "9": "1", + "index": 415 + }, + { + "0": "D1119E3D-720D-46A4-9772-C456EA3B0D4D", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:46:16", + "9": "1", + "index": 416 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 417 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "9": "1", + "index": 418 + }, + { + "0": "B3FFE8F1-6D4D-49FF-9DC6-97E3F78B18E1", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:49:50", + "9": "1", + "index": 419 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "5": "129.34", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 420 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "9": "1", + "index": 421 + }, + { + "0": "4B1F2669-E141-4218-8048-95E751DCF8F1", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:54:20", + "9": "1", + "index": 422 + }, + { + "0": "87FD50BB-5621-4778-9CBF-604522DDC605", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:36:43", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 423 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 424 + }, + { + "0": "7C8DB972-42E3-4C98-B13B-C338C0714D3F", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:55:32", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 425 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "9": "1", + "index": 426 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "9": "1", + "index": 427 + }, + { + "0": "A23C51AD-50BC-4719-B489-A29643BB3C74", + "1": "A1829582519835540", + "2": "59.99", + "3": "4.0", + "4": "2023-02-17 11:20:25", + "9": "1", + "index": 428 + }, + { + "0": "2589C5DD-012D-429C-A3C1-8333C3ECE2A4", + "1": "A1829582519835540", + "2": "59.99", + "3": "5.0", + "4": "2023-02-17 11:22:08", + "9": "1", + "index": 429 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 430 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 431 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "9": "1", + "index": 432 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "5": "239.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 433 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "9": "1", + "index": 434 + }, + { + "0": "56176B76-FFD4-4252-8BAD-C8F0E105EE2E", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 11:52:43", + "9": "1", + "index": 435 + }, + { + "0": "0B666A57-4CBF-411F-A855-A7B615726FED", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:11:06", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 436 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 437 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "9": "1", + "index": 438 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 439 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "9": "1", + "index": 440 + }, + { + "0": "F815E0BF-EDEA-40BF-9CA7-E529C895BA5E", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:24:44", + "9": "1", + "index": 441 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 442 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "9": "1", + "index": 443 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 444 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "9": "1", + "index": 445 + }, + { + "0": "93796897-06CD-4111-8F2D-E27D5CE46B66", + "1": "A844427218518467", + "2": "157.94", + "3": "18.0", + "4": "2023-02-17 23:30:32", + "9": "1", + "index": 446 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "5": "157.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 447 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "9": "1", + "index": 448 + }, + { + "0": "F461D35F-457F-40E7-BF42-4C116CF0D921", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:48:49", + "9": "1", + "index": 449 + }, + { + "0": "6645E186-2EE1-4F51-883A-7C4333C753C3", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 22:08:38", + "9": "1", + "index": 450 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 451 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "9": "1", + "index": 452 + }, + { + "0": "8B634588-BDD1-4B61-B2C0-00A24CD77D7B", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:07:01", + "9": "1", + "index": 453 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 454 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "9": "1", + "index": 455 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "5": "163.16", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 456 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "9": "1", + "index": 457 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 458 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "9": "1", + "index": 459 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "5": "301.26", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 460 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "9": "1", + "index": 461 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 462 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "9": "1", + "index": 463 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "5": "80.92", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 464 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "9": "1", + "index": 465 + }, + { + "0": "2C8A9E18-E28E-4555-B5F9-98F0D34FCEAE", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:48:28", + "9": "1", + "index": 466 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 467 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "9": "1", + "index": 468 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 469 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "9": "1", + "index": 470 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 471 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "9": "1", + "index": 472 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "5": "156.792046", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 473 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "9": "1", + "index": 474 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 475 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "9": "1", + "index": 476 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 477 + }, + { + "0": "EA8C66F4-8916-4822-85FA-583C2186501A", + "1": "A985156821621035", + "2": "152.03", + "3": "21.0", + "4": "2023-02-22 05:05:07", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 478 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "9": "1", + "index": 479 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "5": "233.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 480 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "9": "1", + "index": 481 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 482 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "9": "1", + "index": 483 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "5": "85.59", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 484 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "9": "1", + "index": 485 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "5": "973.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 486 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "9": "1", + "index": 487 + }, + { + "0": "35AC8DA0-24ED-4461-B732-7994EAC7AD2C", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:23:47", + "9": "1", + "index": 488 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 489 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "9": "1", + "index": 490 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "5": "656.95233", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 491 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "9": "1", + "index": 492 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "5": "1091.15", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 493 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "9": "1", + "index": 494 + }, + { + "0": "4A729E60-7E0A-4080-88C8-A81656F18A24", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:49:26", + "9": "1", + "index": 495 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 496 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "9": "1", + "index": 497 + }, + { + "0": "18C1A371-128D-4C3E-BFA3-AD8A96C5A26E", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:23:32", + "9": "1", + "index": 498 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "5": "228.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 499 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "9": "1", + "index": 500 + }, + { + "0": "A02AA3CD-C055-4B0D-93B3-5D84CFDED0D7", + "1": "A1759222251254350", + "2": "516.24", + "3": "12.0", + "4": "2023-02-21 17:46:31", + "9": "1", + "index": 501 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "5": "514.107929", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 502 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "9": "1", + "index": 503 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 504 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "9": "1", + "index": 505 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 506 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "9": "1", + "index": 507 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "5": "21.71", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 508 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "9": "1", + "index": 509 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 510 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "9": "1", + "index": 511 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 512 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "9": "1", + "index": 513 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "9": "1", + "index": 514 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "9": "1", + "index": 515 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "9": "1", + "index": 516 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "9": "1", + "index": 517 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "9": "1", + "index": 518 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "9": "1", + "index": 519 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "9": "1", + "index": 520 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "9": "1", + "index": 521 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "9": "1", + "index": 522 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "9": "1", + "index": 523 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "9": "1", + "index": 524 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "9": "1", + "index": 525 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "9": "1", + "index": 526 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "9": "1", + "index": 527 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "9": "1", + "index": 528 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "9": "1", + "index": 529 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "9": "1", + "index": 530 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "9": "1", + "index": 531 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "9": "1", + "index": 532 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "9": "1", + "index": 533 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "9": "1", + "index": 534 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "9": "1", + "index": 535 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "9": "1", + "index": 536 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "9": "1", + "index": 537 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "9": "1", + "index": 538 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "9": "1", + "index": 539 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "9": "1", + "index": 540 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "9": "1", + "index": 541 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "9": "1", + "index": 542 + }, + { + "0": "42FC2159-6C83-4CBE-A323-DE9E0546A311", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:34:38", + "9": "1", + "index": 543 + }, + { + "0": "5CAB8F98-F87D-4FB5-8647-F83EF559A9E7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:22", + "9": "1", + "index": 544 + }, + { + "0": "8FBB1DE1-60CE-4F82-A2E8-8CBAB946FED7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:19:02", + "9": "1", + "index": 545 + }, + { + "0": "6EB304F3-0D0F-4767-BFBB-2ACD515CAA42", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:37:35", + "9": "1", + "index": 546 + }, + { + "0": "33615076-74BA-414F-A51C-470C5AFD1FD7", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:37", + "9": "1", + "index": 547 + }, + { + "0": "A6FD29AF-1C86-4558-8D18-89D7F53EC691", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:54", + "9": "1", + "index": 548 + }, + { + "0": "4A4AF956-41C3-4723-8BAD-527243728FE8", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:54", + "9": "1", + "index": 549 + }, + { + "0": "FFF0CCE8-07E1-4100-9491-2853222482EF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:44:10", + "9": "1", + "index": 550 + }, + { + "0": "8DDECA4B-95EF-4FAD-8781-99F8134532FF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:51", + "9": "1", + "index": 551 + }, + { + "0": "E498A57D-E5CF-4883-932E-6B39D7CFF7A0", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:38:18", + "9": "1", + "index": 552 + }, + { + "0": "6DA73B9F-D74B-45A7-82F7-FD10B2840483", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:18", + "9": "1", + "index": 553 + }, + { + "0": "C4F7FAB1-FE05-4F4D-8E52-8C6A3EE96115", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:10", + "9": "1", + "index": 554 + }, + { + "0": "F0A25208-F9BB-401D-A840-36823FB1B0A8", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:34:16", + "9": "1", + "index": 555 + }, + { + "0": "E8CA30F7-3805-48E0-A5E6-6FD71ACF2BE2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:11:36", + "9": "1", + "index": 556 + }, + { + "0": "947519EE-C2DE-42CC-A5CA-B075AEEA05D3", + "1": "A844427390246047", + "2": "5.39", + "3": "22.0", + "4": "2023-02-26 03:30:51", + "9": "1", + "index": 557 + }, + { + "0": "0DF72AD1-2DFD-404E-88A8-965334D9F227", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:38:07", + "9": "1", + "index": 558 + }, + { + "0": "B44556BB-1C72-4B05-B89B-8B078FE110FC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:46", + "9": "1", + "index": 559 + }, + { + "0": "17DA4A53-7EDF-4FE4-A997-3C9AF9255294", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:04", + "9": "1", + "index": 560 + }, + { + "0": "4AD79610-DF94-40EA-AA57-0D0C4C107950", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:19", + "9": "1", + "index": 561 + }, + { + "0": "D2155FC9-8E47-46A6-B8F3-1395DECE7D82", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:35:07", + "9": "1", + "index": 562 + }, + { + "0": "C869ECF0-2A2F-4898-BC65-AD6422144BA5", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:17:22", + "9": "1", + "index": 563 + }, + { + "0": "D1C8D053-633E-457E-AAE3-2CC1801EC80B", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:22:13", + "9": "1", + "index": 564 + }, + { + "0": "411DF6C0-02DE-4D70-977B-EF261BF1D4A1", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:43:06", + "9": "1", + "index": 565 + }, + { + "0": "7E42BCAB-5590-41AD-A18E-8964C2D9CDAA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:38", + "9": "1", + "index": 566 + }, + { + "0": "10F2E1BB-B84B-425E-9CF4-1E9A6AB041D8", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:28:28", + "9": "1", + "index": 567 + }, + { + "0": "CCA3EB41-5AB7-4C77-AFD0-BC552C95E019", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:30", + "9": "1", + "index": 568 + }, + { + "0": "5C9ABE6A-E977-4767-BCC8-A9A0952DB43A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:19:49", + "9": "1", + "index": 569 + }, + { + "0": "1731D105-5F5C-4CEE-955B-AD9B4372603D", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:32:27", + "9": "1", + "index": 570 + }, + { + "0": "CDD70229-CFCE-4192-829D-980CC5F0AD96", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:30:20", + "9": "1", + "index": 571 + }, + { + "0": "69A8BDFE-9310-4098-B8E9-D5C0D938E851", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:43:02", + "9": "1", + "index": 572 + }, + { + "0": "1E8F78CA-543C-46F5-A429-593B1B48D8E9", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:02", + "9": "1", + "index": 573 + }, + { + "0": "06CF9747-053E-4361-8048-CD6D0F16812C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:31", + "9": "1", + "index": 574 + }, + { + "0": "9606F304-48F8-47E9-A666-2BD97690632F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:47", + "9": "1", + "index": 575 + }, + { + "0": "A7FC7EAE-BB1E-4E93-8BFE-E9C1B71792AB", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:49", + "9": "1", + "index": 576 + }, + { + "0": "086FDEAF-BF57-4B51-93F4-169E3609D287", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:44", + "9": "1", + "index": 577 + }, + { + "0": "C54EC40B-86FC-497A-A701-8FBDE5A2375D", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:08:37", + "9": "1", + "index": 578 + }, + { + "0": "D797769A-8A65-47DF-8473-35A29AC81B24", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:15:33", + "9": "1", + "index": 579 + }, + { + "0": "7B14E6C6-F218-4C61-A29A-B3157D7A0E4A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:55", + "9": "1", + "index": 580 + }, + { + "0": "9E41C0F4-5345-4439-B996-52841214F9FE", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:15", + "9": "1", + "index": 581 + }, + { + "0": "7F6AEAAA-ED61-4163-8C5E-289FB74045B4", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:23", + "9": "1", + "index": 582 + }, + { + "0": "D81F2077-E5A4-4DCC-85CB-5D37243F3386", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:53:36", + "9": "1", + "index": 583 + }, + { + "0": "47E230FD-DD71-432D-8EDA-F6F721A0611B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:09", + "9": "1", + "index": 584 + }, + { + "0": "70A54CA5-D32A-4DB1-8F56-B406D827A7B7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:08:34", + "9": "1", + "index": 585 + }, + { + "0": "A76875A6-59E2-4D02-8FF1-48EADE6B83A7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:00:13", + "9": "1", + "index": 586 + }, + { + "0": "FB41B881-4D5F-4357-9363-35FB4856F4B6", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:37", + "9": "1", + "index": 587 + }, + { + "0": "8454CEA5-B059-4E44-8ADE-100460ED0992", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:24", + "9": "1", + "index": 588 + }, + { + "0": "B94780BA-6067-4DAD-AA2A-BACE10FA26EA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:55:42", + "9": "1", + "index": 589 + }, + { + "0": "0550F138-938B-4710-83ED-00EC64D186E3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:04:17", + "9": "1", + "index": 590 + }, + { + "0": "2E0F3E5F-83E2-4414-8D46-00367E4279AD", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:41:39", + "9": "1", + "index": 591 + }, + { + "0": "910E41CD-FF30-4CFB-80F2-9799BDC60C48", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:31:33", + "9": "1", + "index": 592 + }, + { + "0": "9BC1E2D0-E438-4343-B319-212B06186B71", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:01", + "9": "1", + "index": 593 + }, + { + "0": "6A4D6552-8D68-49DA-8B16-D5094B3ED747", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:35:26", + "9": "1", + "index": 594 + }, + { + "0": "88CFD0B0-2A86-4BD2-9CED-4F37E1E9DFFE", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:21:26", + "9": "1", + "index": 595 + }, + { + "0": "3BDC3741-807B-447D-9A8D-9396CB1519BA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:16:10", + "9": "1", + "index": 596 + }, + { + "0": "6867FF41-D687-4B12-B2D2-A7B54F3728B9", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:52", + "9": "1", + "index": 597 + }, + { + "0": "21EB96F0-6C2C-4168-BEEA-A253EE75FE7B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:10", + "9": "1", + "index": 598 + }, + { + "0": "051BDF69-D526-4951-A7E0-9A933A9899FF", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:16:57", + "9": "1", + "index": 599 + }, + { + "0": "A53C943B-A88C-4EB6-9A34-C386E9E8879C", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:53", + "9": "1", + "index": 600 + }, + { + "0": "1580B155-E0E0-40CB-841D-E2A5D2DB0E7E", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:57:02", + "9": "1", + "index": 601 + }, + { + "0": "E8E24E34-5D81-4891-BACF-7CD208CD56D4", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:09:15", + "9": "1", + "index": 602 + }, + { + "0": "1ECF8464-01D3-40DC-AC34-DC665D7839C4", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:14:50", + "9": "1", + "index": 603 + }, + { + "0": "D43FE025-6D1B-4FE0-8E42-BC3E95A76823", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:52", + "9": "1", + "index": 604 + }, + { + "0": "128EAA6F-8869-498D-8ADD-990F268B7F4D", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:35:59", + "9": "1", + "index": 605 + }, + { + "0": "D024ED6A-545B-44B2-827E-D7B9D98C592D", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:23", + "9": "1", + "index": 606 + }, + { + "0": "CFE1CF54-83D2-4396-88F9-7F0E7C2ED586", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:16", + "9": "1", + "index": 607 + }, + { + "0": "A06EBEB4-92ED-4F42-8211-F28EC67E5DF5", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:18:42", + "9": "1", + "index": 608 + }, + { + "0": "2D6EB785-22EC-4879-82A2-C643810EA7C1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:18:56", + "9": "1", + "index": 609 + }, + { + "0": "9C4E2317-10BB-4BDE-AE2F-09EA29B0FD8A", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:14", + "9": "1", + "index": 610 + }, + { + "0": "0A282803-01E1-4193-B72A-F135B850DCB5", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:32:12", + "9": "1", + "index": 611 + }, + { + "0": "1504CCD5-386C-4201-8362-D235C13D93AC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:07:35", + "9": "1", + "index": 612 + }, + { + "0": "547D4C95-528D-46FC-A5A5-FA307B44A329", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:16:20", + "9": "1", + "index": 613 + }, + { + "0": "A5DA7BE5-A6BA-492B-B43E-588713661CDE", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:32", + "9": "1", + "index": 614 + }, + { + "0": "209685D0-27D7-42CE-A3A2-24F643DD387F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:17", + "9": "1", + "index": 615 + }, + { + "0": "5ABD00A4-C232-4D58-8A78-63ABE223F182", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:58", + "9": "1", + "index": 616 + }, + { + "0": "460FA98A-658B-4543-BBC0-EFBFCD7436FD", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:07", + "9": "1", + "index": 617 + }, + { + "0": "A440EC4D-B52B-4F0E-949A-EB6699D67175", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:54", + "9": "1", + "index": 618 + }, + { + "0": "03D4C75E-6EE7-421E-85F5-BD0BF2158BD4", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:33:21", + "9": "1", + "index": 619 + }, + { + "0": "29140357-C78E-4066-9BE5-CB7D5364BBD0", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:56", + "9": "1", + "index": 620 + }, + { + "0": "3F889B35-49FC-47BC-9E5E-2DF06FA12290", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:01", + "9": "1", + "index": 621 + }, + { + "0": "3C38413D-BA5E-4F68-9CE5-BAF48E13DE3C", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:21:29", + "9": "1", + "index": 622 + }, + { + "0": "4560AC71-6EB0-4590-8C1D-F39E8C2B743A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:57", + "9": "1", + "index": 623 + }, + { + "0": "1DA8653D-7E02-48A4-AECA-CF30E3784FD3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:40", + "9": "1", + "index": 624 + }, + { + "0": "566C00BC-EB37-41D8-9202-CCAC36616EB0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:43:37", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 625 + }, + { + "0": "0EB011D9-CAF2-4A02-8ACF-03895BE44128", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:53:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 626 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 627 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 628 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 629 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 630 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 631 + }, + { + "0": "2104E85A-B76B-419E-8204-3EAB76C7D122", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:11:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 632 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 633 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 634 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 635 + }, + { + "0": "D74EFAAF-1FCC-4F41-AB01-317001E86EF1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 19:42:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 636 + }, + { + "0": "01CE8E80-F8C6-4EA6-92A5-4D3077CE9449", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:06:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 637 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 638 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 639 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 640 + }, + { + "0": "5EE5C089-EEC1-40F9-B997-D8EA4BDA79C1", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:19:40", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 641 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 642 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 643 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 644 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 645 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 646 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 647 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 648 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 649 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 650 + }, + { + "0": "EA452A8D-BA16-42A9-BC9E-D2A1ECE62675", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:13:51", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 651 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 652 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 653 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 654 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 655 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 656 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 657 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 658 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 659 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 660 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 661 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "9": "1", + "index": 662 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 663 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "9": "1", + "index": 664 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "5": "1200.68", + "6": "false", + "7": "1.0", + "8": "2.0", + "9": "1", + "index": 665 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "9": "1", + "index": 666 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 667 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "9": "1", + "index": 668 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "9": "1", + "index": 669 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "9": "1", + "index": 670 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 671 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 672 + }, + { + "0": "3BBA55DF-FAE7-4F71-A7E9-2CE883BE50C2", + "1": "A985156290472668", + "2": "5.34", + "3": "8.0", + "4": "2023-02-27 15:11:10", + "5": "5.34", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 673 + }, + { + "0": "7CD9A9C3-3CE1-49B9-8299-039B7955F0F4", + "1": "A985156290472668", + "2": "5.34", + "3": "17.0", + "4": "2023-02-27 22:55:15", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 674 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 675 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "9": "1", + "index": 676 + }, + { + "0": "2E8C3C5B-4ECB-451D-8F50-BD946950FAC4", + "1": "A1899945509487400", + "2": "5.4", + "3": "20.0", + "4": "2023-02-26 02:50:39", + "9": "1", + "index": 677 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "5": "10.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 678 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "9": "1", + "index": 679 + }, + { + "0": "13CC7673-A59D-45CF-8287-2B4E8EE05396", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:46:49", + "9": "1", + "index": 680 + }, + { + "0": "770A0525-2D27-4173-B6BF-A5EA905162DC", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:47:43", + "9": "1", + "index": 681 + }, + { + "0": "CEA84E44-9194-48A0-A5F7-5BFA43E671BF", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:44:44", + "9": "1", + "index": 682 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 683 + }, + { + "0": "25C5DCA0-AACA-4FF2-870E-7A08EC230EF6", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:51:23", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 684 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "9": "1", + "index": 685 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "9": "1", + "index": 686 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "9": "1", + "index": 687 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "9": "1", + "index": 688 + }, + { + "0": "996C6CB5-D9A8-4B88-A723-6A002E6B893F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:44:00", + "9": "1", + "index": 689 + }, + { + "0": "45775ADF-C0C1-4AB2-97A6-BEE6F012632F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:36:29", + "9": "1", + "index": 690 + }, + { + "0": "427FDE58-CA6D-4D48-B528-AD194856D115", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:02:10", + "9": "1", + "index": 691 + }, + { + "0": "5E74AE55-CFA6-4337-9B6B-CA9933D5A6D8", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:06:09", + "9": "1", + "index": 692 + }, + { + "0": "3FC40238-6110-46A6-BE38-CF80320791A1", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:28:41", + "9": "1", + "index": 693 + }, + { + "0": "D7BC1361-E730-4463-9DE7-2B9D92DB5A5B", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:13", + "9": "1", + "index": 694 + }, + { + "0": "441AEEE6-AAA6-40CB-9173-FBEF1C355ACC", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:46:27", + "9": "1", + "index": 695 + }, + { + "0": "9BE72279-7902-492D-9265-744491E4F86D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:16:50", + "9": "1", + "index": 696 + }, + { + "0": "0D43D3F2-A352-4700-8FEC-8E02EF44A514", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:45", + "9": "1", + "index": 697 + }, + { + "0": "D52E262C-77C6-4C20-B9FA-F5A408BED455", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:31:12", + "9": "1", + "index": 698 + }, + { + "0": "8C337F6E-E17F-4CDA-833A-CBEF20C65CF9", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:04:05", + "9": "1", + "index": 699 + }, + { + "0": "218C5731-A37A-4CBA-8D3B-EF20FF23DEAE", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:03", + "9": "1", + "index": 700 + }, + { + "0": "0FBA8C42-194E-4E18-85DB-D1FA1EB7C05D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:41:53", + "9": "1", + "index": 701 + }, + { + "0": "702CD93B-73B6-4F45-8FE8-7F83EC633AA0", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:12", + "9": "1", + "index": 702 + }, + { + "0": "216991DF-33A6-4090-90AA-3E09DDF390E4", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:48:52", + "9": "1", + "index": 703 + }, + { + "0": "B3B0727B-ADF3-4621-9DFC-D0C8CB6E6F26", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:41", + "9": "1", + "index": 704 + }, + { + "0": "66709ABD-6D12-456B-82D6-CBD25CFBE285", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:39:19", + "9": "1", + "index": 705 + }, + { + "0": "C187B038-E19A-46AA-A9E0-5BF87BAEE2C1", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:38:51", + "9": "1", + "index": 706 + }, + { + "0": "43BF9531-63BE-46A1-AA90-CFD08FEB3BBB", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:41:50", + "9": "1", + "index": 707 + }, + { + "0": "00746053-49FB-4681-8AAA-10388C1D59E2", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:15:52", + "9": "1", + "index": 708 + }, + { + "0": "A66793DD-03E4-4E15-9CDB-79EC4733C3CA", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:39:54", + "9": "1", + "index": 709 + }, + { + "0": "B49DBC29-4D81-4FEE-8B9F-44415FD7BC80", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:42:26", + "9": "1", + "index": 710 + }, + { + "0": "9E151E5A-C4BE-4AE6-A0F2-62320FD3FD14", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:49:39", + "9": "1", + "index": 711 + }, + { + "0": "96007AC1-F260-4648-97B6-3D3527611B1B", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:29:39", + "9": "1", + "index": 712 + }, + { + "0": "FF63B43E-F5B7-4CFD-81FD-AFBFE1BDDFA0", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:51:59", + "9": "1", + "index": 713 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 714 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 715 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 716 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 717 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "9": "1", + "index": 718 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 719 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "9": "1", + "index": 720 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "5": "104.7", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 721 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "9": "1", + "index": 722 + }, + { + "0": "903D435A-A4E4-489C-95E8-E97B11439B7C", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:19:19", + "9": "1", + "index": 723 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 724 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "9": "1", + "index": 725 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 726 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "9": "1", + "index": 727 + }, + { + "0": "6DCDA408-D527-4CC0-8ECD-BB1DD4C1B51B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:23:20", + "9": "1", + "index": 728 + }, + { + "0": "6DC4F5F7-598E-4782-9981-5466DF994D2B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:34:02", + "9": "1", + "index": 729 + }, + { + "0": "552F9E0D-5395-4995-9047-D71CD17F48CB", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:19:58", + "9": "1", + "index": 730 + }, + { + "0": "8C99CEBB-0BCA-4D2C-BEB7-09A627F46CDF", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:45:27", + "9": "1", + "index": 731 + }, + { + "0": "389398A4-D295-416A-91AE-E890749EFC58", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:30:28", + "9": "1", + "index": 732 + }, + { + "0": "FE374A34-0463-4D17-926A-7F697581AA35", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:24:44", + "9": "1", + "index": 733 + }, + { + "0": "E08DDC49-612E-4227-90CA-79EBCF477113", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-27 10:37:29", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 734 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 735 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "9": "1", + "index": 736 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "5": "793.8542", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 737 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "9": "1", + "index": 738 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 739 + }, + { + "0": "1D803FD7-051D-4D75-94DC-214FC9E55633", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:28:55", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 740 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "9": "1", + "index": 741 + }, + { + "0": "964F4854-0D2F-4852-BA0E-2FF1CAC93990", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:50:02", + "9": "1", + "index": 742 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "5": "240.45", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 743 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "9": "1", + "index": 744 + }, + { + "0": "69A49BAA-59B0-4AEC-AD40-EEE900AE308A", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 05:01:08", + "9": "1", + "index": 745 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "5": "424.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 746 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "9": "1", + "index": 747 + }, + { + "0": "36AD5A93-8DB0-4134-93EA-26D0A7EE8C3B", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:41:19", + "9": "1", + "index": 748 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 749 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "9": "1", + "index": 750 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "9": "1", + "index": 751 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 752 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 753 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "9": "1", + "index": 754 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 755 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "9": "1", + "index": 756 + }, + { + "0": "94BEE01F-8FA2-4685-9870-0172A53F3981", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:25:14", + "9": "1", + "index": 757 + }, + { + "0": "8F080C35-BA5C-41A5-8169-0EDBF1F27219", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:24:02", + "9": "1", + "index": 758 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 759 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "9": "1", + "index": 760 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 761 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "9": "1", + "index": 762 + }, + { + "0": "C365FB49-1531-4219-977D-CBA8CBEF8389", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:37:08", + "9": "1", + "index": 763 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 764 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "9": "1", + "index": 765 + }, + { + "0": "1CE81EB0-7399-41B6-8E55-79A52BBFE9AC", + "1": "A362221882887902", + "2": "0.0", + "4": "2023-03-06 18:07:51", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 766 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "5": "680.89", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 767 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "9": "1", + "index": 768 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 769 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "9": "1", + "index": 770 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 771 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "9": "1", + "index": 772 + }, + { + "0": "8D778823-BB51-4CA8-9CEC-84F4D48E035A", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:24:12", + "9": "1", + "index": 773 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 774 + }, + { + "0": "2193EA41-7C0E-442B-9A2A-A7E6F6CF6D0F", + "1": "A1899947010059410", + "2": "156450.0", + "3": "23.0", + "4": "2023-03-07 14:26:10", + "5": "1725.6435", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "0", + "index": 775 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "9": "1", + "index": 776 + }, + { + "0": "4BE98D88-C717-4C24-809B-1A92A1FFCEBC", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 15:02:16", + "9": "1", + "index": 777 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 778 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "9": "1", + "index": 779 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "5": "1307.65", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 780 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "9": "1", + "index": 781 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "5": "660.422", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 782 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "9": "1", + "index": 783 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 784 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "9": "1", + "index": 785 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 786 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "9": "1", + "index": 787 + }, + { + "0": "34E50410-3939-4466-BCE5-6207661FAF5C", + "1": "A1899946865208980", + "2": "73080.0", + "3": "0.0", + "4": "2023-03-09 16:20:26", + "9": "1", + "index": 788 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 789 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "9": "1", + "index": 790 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "5": "51.24", + "6": "false", + "7": "1.0", + "8": "3.0", + "9": "1", + "index": 791 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "9": "1", + "index": 792 + }, + { + "0": "9F442404-8F9E-45E0-8A10-D5B4C0B3A36A", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:47:03", + "9": "1", + "index": 793 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 794 + }, + { + "0": "A5343E7D-5553-4F25-B916-E18FE75CF2AC", + "1": "A1688853516414440", + "2": "125580.0", + "3": "0.0", + "4": "2023-03-10 15:51:52", + "5": "1385.1474", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 795 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "9": "1", + "index": 796 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "5": "519.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 797 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "9": "1", + "index": 798 + }, + { + "0": "3E6BEDBD-7B2A-40CF-87FC-AE161EA47713", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:57:49", + "9": "1", + "index": 799 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 800 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "9": "1", + "index": 801 + }, + { + "0": "0B787893-9340-4DE8-9CEF-AFFCD6BB8AB0", + "1": "A914800689334401", + "2": "109.99", + "3": "10.0", + "4": "2023-03-04 18:46:15", + "9": "1", + "index": 802 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 803 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "9": "1", + "index": 804 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "5": "103.48965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 805 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "9": "1", + "index": 806 + }, + { + "0": "D3507A5B-38A9-40F9-B992-DB1547B281C9", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:45:45", + "9": "1", + "index": 807 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 808 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "9": "1", + "index": 809 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "9": "1", + "index": 810 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 811 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 812 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "9": "1", + "index": 813 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 814 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "9": "1", + "index": 815 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "5": "403.0362", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 816 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "9": "1", + "index": 817 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "5": "752.68", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 818 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "9": "1", + "index": 819 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "5": "226.95", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 820 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "9": "1", + "index": 821 + }, + { + "0": "E87F43AB-36CC-481F-A7CB-E5F9C1B08F57", + "1": "A1899947009495620", + "2": "62580.0", + "3": "10.0", + "4": "2023-03-13 02:18:34", + "9": "1", + "index": 822 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 823 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "9": "1", + "index": 824 + }, + { + "0": "C2AE42D7-53F6-424F-8470-4B2EF42612EB", + "1": "A1688853662168790", + "2": "62580.0", + "3": "12.0", + "4": "2023-03-13 04:19:44", + "9": "1", + "index": 825 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 826 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "9": "1", + "index": 827 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "5": "152.94", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 828 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "9": "1", + "index": 829 + }, + { + "0": "14EF7AD5-A3AA-4E9E-B377-74A47CDC2785", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:58:58", + "9": "1", + "index": 830 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "5": "839.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 831 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "9": "1", + "index": 832 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "5": "593.58", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 833 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "9": "1", + "index": 834 + }, + { + "0": "1AE19EA1-54DF-4E2A-889F-E47C3AFE65AF", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:11:13", + "9": "1", + "index": 835 + }, + { + "0": "8717C0FD-51C1-4457-BABB-D356176DDF24", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:09:53", + "9": "1", + "index": 836 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 837 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "9": "1", + "index": 838 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 839 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "9": "1", + "index": 840 + }, + { + "0": "57E282C4-3F49-485B-B5B8-CACAEEF05078", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:47:32", + "9": "1", + "index": 841 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 842 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "9": "1", + "index": 843 + }, + { + "0": "A541504B-98D3-492E-89A4-994617EFA9CA", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:58:56", + "9": "1", + "index": 844 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 845 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "9": "1", + "index": 846 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 847 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "9": "1", + "index": 848 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "5": "210.99", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 849 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "9": "1", + "index": 850 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 851 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "9": "1", + "index": 852 + }, + { + "0": "0F4F57CC-5436-4377-9B91-B6C7D0CC67E8", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:35:53", + "9": "1", + "index": 853 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "5": "614.195251", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 854 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "9": "1", + "index": 855 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "5": "112.30134", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 856 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "9": "1", + "index": 857 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 858 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "9": "1", + "index": 859 + }, + { + "0": "47A9F4BA-03C8-4900-BEF0-BADCF3C21D99", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:19:14", + "9": "1", + "index": 860 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 861 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "9": "1", + "index": 862 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 863 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "9": "1", + "index": 864 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "5": "211.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 865 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "9": "1", + "index": 866 + }, + { + "0": "16346EB5-B1D7-438D-8F50-E46ADB6AEE9A", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:31:16", + "9": "1", + "index": 867 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 868 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "9": "1", + "index": 869 + }, + { + "0": "FFCA8791-18C3-4C81-9D89-1250936E41E1", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:04:04", + "9": "1", + "index": 870 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "5": "147.83", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 871 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "9": "1", + "index": 872 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 873 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "9": "1", + "index": 874 + }, + { + "0": "241DBB1D-3092-4FCE-A4A5-00219ECD6C99", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:35:42", + "9": "1", + "index": 875 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 876 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "9": "1", + "index": 877 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "5": "75.76", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 878 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "9": "1", + "index": 879 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 880 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "9": "1", + "index": 881 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 882 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "9": "1", + "index": 883 + }, + { + "0": "92EA085E-FD70-425B-80EB-4513BFBA8AF1", + "1": "A985157038112964", + "2": "150.14", + "3": "22.0", + "4": "2023-03-26 03:25:46", + "9": "1", + "index": 884 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "5": "150.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 885 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "9": "1", + "index": 886 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 887 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "9": "1", + "index": 888 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "5": "1132.3531", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 889 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "9": "1", + "index": 890 + }, + { + "0": "138D8A92-4C50-4A5F-BA5B-7E6517F3B0B9", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:48:08", + "9": "1", + "index": 891 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 892 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "9": "1", + "index": 893 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "5": "2264.7062", + "6": "true", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 894 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "9": "1", + "index": 895 + }, + { + "0": "237AD504-9222-4DAF-BBB9-5C86C4A0DF90", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:57:24", + "9": "1", + "index": 896 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "5": "260.370211", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 897 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "9": "1", + "index": 898 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "5": "159.0", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 899 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "9": "1", + "index": 900 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "9": "1", + "index": 901 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 902 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 903 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "9": "1", + "index": 904 + }, + { + "0": "A44E3875-069E-472A-B3FB-5ADC3A7CDF66", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:51:16", + "9": "1", + "index": 905 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "5": "285.167374", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 906 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "9": "1", + "index": 907 + }, + { + "0": "D6AE2567-ECC7-46FF-8389-BCF43C8A81D4", + "1": "A1055521435373420", + "2": "278.88", + "3": "0.0", + "4": "2023-03-30 06:20:02", + "9": "1", + "index": 908 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 909 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "9": "1", + "index": 910 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "5": "155.03704199999999", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 911 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "9": "1", + "index": 912 + }, + { + "0": "87726A9D-DF55-4685-82A1-5D4F9E022F5A", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:30:46", + "9": "1", + "index": 913 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "5": "145.347227", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 914 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "9": "1", + "index": 915 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "5": "405.099999", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 916 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "9": "1", + "index": 917 + }, + { + "0": "E4BE3429-CFC8-44D0-B48F-BCD7D875D0E9", + "1": "A1759222229520370", + "2": "599.0", + "3": "23.0", + "4": "2023-01-03 14:02:57", + "9": "1", + "index": 918 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "5": "176.66415", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 919 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "9": "1", + "index": 920 + }, + { + "0": "979DF1CE-FE47-47FE-A8ED-ED1119F41065", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:03:58", + "9": "1", + "index": 921 + }, + { + "0": "E9D60DF2-0E4B-4396-A84B-A0B9E88B3B63", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:02:50", + "9": "1", + "index": 922 + }, + { + "0": "F178386E-86A3-4F08-B9B0-6778898CAD4E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:56:06", + "9": "1", + "index": 923 + }, + { + "0": "2D228D45-7E38-45CF-BD23-8D4F3445FFF8", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:52:56", + "9": "1", + "index": 924 + }, + { + "0": "3FB022CD-5FEE-43CE-A742-F25EFC9F48DF", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:06:11", + "9": "1", + "index": 925 + }, + { + "0": "ABE168A6-3636-4202-9389-95E44E65881E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:14:56", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 926 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 927 + }, + { + "0": "169212AC-3DBA-4EA6-A5AE-031C407DC3AA", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:00:28", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 928 + }, + { + "0": "C4F83897-54F9-4208-987E-DDE9D20F0B4B", + "1": "A1688853657869890", + "2": "52.99", + "3": "11.0", + "4": "2023-01-03 17:27:59", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 929 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "9": "1", + "index": 930 + }, + { + "0": "783D965E-660F-4591-8AB5-3F3327E0B8AB", + "1": "A1759222095873190", + "2": "160.47", + "3": "11.0", + "4": "2023-01-03 17:41:15", + "9": "1", + "index": 931 + }, + { + "0": "DD2D73FD-7DAF-49A5-AC4A-47117E6DE03C", + "1": "A1759222095873190", + "2": "53.49", + "3": "11.0", + "4": "2023-01-03 17:37:53", + "9": "1", + "index": 932 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "5": "106.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 933 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "9": "1", + "index": 934 + }, + { + "0": "ADB8EB04-9D65-43A5-9CF1-5F86D904FC18", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:59:06", + "9": "1", + "index": 935 + }, + { + "0": "636DA8EE-8D04-49D9-9BFE-21FAE9991FE6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:57:29", + "9": "1", + "index": 936 + }, + { + "0": "FE12EF10-2C8B-4F97-8D72-8CA106A2FDB6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:56:12", + "9": "1", + "index": 937 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "5": "64.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 938 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "9": "1", + "index": 939 + }, + { + "0": "EE72DD0F-F132-4E86-9CC5-9FB6386668A0", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:41:24", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 940 + }, + { + "0": "DE94FF49-79D4-417C-87B2-6682EC4AA382", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:38:47", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 941 + }, + { + "0": "415F4169-0DE1-4D1D-B056-823D02BFEDF6", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:51:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 942 + }, + { + "0": "9B5ACCF3-D278-48E9-867E-6027988CEA01", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:24:33", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 943 + }, + { + "0": "B352C087-14C9-4B8A-B239-0C4D861AF091", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:45:31", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 944 + }, + { + "0": "CB9D1331-694E-46E6-8A0A-0C16404FD315", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:46:26", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 945 + }, + { + "0": "8B065D0D-9FBB-4815-B341-DDA432223550", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:35:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 946 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 947 + }, + { + "0": "C1399C61-74D6-40B3-8289-AC99FAFF4988", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:36:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 948 + }, + { + "0": "76770317-5FD5-4C96-B77B-43BE377FDC6D", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:48:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 949 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "9": "1", + "index": 950 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "5": "54.26", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 951 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "9": "1", + "index": 952 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 953 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "9": "1", + "index": 954 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 955 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "9": "1", + "index": 956 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "5": "26.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 957 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "9": "1", + "index": 958 + }, + { + "0": "84633227-12F0-4157-AEA8-4F844146BC47", + "1": "A985156984009293", + "2": "15.85", + "3": "9.0", + "4": "2023-01-06 17:45:55", + "9": "1", + "index": 959 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "5": "127.19", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 960 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "9": "1", + "index": 961 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "5": "63.89", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 962 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "9": "1", + "index": 963 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 964 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "9": "1", + "index": 965 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 966 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "9": "1", + "index": 967 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "5": "107.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 968 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "9": "1", + "index": 969 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 970 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "9": "1", + "index": 971 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "5": "137.3", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "1", + "index": 972 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "9": "1", + "index": 973 + }, + { + "0": "10B457AE-179C-457B-90BA-1A0E6D8F5143", + "1": "A1055521388773990", + "2": "119.06", + "3": "20.0", + "4": "2023-01-15 02:43:22", + "9": "1", + "index": 974 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "5": "108.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 975 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "9": "1", + "index": 976 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "5": "942.0987220000001", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 977 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "9": "1", + "index": 978 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "5": "299.21525099999997", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 979 + }, + { + "0": "50C46472-B928-49BF-82E2-D1BE1C9DBCF4", + "1": "A1899946943634320", + "2": "149.99", + "3": "12.0", + "4": "2023-01-15 12:57:30", + "5": "236.21925099999999", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 980 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "9": "1", + "index": 981 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 982 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "9": "1", + "index": 983 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "9": "1", + "index": 984 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 985 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 986 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "9": "1", + "index": 987 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 988 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "9": "1", + "index": 989 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "5": "210.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 990 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "9": "1", + "index": 991 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "5": "786.607837", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 992 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "9": "1", + "index": 993 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "5": "212.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 994 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "9": "1", + "index": 995 + }, + { + "0": "CDAFFE95-3687-4886-9668-96EB7645063F", + "1": "A1829582586398540", + "2": "786.79", + "3": "10.0", + "4": "2023-01-20 09:25:50", + "9": "1", + "index": 996 + }, + { + "0": "F70F7BCA-6F5F-4C6C-BEE4-6C92B53E5816", + "1": "A1829582586398540", + "2": "587.0", + "3": "21.0", + "4": "2023-02-03 21:10:03", + "9": "1", + "index": 997 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "5": "160.3882", + "6": "false", + "7": "1.0", + "8": "4.0", + "9": "1", + "index": 998 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "9": "1", + "index": 999 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 1000 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "double" + }, + { + "key": "3", + "name": "localHour", + "type": "double" + }, + { + "key": "4", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "5", + "name": "transactionAmountUSD", + "type": "double" + }, + { + "key": "6", + "name": "isProxyIP", + "type": "boolean" + }, + { + "key": "7", + "name": "digitalItemCount", + "type": "double" + }, + { + "key": "8", + "name": "physicalItemCount", + "type": "double" + }, + { + "key": "9", + "name": "is_fraud", + "type": "bigint" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "39462cc1-f9dc-422a-b3ba-f1b7429dd887": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "9": "1", + "index": 1 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "5": "1143.856282", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 2 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "9": "1", + "index": 3 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 4 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "9": "1", + "index": 5 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "5": "99.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 6 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "9": "1", + "index": 7 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "9": "1", + "index": 8 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "9": "1", + "index": 9 + }, + { + "0": "DDE0B1F6-40B2-44CA-B0A7-AE46453D51A0", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:25:29", + "9": "1", + "index": 10 + }, + { + "0": "E6789403-5C39-4D44-BA7C-3A1F481E718B", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:37:59", + "9": "1", + "index": 11 + }, + { + "0": "287F81B6-06F6-4C3B-8714-401FA70EC7DA", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:29:49", + "9": "1", + "index": 12 + }, + { + "0": "5CE4020A-ABA5-4B60-9BC3-131A126670C6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:03:22", + "9": "1", + "index": 13 + }, + { + "0": "A1979FD7-32C8-4BE2-AB5F-3FFDDD7C584A", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:24:17", + "9": "1", + "index": 14 + }, + { + "0": "11FAFE8A-E9F5-4FB4-BC04-4C96AE6E852F", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:16:26", + "9": "1", + "index": 15 + }, + { + "0": "C110E452-388B-4D53-A271-DE2C06DB410A", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:17:45", + "9": "1", + "index": 16 + }, + { + "0": "667490FD-D4B7-4039-A69B-C4E70A9F5DE3", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:23:04", + "9": "1", + "index": 17 + }, + { + "0": "E617D42C-798C-455C-8372-BC06259DE735", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:11:03", + "9": "1", + "index": 18 + }, + { + "0": "ACB1088D-CB05-45F9-9B3E-4709989A7443", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:06:03", + "9": "1", + "index": 19 + }, + { + "0": "51729D46-986A-4AD6-927B-959AA1FF1749", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:35:19", + "9": "1", + "index": 20 + }, + { + "0": "81D69AD5-E46F-46A4-8317-14C6F2908E0D", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:32:17", + "9": "1", + "index": 21 + }, + { + "0": "A45B5295-84D3-47CD-AFA3-E074A9DF9EF6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:43:38", + "9": "1", + "index": 22 + }, + { + "0": "E44AA2DD-8814-4746-839A-4A3D8EE5F243", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:12:20", + "9": "1", + "index": 23 + }, + { + "0": "DE15CA12-F07E-4C7C-9C30-19EF38B2B3E6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:42:16", + "9": "1", + "index": 24 + }, + { + "0": "5F5F30FC-7EA0-41CE-B5A4-FA459FDDBE38", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:09:49", + "9": "1", + "index": 25 + }, + { + "0": "B2F718B0-6639-44C6-9E86-04BCCB6765B6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:15:03", + "9": "1", + "index": 26 + }, + { + "0": "A8E3D8C2-10C0-429E-B6E1-743A0D5C3C17", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:26:46", + "9": "1", + "index": 27 + }, + { + "0": "AC86DB3A-EEED-44C1-85CF-79DA0AF47B0F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:39:29", + "9": "1", + "index": 28 + }, + { + "0": "A161FE84-6920-43CD-9AFE-7D1A04800640", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:20:14", + "9": "1", + "index": 29 + }, + { + "0": "D0F517D0-F18C-41DE-A53F-65C3264C4C5E", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:13:40", + "9": "1", + "index": 30 + }, + { + "0": "B117C813-5EB9-4747-92B5-C52D520AC13F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:36:39", + "9": "1", + "index": 31 + }, + { + "0": "AED3F5DA-87AB-45C8-A0FF-426E353FB102", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:31:04", + "9": "1", + "index": 32 + }, + { + "0": "4BCAC6B0-3937-47E3-9AB8-6519D09321B1", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:01:57", + "9": "1", + "index": 33 + }, + { + "0": "FEE49FF0-87EB-402B-8EBB-8F9F4C9CB225", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:33:55", + "9": "1", + "index": 34 + }, + { + "0": "826E2F8E-D033-4287-A065-A26210923F90", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:40:40", + "9": "1", + "index": 35 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 36 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 37 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 38 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "9": "1", + "index": 39 + }, + { + "0": "72399945-3AC5-461E-BF85-228552DF71E1", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:35:42", + "9": "1", + "index": 40 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 41 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "9": "1", + "index": 42 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "9": "1", + "index": 43 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "9": "1", + "index": 44 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "9": "1", + "index": 45 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "9": "1", + "index": 46 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "9": "1", + "index": 47 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "9": "1", + "index": 48 + }, + { + "0": "5AF9F5B3-7386-426B-878E-3F1B7BBF48D9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:56:55", + "9": "1", + "index": 49 + }, + { + "0": "9E012F96-E7AA-4046-8F24-0C85FBB36CF5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:07:57", + "9": "1", + "index": 50 + }, + { + "0": "68D83F37-50D4-484B-8652-EAA245BFD48D", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:33:26", + "9": "1", + "index": 51 + }, + { + "0": "2DC3FDC7-C677-4479-A4C4-85C9A5E2F4FC", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:11:32", + "9": "1", + "index": 52 + }, + { + "0": "1353C004-23CE-4887-8611-0986140B9411", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:22:26", + "9": "1", + "index": 53 + }, + { + "0": "6D96EB12-FD10-4D59-8262-C477E3B4A7FF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:18:40", + "9": "1", + "index": 54 + }, + { + "0": "64A65086-D78C-4C67-994D-06DC95737FB5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:09:49", + "9": "1", + "index": 55 + }, + { + "0": "4186FC50-1BBE-4188-94FD-5659E850B7A3", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:45:29", + "9": "1", + "index": 56 + }, + { + "0": "442116BE-E400-48F2-80E8-C15B1DECFB1E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:51:35", + "9": "1", + "index": 57 + }, + { + "0": "61841EEB-00BE-478C-8142-677F86A55BD1", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:26:54", + "9": "1", + "index": 58 + }, + { + "0": "73F74DE9-9679-417D-A7A8-6D1D74769D9D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:28:23", + "9": "1", + "index": 59 + }, + { + "0": "298F7C38-80B2-4CC3-8D84-29A2B5B7797C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:48:42", + "9": "1", + "index": 60 + }, + { + "0": "4B54A952-E219-4AD1-8DB2-CAD464FCC43A", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:46:44", + "9": "1", + "index": 61 + }, + { + "0": "D02E8FB4-3170-4C47-8886-ABE470F197C3", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:03:30", + "9": "1", + "index": 62 + }, + { + "0": "3F556D13-8CCB-400E-B9BD-582162BE610B", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:36:12", + "9": "1", + "index": 63 + }, + { + "0": "897B514D-E758-4690-84B8-6549559C52EE", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:50:29", + "9": "1", + "index": 64 + }, + { + "0": "985F137B-2E34-46E7-9AB6-EBF9D2C220F4", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:06:48", + "9": "1", + "index": 65 + }, + { + "0": "D247B57A-BE03-44A2-ABCB-E73EA6FCD843", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:29:52", + "9": "1", + "index": 66 + }, + { + "0": "40F8D07E-67EF-4678-8612-FC130DC84F5E", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:00:08", + "9": "1", + "index": 67 + }, + { + "0": "F15CE4DA-A189-42BF-931E-66398ED48CA6", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:21:51", + "9": "1", + "index": 68 + }, + { + "0": "973F228D-6E34-4E2C-A8ED-86A560FFE993", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:37:33", + "9": "1", + "index": 69 + }, + { + "0": "BCBDF6C6-1D5A-42F2-A912-E295526FF9B7", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:04:05", + "9": "1", + "index": 70 + }, + { + "0": "C1040C0D-A701-4AD0-B4E3-1BC1F06AB4AA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:13:25", + "9": "1", + "index": 71 + }, + { + "0": "4C5EC030-CD2E-4097-B706-42BE9D808509", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:05:37", + "9": "1", + "index": 72 + }, + { + "0": "3CF32319-BFF3-4CFE-8792-8C4775AD619F", + "1": "A1899946873142120", + "2": "99.98", + "3": "13.0", + "4": "2023-01-03 18:45:18", + "9": "1", + "index": 73 + }, + { + "0": "F6FBBB59-BFD5-4736-B635-64301B04D71C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:42:53", + "9": "1", + "index": 74 + }, + { + "0": "AD22A063-D3FB-4623-B7A2-69A6C8E5CEE0", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:53:28", + "9": "1", + "index": 75 + }, + { + "0": "9E9BB950-7681-4213-B8D7-1E71AE232C43", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:55:40", + "9": "1", + "index": 76 + }, + { + "0": "4EC3DEEC-D21B-4515-A3DE-5CC895397F21", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:59:16", + "9": "1", + "index": 77 + }, + { + "0": "2120F51D-E109-4481-88D7-023757351EDF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:05:23", + "9": "1", + "index": 78 + }, + { + "0": "D8EFBBA0-BEF9-4BEA-A6F0-4A5CBE4C1287", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:09:43", + "9": "1", + "index": 79 + }, + { + "0": "C2440D4D-3768-4108-BCAF-E43441537783", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:38:15", + "9": "1", + "index": 80 + }, + { + "0": "19DB47CE-E027-4D8D-8439-ADCC4BBE9879", + "1": "A1899946873142120", + "2": "59.99", + "3": "13.0", + "4": "2023-01-03 18:42:51", + "9": "1", + "index": 81 + }, + { + "0": "88A8FA38-800E-459D-A11C-77477E41FC5B", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:08:13", + "9": "1", + "index": 82 + }, + { + "0": "038E2738-E619-431A-8597-5952B7710EF8", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:20:26", + "9": "1", + "index": 83 + }, + { + "0": "34DE06CA-82E2-44D3-8E83-E650A493EE27", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:50:42", + "9": "1", + "index": 84 + }, + { + "0": "DDBCD8B8-C45B-45BB-8373-E184F6776E09", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:01:13", + "9": "1", + "index": 85 + }, + { + "0": "2FF854D4-3A50-4F9B-9AF9-861612051389", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:33:06", + "9": "1", + "index": 86 + }, + { + "0": "BE25CE28-7142-4EB4-8157-77654E4816D0", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:24:35", + "9": "1", + "index": 87 + }, + { + "0": "57C6D5D6-43F4-4BD0-9FF5-67E4BB395B99", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:15:43", + "9": "1", + "index": 88 + }, + { + "0": "F5606360-D929-4903-8771-E51207DAF2C6", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:53:31", + "9": "1", + "index": 89 + }, + { + "0": "7898FC86-CDBF-469B-B369-5E70B9BAC1F1", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:01:54", + "9": "1", + "index": 90 + }, + { + "0": "AF64911E-A295-4337-BBAF-835F82DD77BA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:41:16", + "9": "1", + "index": 91 + }, + { + "0": "F825E26E-89D0-43AB-B281-D62588C4779A", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:49:42", + "9": "1", + "index": 92 + }, + { + "0": "C7D4CBEF-2E68-41A2-B83A-D064795E296E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:16:55", + "9": "1", + "index": 93 + }, + { + "0": "A75939D1-EE17-4E78-8478-6937CD08D5E9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:52:01", + "9": "1", + "index": 94 + }, + { + "0": "422D5F57-6B6E-4803-AD06-9BF33330F102", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:48:55", + "9": "1", + "index": 95 + }, + { + "0": "CA193A45-31F8-4EB5-A19D-BF5D2602277D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:40:11", + "9": "1", + "index": 96 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 97 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 98 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 99 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 100 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 101 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 102 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 103 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "9": "1", + "index": 104 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "9": "1", + "index": 105 + }, + { + "0": "90BAD1BA-E6EE-4EA6-B27F-7162B22CDBFA", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:39:16", + "9": "1", + "index": 106 + }, + { + "0": "D2CE31CE-7D5A-4E80-8D3E-F2E184DFAC98", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:27:17", + "9": "1", + "index": 107 + }, + { + "0": "8875BFC3-B41E-416A-A334-65EB49672BEC", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:29:02", + "9": "1", + "index": 108 + }, + { + "0": "6B3337E4-83E7-49DA-97BA-D0DC2B44F42F", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:41:07", + "9": "1", + "index": 109 + }, + { + "0": "9D92C6BC-E560-4C32-A034-1E1F0814E46E", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:42:58", + "9": "1", + "index": 110 + }, + { + "0": "E9D36D5B-FDCD-440A-BC1A-C53A9110CF22", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:46:52", + "9": "1", + "index": 111 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "5": "107.52", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 112 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 113 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "9": "1", + "index": 114 + }, + { + "0": "4324B9F6-5D21-4327-B80F-99057A3B541C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:33:20", + "9": "1", + "index": 115 + }, + { + "0": "EFFCEF09-9E31-4B39-AD1B-8E169D27C749", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:34:26", + "9": "1", + "index": 116 + }, + { + "0": "28C2478A-7236-40ED-A5C4-5BB8A29E561B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:43:14", + "9": "1", + "index": 117 + }, + { + "0": "EAD34905-DE0B-4FC8-A4AE-C2248AF29A08", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:37:32", + "9": "1", + "index": 118 + }, + { + "0": "7DDF174A-C6BF-4245-8148-650BBEC82DA8", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:36:35", + "9": "1", + "index": 119 + }, + { + "0": "D3F14FD5-C8C3-4401-8053-A5DCB4086473", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:30:44", + "9": "1", + "index": 120 + }, + { + "0": "92C5B50A-E46E-404D-9EFB-7043D6DD7C68", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:32:00", + "9": "1", + "index": 121 + }, + { + "0": "D1884A1A-0865-47C3-A8DC-43DC991D661C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:41:02", + "9": "1", + "index": 122 + }, + { + "0": "F7690559-B2FA-42E4-910F-DF65A0250586", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:29:47", + "9": "1", + "index": 123 + }, + { + "0": "17B73DB4-D6C9-4F0D-A8CA-A1BD9334FABC", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:42:15", + "9": "1", + "index": 124 + }, + { + "0": "A3BEE7DE-D634-4C72-A05D-77A80D7D613B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:44:48", + "9": "1", + "index": 125 + }, + { + "0": "A25BC911-EAA9-47D1-B8D2-4086F6CC94CB", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:35:29", + "9": "1", + "index": 126 + }, + { + "0": "B30F54F2-BBB5-4DFC-B4D6-F3BA03220790", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:28:43", + "9": "1", + "index": 127 + }, + { + "0": "8D4F3115-A1D5-459A-A847-A4C3E43A74A7", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:39:35", + "9": "1", + "index": 128 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 129 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "9": "1", + "index": 130 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 131 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "9": "1", + "index": 132 + }, + { + "0": "EE63EE82-8A5F-4422-8CFA-3CF0C48D05FD", + "1": "A1688853524321290", + "2": "49.98", + "3": "19.0", + "4": "2023-01-05 00:32:25", + "9": "1", + "index": 133 + }, + { + "0": "14B43B88-2D00-4D03-BDDA-3484C0D86769", + "1": "A1688853524321290", + "2": "24.99", + "3": "19.0", + "4": "2023-01-05 00:26:00", + "9": "1", + "index": 134 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "5": "74.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 135 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "9": "1", + "index": 136 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "5": "24.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 137 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "9": "1", + "index": 138 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "5": "442.12214400000005", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 139 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "9": "1", + "index": 140 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 141 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "9": "1", + "index": 142 + }, + { + "0": "53F9A1F3-DB12-474B-8E9B-E6ADF22699AF", + "1": "A914800996051170", + "2": "139.99", + "3": "17.0", + "4": "2023-01-07 22:30:40", + "9": "1", + "index": 143 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 144 + }, + { + "0": "D1A1DEF3-8373-40A4-8337-742C4BC68770", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:50:44", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 145 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "9": "1", + "index": 146 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 147 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "9": "1", + "index": 148 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 149 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "9": "1", + "index": 150 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 151 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "9": "1", + "index": 152 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "5": "279.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 153 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "9": "1", + "index": 154 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "5": "176.66415", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 155 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "9": "1", + "index": 156 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 157 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "9": "1", + "index": 158 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "5": "145.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 159 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "9": "1", + "index": 160 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "5": "86.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 161 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "9": "1", + "index": 162 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "9": "1", + "index": 163 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "9": "1", + "index": 164 + }, + { + "0": "CA5F63D9-CA1B-41E6-8C42-7F89EA103D1D", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:31:01", + "9": "1", + "index": 165 + }, + { + "0": "0A82E4ED-93EC-4386-AA16-0EA1FC946B6C", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 19:20:25", + "9": "1", + "index": 166 + }, + { + "0": "D1834580-E9C8-4D34-9433-0BA410FA0DF4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:30:31", + "9": "1", + "index": 167 + }, + { + "0": "DE53E28B-69C9-4C7D-AF79-E725235C87F4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:31:56", + "9": "1", + "index": 168 + }, + { + "0": "9E492C70-9940-4103-9414-FC8F0C741490", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:27:34", + "9": "1", + "index": 169 + }, + { + "0": "DABB8679-0A5B-46D1-9421-D443A45907F8", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:48:21", + "9": "1", + "index": 170 + }, + { + "0": "630F1681-99D1-4F3C-BCE0-69C6B28E5A98", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:43:12", + "9": "1", + "index": 171 + }, + { + "0": "961FCF4A-7930-4C04-B37B-A5FDFA414D9E", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:41:14", + "9": "1", + "index": 172 + }, + { + "0": "41F4234C-1659-48C5-A9D1-4C2324A0891B", + "1": "A1899946895455190", + "2": "19.99", + "3": "11.0", + "4": "2023-01-13 16:52:56", + "9": "1", + "index": 173 + }, + { + "0": "6A2D4479-6262-4C32-95B5-AC5BE0205E24", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:47:34", + "9": "1", + "index": 174 + }, + { + "0": "F3606B8D-3008-4781-AC9C-BA159F1BF3B5", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:24:09", + "9": "1", + "index": 175 + }, + { + "0": "99E39E43-B8E7-48C8-8C6E-EE09902A63E0", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:36:07", + "9": "1", + "index": 176 + }, + { + "0": "B375BB8C-242A-4DC6-8FC3-F35EA5ADDADD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:21:25", + "9": "1", + "index": 177 + }, + { + "0": "E112F541-98DE-420B-B009-FAA21420164B", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:00", + "9": "1", + "index": 178 + }, + { + "0": "4A7523C3-17EE-4AB6-92D9-6535A3A41331", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:22:20", + "9": "1", + "index": 179 + }, + { + "0": "2F6CE5C9-1702-4E7A-8A88-40CE991E99BB", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:34:17", + "9": "1", + "index": 180 + }, + { + "0": "E7F77A61-785B-4E7D-8C99-6A237E368BC5", + "1": "A1899946895455190", + "2": "19.99", + "3": "12.0", + "4": "2023-01-13 17:22:25", + "9": "1", + "index": 181 + }, + { + "0": "C077446E-640F-4769-9527-5A727F34A4B4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:38:29", + "9": "1", + "index": 182 + }, + { + "0": "27B1F6C4-E881-408C-A29E-CA13AD07997B", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:49:35", + "9": "1", + "index": 183 + }, + { + "0": "DF9AFB75-2D64-4A8A-8743-AA39724E34AD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:39:41", + "9": "1", + "index": 184 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 185 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 186 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 187 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "9": "1", + "index": 188 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "5": "161.722522", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 189 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "9": "1", + "index": 190 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 191 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "9": "1", + "index": 192 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 193 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "9": "1", + "index": 194 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "5": "62.39", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 195 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "9": "1", + "index": 196 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "5": "64.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 197 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "9": "1", + "index": 198 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "5": "79.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 199 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "9": "1", + "index": 200 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "5": "86.74", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 201 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "9": "1", + "index": 202 + }, + { + "0": "06CA7673-9504-44D4-A9B1-49EC29233AD5", + "1": "A844428040495230", + "2": "73.11", + "3": "13.0", + "4": "2023-01-19 18:43:29", + "9": "1", + "index": 203 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 204 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "9": "1", + "index": 205 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "5": "237.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 206 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "9": "1", + "index": 207 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 208 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "9": "1", + "index": 209 + }, + { + "0": "CFF67307-A9EF-43AC-AE45-D448E2991474", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:39:12", + "9": "1", + "index": 210 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "5": "157.474251", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 211 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "9": "1", + "index": 212 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "5": "62.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 213 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "9": "1", + "index": 214 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 215 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "9": "1", + "index": 216 + }, + { + "0": "98D7E9CF-D308-4B97-BF45-00263A93B702", + "1": "A914801004943538", + "2": "59.99", + "4": "2023-01-20 02:02:01", + "9": "1", + "index": 217 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "5": "31.94", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 218 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "9": "1", + "index": 219 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 220 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "9": "1", + "index": 221 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "5": "259.62185800000003", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 222 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "9": "1", + "index": 223 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "5": "102.48", + "6": "false", + "7": "2.0", + "8": "1.0", + "9": "1", + "index": 224 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "9": "1", + "index": 225 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "5": "149.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 226 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "9": "1", + "index": 227 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 228 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "9": "1", + "index": 229 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "5": "626.16465", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 230 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "9": "1", + "index": 231 + }, + { + "0": "C8AA8B84-1C89-4B76-B2BF-3C10C3444D89", + "1": "A914801007105746", + "2": "80.73", + "3": "9.0", + "4": "2023-01-25 18:07:59", + "9": "1", + "index": 232 + }, + { + "0": "F2CD36F5-0FC9-4DBF-9D5A-D6B043795C0C", + "1": "A914801007105746", + "2": "83.06", + "3": "8.0", + "4": "2023-01-23 16:39:58", + "9": "1", + "index": 233 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "5": "93.85", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 234 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "9": "1", + "index": 235 + }, + { + "0": "A8410FBF-9EE3-4200-A0ED-05631423E0F9", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 08:58:29", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 236 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 237 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "9": "1", + "index": 238 + }, + { + "0": "13A9B365-CFF1-44F7-A1EB-19327EDE18C2", + "1": "A1688853647393240", + "2": "295.38", + "3": "8.0", + "4": "2023-01-25 16:49:33", + "9": "1", + "index": 239 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "5": "147.69", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 240 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "9": "1", + "index": 241 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 242 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "9": "1", + "index": 243 + }, + { + "0": "CACD0238-79D3-4506-B78A-F24E494B3AAC", + "1": "A1055521395048230", + "2": "81.6", + "3": "2.0", + "4": "2023-01-25 08:02:13", + "9": "1", + "index": 244 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "5": "83.14", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 245 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "9": "1", + "index": 246 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "5": "134.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 247 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "9": "1", + "index": 248 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "5": "80.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 249 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "9": "1", + "index": 250 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 251 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "9": "1", + "index": 252 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 253 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "9": "1", + "index": 254 + }, + { + "0": "C09DE962-3605-4A0E-B82F-A09B2B618D1F", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:54:27", + "9": "1", + "index": 255 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 256 + }, + { + "0": "C61F74AD-F654-4042-9DFF-567978FA7CF7", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:57:11", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 257 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "9": "1", + "index": 258 + }, + { + "0": "A92EA0F2-90D5-413B-A2FE-8A91F3DA1255", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:50:57", + "9": "1", + "index": 259 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 260 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "9": "1", + "index": 261 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "5": "231.56", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 262 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "9": "1", + "index": 263 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "5": "102.999897", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 264 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "9": "1", + "index": 265 + }, + { + "0": "F1FE235C-84E4-4770-BA47-2F70994718C1", + "1": "A914801011218316", + "2": "330.86", + "3": "17.0", + "4": "2023-02-12 23:03:05", + "9": "1", + "index": 266 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "5": "224.11", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 267 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "9": "1", + "index": 268 + }, + { + "0": "3FBAFD91-D3AC-41CB-BC17-4CAAAC0C52EA", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:36:34", + "9": "1", + "index": 269 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 270 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "9": "1", + "index": 271 + }, + { + "0": "56BAD8D6-088E-4AD9-99E4-2C23D10C32B0", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:48:24", + "9": "1", + "index": 272 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 273 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "9": "1", + "index": 274 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "5": "65.54", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 275 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "9": "1", + "index": 276 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "5": "106.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 277 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "9": "1", + "index": 278 + }, + { + "0": "0C064A95-7D41-4C84-A18E-816228CAB89E", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:56:13", + "9": "1", + "index": 279 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 280 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "9": "1", + "index": 281 + }, + { + "0": "E261B8E8-F241-46F3-89AA-5CC0283C8040", + "1": "A985156999024771", + "2": "92.5", + "3": "2.0", + "4": "2023-02-01 10:37:54", + "9": "1", + "index": 282 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "5": "93.07", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 283 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "9": "1", + "index": 284 + }, + { + "0": "105FE6E4-4E43-4042-937C-4E6748781A3D", + "1": "A914801012822158", + "2": "92.63", + "3": "0.0", + "4": "2023-02-03 05:37:23", + "9": "1", + "index": 285 + }, + { + "0": "6BA9D314-0ECC-425F-BCA8-FE3DC74581C8", + "1": "A914801012822158", + "2": "104.25", + "3": "6.0", + "4": "2023-02-01 11:41:23", + "9": "1", + "index": 286 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 287 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "9": "1", + "index": 288 + }, + { + "0": "A5D379FD-D933-4F68-8763-0C5AF07F7834", + "1": "A914801013785993", + "2": "86.98", + "3": "4.0", + "4": "2023-02-03 09:47:07", + "9": "1", + "index": 289 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "5": "95.02", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 290 + }, + { + "0": "3CFD786C-1D49-4D2D-94DA-C3A0E26ACB02", + "1": "A914801013785993", + "2": "93.94", + "3": "0.0", + "4": "2023-02-08 06:19:27", + "5": "93.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 291 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "9": "1", + "index": 292 + }, + { + "0": "AB06E897-E5CB-408B-957A-9E77B9EBD71E", + "1": "A914801013775218", + "2": "93.62", + "3": "9.0", + "4": "2023-02-02 14:49:48", + "9": "1", + "index": 293 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 294 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "9": "1", + "index": 295 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "5": "170.67264", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 296 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "9": "1", + "index": 297 + }, + { + "0": "AF5BC5D5-9280-4F4A-860B-D8A4772823AD", + "1": "A985157000299534", + "2": "281.37", + "3": "14.0", + "4": "2023-02-03 19:43:12", + "9": "1", + "index": 298 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 299 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "9": "1", + "index": 300 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 301 + }, + { + "0": "AFC2F084-490B-4B4F-AF6A-05B999BC0C81", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:45:40", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 302 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "9": "1", + "index": 303 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "5": "346.462251", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 304 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "9": "1", + "index": 305 + }, + { + "0": "ECC38318-E094-4FAA-9638-6C664AB49DB8", + "1": "A985157000491580", + "2": "299.0", + "3": "19.0", + "4": "2023-02-05 10:03:12", + "9": "1", + "index": 306 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "5": "418.129547", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 307 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "9": "1", + "index": 308 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 309 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "9": "1", + "index": 310 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 311 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "9": "1", + "index": 312 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "9": "1", + "index": 313 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 314 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 315 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "9": "1", + "index": 316 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "5": "149.93", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 317 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "9": "1", + "index": 318 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "5": "64.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 319 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "9": "1", + "index": 320 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "5": "21.6", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 321 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "9": "1", + "index": 322 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 323 + }, + { + "0": "9B6410A2-B896-4E0E-9929-B3D3FF23D091", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:43:38", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 324 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "9": "1", + "index": 325 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "5": "99.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 326 + }, + { + "0": "23FB57DD-40E6-49D4-8F47-29EC2357E548", + "1": "A564049508937862", + "2": "0.0", + "4": "2023-03-06 19:52:07", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 327 + }, + { + "0": "EC085107-C5DF-4814-8E31-374D3D8BD5AD", + "1": "A564049508937862", + "2": "482.68", + "3": "10.0", + "4": "2023-03-06 18:31:45", + "5": "482.68", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 328 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "9": "1", + "index": 329 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "9": "1", + "index": 330 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 331 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 332 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "9": "1", + "index": 333 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "5": "118.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 334 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "9": "1", + "index": 335 + }, + { + "0": "0D385B17-41FC-4D3B-8C36-BFD0FAF6AA20", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:26:33", + "9": "1", + "index": 336 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "5": "423.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 337 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "9": "1", + "index": 338 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 339 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "9": "1", + "index": 340 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "5": "542.25145", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 341 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "9": "1", + "index": 342 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 343 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "9": "1", + "index": 344 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 345 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "9": "1", + "index": 346 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "5": "66.05", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 347 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "9": "1", + "index": 348 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "5": "149.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 349 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "9": "1", + "index": 350 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "5": "1154.4", + "6": "false", + "7": "0.0", + "8": "3.0", + "9": "1", + "index": 351 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "9": "1", + "index": 352 + }, + { + "0": "44D80959-7137-4EDB-AEEE-1B7654A9A2A2", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-23 01:16:41", + "9": "1", + "index": 353 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "5": "119.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 354 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "9": "1", + "index": 355 + }, + { + "0": "C173A9A3-90B7-4B38-8DAC-D001CDD47814", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:51:29", + "9": "1", + "index": 356 + }, + { + "0": "76824E16-8144-4C10-8769-DF9049DE4BB3", + "1": "A1899946873128090", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 03:38:31", + "9": "1", + "index": 357 + }, + { + "0": "D141370E-DD9D-4316-A2F9-A5D8244C61A2", + "1": "A1899946873128090", + "2": "119.98", + "3": "20.0", + "4": "2023-02-15 02:37:52", + "9": "1", + "index": 358 + }, + { + "0": "673A772C-71A1-4541-8468-7298A4FC0844", + "1": "A1899946873128090", + "2": "75.58", + "3": "20.0", + "4": "2023-02-15 02:34:45", + "9": "1", + "index": 359 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "5": "127.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 360 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "9": "1", + "index": 361 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 362 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "9": "1", + "index": 363 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 364 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "9": "1", + "index": 365 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "5": "105.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 366 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "9": "1", + "index": 367 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 368 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "9": "1", + "index": 369 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 370 + }, + { + "0": "BD6E876C-4420-4359-B25A-35BE542F82C0", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:30:03", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 371 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "9": "1", + "index": 372 + }, + { + "0": "66F28A11-228E-4CF9-9872-0677EF57CCCD", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:50:09", + "9": "1", + "index": 373 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "5": "50.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 374 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "9": "1", + "index": 375 + }, + { + "0": "077961F4-BD88-4A14-9607-D267E3882119", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:57:34", + "9": "1", + "index": 376 + }, + { + "0": "6083FE06-FDAB-4725-8CB2-DDB0B978E826", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:58:56", + "9": "1", + "index": 377 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "5": "60.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 378 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "9": "1", + "index": 379 + }, + { + "0": "3826E27E-AAFD-4443-A7E9-A0586D2F0729", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:26:58", + "9": "1", + "index": 380 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "5": "127.18", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 381 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "9": "1", + "index": 382 + }, + { + "0": "5BDE388B-8A30-4D45-8122-F7CA341442C8", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 13:00:25", + "9": "1", + "index": 383 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "5": "53.36", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 384 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "9": "1", + "index": 385 + }, + { + "0": "1935138A-D934-4B52-B3F5-FA99C47F03AC", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:40:57", + "9": "1", + "index": 386 + }, + { + "0": "10366C01-E5BE-4DD8-BD52-1B22971F1F4B", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:39:39", + "9": "1", + "index": 387 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 388 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "9": "1", + "index": 389 + }, + { + "0": "52961216-05ED-4183-8EF5-5237F0352C41", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:17:31", + "9": "1", + "index": 390 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 391 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "9": "1", + "index": 392 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "9": "1", + "index": 393 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "9": "1", + "index": 394 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 395 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 396 + }, + { + "0": "72B7AED1-0944-4DE8-8BEF-74680BBAC3F1", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:55:28", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 397 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 398 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "9": "1", + "index": 399 + }, + { + "0": "4FD412FF-3716-4007-8C81-80FDA381E04A", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:37:03", + "9": "1", + "index": 400 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "5": "53.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 401 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "9": "1", + "index": 402 + }, + { + "0": "E9AE2FFC-1BA4-45CC-858C-DCE5E3BA51B8", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:51:45", + "9": "1", + "index": 403 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "5": "108.38", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 404 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "9": "1", + "index": 405 + }, + { + "0": "D74E0304-9D1B-40AC-8418-33C7FD7FDBD9", + "1": "A844428056745591", + "2": "249.95", + "3": "12.0", + "4": "2023-02-16 20:40:53", + "9": "1", + "index": 406 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "5": "49.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 407 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "9": "1", + "index": 408 + }, + { + "0": "07C1A129-EF6A-4B87-BFE4-C4D4CDF7049B", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:01:39", + "9": "1", + "index": 409 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "5": "54.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 410 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "9": "1", + "index": 411 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "5": "65.16", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 412 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "9": "1", + "index": 413 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "5": "63.95", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 414 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "9": "1", + "index": 415 + }, + { + "0": "D1119E3D-720D-46A4-9772-C456EA3B0D4D", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:46:16", + "9": "1", + "index": 416 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 417 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "9": "1", + "index": 418 + }, + { + "0": "B3FFE8F1-6D4D-49FF-9DC6-97E3F78B18E1", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:49:50", + "9": "1", + "index": 419 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "5": "129.34", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 420 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "9": "1", + "index": 421 + }, + { + "0": "4B1F2669-E141-4218-8048-95E751DCF8F1", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:54:20", + "9": "1", + "index": 422 + }, + { + "0": "87FD50BB-5621-4778-9CBF-604522DDC605", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:36:43", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 423 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 424 + }, + { + "0": "7C8DB972-42E3-4C98-B13B-C338C0714D3F", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:55:32", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 425 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "9": "1", + "index": 426 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "9": "1", + "index": 427 + }, + { + "0": "A23C51AD-50BC-4719-B489-A29643BB3C74", + "1": "A1829582519835540", + "2": "59.99", + "3": "4.0", + "4": "2023-02-17 11:20:25", + "9": "1", + "index": 428 + }, + { + "0": "2589C5DD-012D-429C-A3C1-8333C3ECE2A4", + "1": "A1829582519835540", + "2": "59.99", + "3": "5.0", + "4": "2023-02-17 11:22:08", + "9": "1", + "index": 429 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 430 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 431 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "9": "1", + "index": 432 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "5": "239.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 433 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "9": "1", + "index": 434 + }, + { + "0": "56176B76-FFD4-4252-8BAD-C8F0E105EE2E", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 11:52:43", + "9": "1", + "index": 435 + }, + { + "0": "0B666A57-4CBF-411F-A855-A7B615726FED", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:11:06", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 436 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 437 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "9": "1", + "index": 438 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 439 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "9": "1", + "index": 440 + }, + { + "0": "F815E0BF-EDEA-40BF-9CA7-E529C895BA5E", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:24:44", + "9": "1", + "index": 441 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 442 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "9": "1", + "index": 443 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 444 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "9": "1", + "index": 445 + }, + { + "0": "93796897-06CD-4111-8F2D-E27D5CE46B66", + "1": "A844427218518467", + "2": "157.94", + "3": "18.0", + "4": "2023-02-17 23:30:32", + "9": "1", + "index": 446 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "5": "157.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 447 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "9": "1", + "index": 448 + }, + { + "0": "F461D35F-457F-40E7-BF42-4C116CF0D921", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:48:49", + "9": "1", + "index": 449 + }, + { + "0": "6645E186-2EE1-4F51-883A-7C4333C753C3", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 22:08:38", + "9": "1", + "index": 450 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 451 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "9": "1", + "index": 452 + }, + { + "0": "8B634588-BDD1-4B61-B2C0-00A24CD77D7B", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:07:01", + "9": "1", + "index": 453 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 454 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "9": "1", + "index": 455 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "5": "163.16", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 456 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "9": "1", + "index": 457 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 458 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "9": "1", + "index": 459 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "5": "301.26", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 460 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "9": "1", + "index": 461 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 462 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "9": "1", + "index": 463 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "5": "80.92", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 464 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "9": "1", + "index": 465 + }, + { + "0": "2C8A9E18-E28E-4555-B5F9-98F0D34FCEAE", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:48:28", + "9": "1", + "index": 466 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 467 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "9": "1", + "index": 468 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 469 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "9": "1", + "index": 470 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 471 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "9": "1", + "index": 472 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "5": "156.792046", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 473 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "9": "1", + "index": 474 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 475 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "9": "1", + "index": 476 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 477 + }, + { + "0": "EA8C66F4-8916-4822-85FA-583C2186501A", + "1": "A985156821621035", + "2": "152.03", + "3": "21.0", + "4": "2023-02-22 05:05:07", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 478 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "9": "1", + "index": 479 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "5": "233.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 480 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "9": "1", + "index": 481 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 482 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "9": "1", + "index": 483 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "5": "85.59", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 484 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "9": "1", + "index": 485 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "5": "973.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 486 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "9": "1", + "index": 487 + }, + { + "0": "35AC8DA0-24ED-4461-B732-7994EAC7AD2C", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:23:47", + "9": "1", + "index": 488 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 489 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "9": "1", + "index": 490 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "5": "656.95233", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 491 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "9": "1", + "index": 492 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "5": "1091.15", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 493 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "9": "1", + "index": 494 + }, + { + "0": "4A729E60-7E0A-4080-88C8-A81656F18A24", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:49:26", + "9": "1", + "index": 495 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 496 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "9": "1", + "index": 497 + }, + { + "0": "18C1A371-128D-4C3E-BFA3-AD8A96C5A26E", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:23:32", + "9": "1", + "index": 498 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "5": "228.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 499 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "9": "1", + "index": 500 + }, + { + "0": "A02AA3CD-C055-4B0D-93B3-5D84CFDED0D7", + "1": "A1759222251254350", + "2": "516.24", + "3": "12.0", + "4": "2023-02-21 17:46:31", + "9": "1", + "index": 501 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "5": "514.107929", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 502 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "9": "1", + "index": 503 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 504 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "9": "1", + "index": 505 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 506 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "9": "1", + "index": 507 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "5": "21.71", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 508 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "9": "1", + "index": 509 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 510 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "9": "1", + "index": 511 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 512 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "9": "1", + "index": 513 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "9": "1", + "index": 514 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "9": "1", + "index": 515 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "9": "1", + "index": 516 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "9": "1", + "index": 517 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "9": "1", + "index": 518 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "9": "1", + "index": 519 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "9": "1", + "index": 520 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "9": "1", + "index": 521 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "9": "1", + "index": 522 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "9": "1", + "index": 523 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "9": "1", + "index": 524 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "9": "1", + "index": 525 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "9": "1", + "index": 526 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "9": "1", + "index": 527 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "9": "1", + "index": 528 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "9": "1", + "index": 529 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "9": "1", + "index": 530 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "9": "1", + "index": 531 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "9": "1", + "index": 532 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "9": "1", + "index": 533 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "9": "1", + "index": 534 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "9": "1", + "index": 535 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "9": "1", + "index": 536 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "9": "1", + "index": 537 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "9": "1", + "index": 538 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "9": "1", + "index": 539 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "9": "1", + "index": 540 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "9": "1", + "index": 541 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "9": "1", + "index": 542 + }, + { + "0": "42FC2159-6C83-4CBE-A323-DE9E0546A311", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:34:38", + "9": "1", + "index": 543 + }, + { + "0": "5CAB8F98-F87D-4FB5-8647-F83EF559A9E7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:22", + "9": "1", + "index": 544 + }, + { + "0": "8FBB1DE1-60CE-4F82-A2E8-8CBAB946FED7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:19:02", + "9": "1", + "index": 545 + }, + { + "0": "6EB304F3-0D0F-4767-BFBB-2ACD515CAA42", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:37:35", + "9": "1", + "index": 546 + }, + { + "0": "33615076-74BA-414F-A51C-470C5AFD1FD7", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:37", + "9": "1", + "index": 547 + }, + { + "0": "A6FD29AF-1C86-4558-8D18-89D7F53EC691", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:54", + "9": "1", + "index": 548 + }, + { + "0": "4A4AF956-41C3-4723-8BAD-527243728FE8", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:54", + "9": "1", + "index": 549 + }, + { + "0": "FFF0CCE8-07E1-4100-9491-2853222482EF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:44:10", + "9": "1", + "index": 550 + }, + { + "0": "8DDECA4B-95EF-4FAD-8781-99F8134532FF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:51", + "9": "1", + "index": 551 + }, + { + "0": "E498A57D-E5CF-4883-932E-6B39D7CFF7A0", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:38:18", + "9": "1", + "index": 552 + }, + { + "0": "6DA73B9F-D74B-45A7-82F7-FD10B2840483", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:18", + "9": "1", + "index": 553 + }, + { + "0": "C4F7FAB1-FE05-4F4D-8E52-8C6A3EE96115", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:10", + "9": "1", + "index": 554 + }, + { + "0": "F0A25208-F9BB-401D-A840-36823FB1B0A8", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:34:16", + "9": "1", + "index": 555 + }, + { + "0": "E8CA30F7-3805-48E0-A5E6-6FD71ACF2BE2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:11:36", + "9": "1", + "index": 556 + }, + { + "0": "947519EE-C2DE-42CC-A5CA-B075AEEA05D3", + "1": "A844427390246047", + "2": "5.39", + "3": "22.0", + "4": "2023-02-26 03:30:51", + "9": "1", + "index": 557 + }, + { + "0": "0DF72AD1-2DFD-404E-88A8-965334D9F227", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:38:07", + "9": "1", + "index": 558 + }, + { + "0": "B44556BB-1C72-4B05-B89B-8B078FE110FC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:46", + "9": "1", + "index": 559 + }, + { + "0": "17DA4A53-7EDF-4FE4-A997-3C9AF9255294", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:04", + "9": "1", + "index": 560 + }, + { + "0": "4AD79610-DF94-40EA-AA57-0D0C4C107950", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:19", + "9": "1", + "index": 561 + }, + { + "0": "D2155FC9-8E47-46A6-B8F3-1395DECE7D82", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:35:07", + "9": "1", + "index": 562 + }, + { + "0": "C869ECF0-2A2F-4898-BC65-AD6422144BA5", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:17:22", + "9": "1", + "index": 563 + }, + { + "0": "D1C8D053-633E-457E-AAE3-2CC1801EC80B", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:22:13", + "9": "1", + "index": 564 + }, + { + "0": "411DF6C0-02DE-4D70-977B-EF261BF1D4A1", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:43:06", + "9": "1", + "index": 565 + }, + { + "0": "7E42BCAB-5590-41AD-A18E-8964C2D9CDAA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:38", + "9": "1", + "index": 566 + }, + { + "0": "10F2E1BB-B84B-425E-9CF4-1E9A6AB041D8", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:28:28", + "9": "1", + "index": 567 + }, + { + "0": "CCA3EB41-5AB7-4C77-AFD0-BC552C95E019", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:30", + "9": "1", + "index": 568 + }, + { + "0": "5C9ABE6A-E977-4767-BCC8-A9A0952DB43A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:19:49", + "9": "1", + "index": 569 + }, + { + "0": "1731D105-5F5C-4CEE-955B-AD9B4372603D", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:32:27", + "9": "1", + "index": 570 + }, + { + "0": "CDD70229-CFCE-4192-829D-980CC5F0AD96", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:30:20", + "9": "1", + "index": 571 + }, + { + "0": "69A8BDFE-9310-4098-B8E9-D5C0D938E851", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:43:02", + "9": "1", + "index": 572 + }, + { + "0": "1E8F78CA-543C-46F5-A429-593B1B48D8E9", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:02", + "9": "1", + "index": 573 + }, + { + "0": "06CF9747-053E-4361-8048-CD6D0F16812C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:31", + "9": "1", + "index": 574 + }, + { + "0": "9606F304-48F8-47E9-A666-2BD97690632F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:47", + "9": "1", + "index": 575 + }, + { + "0": "A7FC7EAE-BB1E-4E93-8BFE-E9C1B71792AB", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:49", + "9": "1", + "index": 576 + }, + { + "0": "086FDEAF-BF57-4B51-93F4-169E3609D287", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:44", + "9": "1", + "index": 577 + }, + { + "0": "C54EC40B-86FC-497A-A701-8FBDE5A2375D", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:08:37", + "9": "1", + "index": 578 + }, + { + "0": "D797769A-8A65-47DF-8473-35A29AC81B24", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:15:33", + "9": "1", + "index": 579 + }, + { + "0": "7B14E6C6-F218-4C61-A29A-B3157D7A0E4A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:55", + "9": "1", + "index": 580 + }, + { + "0": "9E41C0F4-5345-4439-B996-52841214F9FE", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:15", + "9": "1", + "index": 581 + }, + { + "0": "7F6AEAAA-ED61-4163-8C5E-289FB74045B4", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:23", + "9": "1", + "index": 582 + }, + { + "0": "D81F2077-E5A4-4DCC-85CB-5D37243F3386", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:53:36", + "9": "1", + "index": 583 + }, + { + "0": "47E230FD-DD71-432D-8EDA-F6F721A0611B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:09", + "9": "1", + "index": 584 + }, + { + "0": "70A54CA5-D32A-4DB1-8F56-B406D827A7B7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:08:34", + "9": "1", + "index": 585 + }, + { + "0": "A76875A6-59E2-4D02-8FF1-48EADE6B83A7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:00:13", + "9": "1", + "index": 586 + }, + { + "0": "FB41B881-4D5F-4357-9363-35FB4856F4B6", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:37", + "9": "1", + "index": 587 + }, + { + "0": "8454CEA5-B059-4E44-8ADE-100460ED0992", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:24", + "9": "1", + "index": 588 + }, + { + "0": "B94780BA-6067-4DAD-AA2A-BACE10FA26EA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:55:42", + "9": "1", + "index": 589 + }, + { + "0": "0550F138-938B-4710-83ED-00EC64D186E3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:04:17", + "9": "1", + "index": 590 + }, + { + "0": "2E0F3E5F-83E2-4414-8D46-00367E4279AD", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:41:39", + "9": "1", + "index": 591 + }, + { + "0": "910E41CD-FF30-4CFB-80F2-9799BDC60C48", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:31:33", + "9": "1", + "index": 592 + }, + { + "0": "9BC1E2D0-E438-4343-B319-212B06186B71", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:01", + "9": "1", + "index": 593 + }, + { + "0": "6A4D6552-8D68-49DA-8B16-D5094B3ED747", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:35:26", + "9": "1", + "index": 594 + }, + { + "0": "88CFD0B0-2A86-4BD2-9CED-4F37E1E9DFFE", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:21:26", + "9": "1", + "index": 595 + }, + { + "0": "3BDC3741-807B-447D-9A8D-9396CB1519BA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:16:10", + "9": "1", + "index": 596 + }, + { + "0": "6867FF41-D687-4B12-B2D2-A7B54F3728B9", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:52", + "9": "1", + "index": 597 + }, + { + "0": "21EB96F0-6C2C-4168-BEEA-A253EE75FE7B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:10", + "9": "1", + "index": 598 + }, + { + "0": "051BDF69-D526-4951-A7E0-9A933A9899FF", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:16:57", + "9": "1", + "index": 599 + }, + { + "0": "A53C943B-A88C-4EB6-9A34-C386E9E8879C", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:53", + "9": "1", + "index": 600 + }, + { + "0": "1580B155-E0E0-40CB-841D-E2A5D2DB0E7E", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:57:02", + "9": "1", + "index": 601 + }, + { + "0": "E8E24E34-5D81-4891-BACF-7CD208CD56D4", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:09:15", + "9": "1", + "index": 602 + }, + { + "0": "1ECF8464-01D3-40DC-AC34-DC665D7839C4", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:14:50", + "9": "1", + "index": 603 + }, + { + "0": "D43FE025-6D1B-4FE0-8E42-BC3E95A76823", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:52", + "9": "1", + "index": 604 + }, + { + "0": "128EAA6F-8869-498D-8ADD-990F268B7F4D", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:35:59", + "9": "1", + "index": 605 + }, + { + "0": "D024ED6A-545B-44B2-827E-D7B9D98C592D", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:23", + "9": "1", + "index": 606 + }, + { + "0": "CFE1CF54-83D2-4396-88F9-7F0E7C2ED586", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:16", + "9": "1", + "index": 607 + }, + { + "0": "A06EBEB4-92ED-4F42-8211-F28EC67E5DF5", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:18:42", + "9": "1", + "index": 608 + }, + { + "0": "2D6EB785-22EC-4879-82A2-C643810EA7C1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:18:56", + "9": "1", + "index": 609 + }, + { + "0": "9C4E2317-10BB-4BDE-AE2F-09EA29B0FD8A", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:14", + "9": "1", + "index": 610 + }, + { + "0": "0A282803-01E1-4193-B72A-F135B850DCB5", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:32:12", + "9": "1", + "index": 611 + }, + { + "0": "1504CCD5-386C-4201-8362-D235C13D93AC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:07:35", + "9": "1", + "index": 612 + }, + { + "0": "547D4C95-528D-46FC-A5A5-FA307B44A329", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:16:20", + "9": "1", + "index": 613 + }, + { + "0": "A5DA7BE5-A6BA-492B-B43E-588713661CDE", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:32", + "9": "1", + "index": 614 + }, + { + "0": "209685D0-27D7-42CE-A3A2-24F643DD387F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:17", + "9": "1", + "index": 615 + }, + { + "0": "5ABD00A4-C232-4D58-8A78-63ABE223F182", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:58", + "9": "1", + "index": 616 + }, + { + "0": "460FA98A-658B-4543-BBC0-EFBFCD7436FD", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:07", + "9": "1", + "index": 617 + }, + { + "0": "A440EC4D-B52B-4F0E-949A-EB6699D67175", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:54", + "9": "1", + "index": 618 + }, + { + "0": "03D4C75E-6EE7-421E-85F5-BD0BF2158BD4", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:33:21", + "9": "1", + "index": 619 + }, + { + "0": "29140357-C78E-4066-9BE5-CB7D5364BBD0", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:56", + "9": "1", + "index": 620 + }, + { + "0": "3F889B35-49FC-47BC-9E5E-2DF06FA12290", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:01", + "9": "1", + "index": 621 + }, + { + "0": "3C38413D-BA5E-4F68-9CE5-BAF48E13DE3C", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:21:29", + "9": "1", + "index": 622 + }, + { + "0": "4560AC71-6EB0-4590-8C1D-F39E8C2B743A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:57", + "9": "1", + "index": 623 + }, + { + "0": "1DA8653D-7E02-48A4-AECA-CF30E3784FD3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:40", + "9": "1", + "index": 624 + }, + { + "0": "566C00BC-EB37-41D8-9202-CCAC36616EB0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:43:37", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 625 + }, + { + "0": "0EB011D9-CAF2-4A02-8ACF-03895BE44128", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:53:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 626 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 627 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 628 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 629 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 630 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 631 + }, + { + "0": "2104E85A-B76B-419E-8204-3EAB76C7D122", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:11:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 632 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 633 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 634 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 635 + }, + { + "0": "D74EFAAF-1FCC-4F41-AB01-317001E86EF1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 19:42:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 636 + }, + { + "0": "01CE8E80-F8C6-4EA6-92A5-4D3077CE9449", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:06:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 637 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 638 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 639 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 640 + }, + { + "0": "5EE5C089-EEC1-40F9-B997-D8EA4BDA79C1", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:19:40", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 641 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 642 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 643 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 644 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 645 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 646 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 647 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 648 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 649 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 650 + }, + { + "0": "EA452A8D-BA16-42A9-BC9E-D2A1ECE62675", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:13:51", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 651 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 652 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 653 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 654 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 655 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 656 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 657 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 658 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 659 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 660 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 661 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "9": "1", + "index": 662 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 663 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "9": "1", + "index": 664 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "5": "1200.68", + "6": "false", + "7": "1.0", + "8": "2.0", + "9": "1", + "index": 665 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "9": "1", + "index": 666 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 667 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "9": "1", + "index": 668 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "9": "1", + "index": 669 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "9": "1", + "index": 670 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 671 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 672 + }, + { + "0": "3BBA55DF-FAE7-4F71-A7E9-2CE883BE50C2", + "1": "A985156290472668", + "2": "5.34", + "3": "8.0", + "4": "2023-02-27 15:11:10", + "5": "5.34", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 673 + }, + { + "0": "7CD9A9C3-3CE1-49B9-8299-039B7955F0F4", + "1": "A985156290472668", + "2": "5.34", + "3": "17.0", + "4": "2023-02-27 22:55:15", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 674 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 675 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "9": "1", + "index": 676 + }, + { + "0": "2E8C3C5B-4ECB-451D-8F50-BD946950FAC4", + "1": "A1899945509487400", + "2": "5.4", + "3": "20.0", + "4": "2023-02-26 02:50:39", + "9": "1", + "index": 677 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "5": "10.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 678 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "9": "1", + "index": 679 + }, + { + "0": "13CC7673-A59D-45CF-8287-2B4E8EE05396", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:46:49", + "9": "1", + "index": 680 + }, + { + "0": "770A0525-2D27-4173-B6BF-A5EA905162DC", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:47:43", + "9": "1", + "index": 681 + }, + { + "0": "CEA84E44-9194-48A0-A5F7-5BFA43E671BF", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:44:44", + "9": "1", + "index": 682 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 683 + }, + { + "0": "25C5DCA0-AACA-4FF2-870E-7A08EC230EF6", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:51:23", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 684 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "9": "1", + "index": 685 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "9": "1", + "index": 686 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "9": "1", + "index": 687 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "9": "1", + "index": 688 + }, + { + "0": "996C6CB5-D9A8-4B88-A723-6A002E6B893F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:44:00", + "9": "1", + "index": 689 + }, + { + "0": "45775ADF-C0C1-4AB2-97A6-BEE6F012632F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:36:29", + "9": "1", + "index": 690 + }, + { + "0": "427FDE58-CA6D-4D48-B528-AD194856D115", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:02:10", + "9": "1", + "index": 691 + }, + { + "0": "5E74AE55-CFA6-4337-9B6B-CA9933D5A6D8", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:06:09", + "9": "1", + "index": 692 + }, + { + "0": "3FC40238-6110-46A6-BE38-CF80320791A1", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:28:41", + "9": "1", + "index": 693 + }, + { + "0": "D7BC1361-E730-4463-9DE7-2B9D92DB5A5B", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:13", + "9": "1", + "index": 694 + }, + { + "0": "441AEEE6-AAA6-40CB-9173-FBEF1C355ACC", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:46:27", + "9": "1", + "index": 695 + }, + { + "0": "9BE72279-7902-492D-9265-744491E4F86D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:16:50", + "9": "1", + "index": 696 + }, + { + "0": "0D43D3F2-A352-4700-8FEC-8E02EF44A514", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:45", + "9": "1", + "index": 697 + }, + { + "0": "D52E262C-77C6-4C20-B9FA-F5A408BED455", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:31:12", + "9": "1", + "index": 698 + }, + { + "0": "8C337F6E-E17F-4CDA-833A-CBEF20C65CF9", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:04:05", + "9": "1", + "index": 699 + }, + { + "0": "218C5731-A37A-4CBA-8D3B-EF20FF23DEAE", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:03", + "9": "1", + "index": 700 + }, + { + "0": "0FBA8C42-194E-4E18-85DB-D1FA1EB7C05D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:41:53", + "9": "1", + "index": 701 + }, + { + "0": "702CD93B-73B6-4F45-8FE8-7F83EC633AA0", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:12", + "9": "1", + "index": 702 + }, + { + "0": "216991DF-33A6-4090-90AA-3E09DDF390E4", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:48:52", + "9": "1", + "index": 703 + }, + { + "0": "B3B0727B-ADF3-4621-9DFC-D0C8CB6E6F26", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:41", + "9": "1", + "index": 704 + }, + { + "0": "66709ABD-6D12-456B-82D6-CBD25CFBE285", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:39:19", + "9": "1", + "index": 705 + }, + { + "0": "C187B038-E19A-46AA-A9E0-5BF87BAEE2C1", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:38:51", + "9": "1", + "index": 706 + }, + { + "0": "43BF9531-63BE-46A1-AA90-CFD08FEB3BBB", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:41:50", + "9": "1", + "index": 707 + }, + { + "0": "00746053-49FB-4681-8AAA-10388C1D59E2", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:15:52", + "9": "1", + "index": 708 + }, + { + "0": "A66793DD-03E4-4E15-9CDB-79EC4733C3CA", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:39:54", + "9": "1", + "index": 709 + }, + { + "0": "B49DBC29-4D81-4FEE-8B9F-44415FD7BC80", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:42:26", + "9": "1", + "index": 710 + }, + { + "0": "9E151E5A-C4BE-4AE6-A0F2-62320FD3FD14", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:49:39", + "9": "1", + "index": 711 + }, + { + "0": "96007AC1-F260-4648-97B6-3D3527611B1B", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:29:39", + "9": "1", + "index": 712 + }, + { + "0": "FF63B43E-F5B7-4CFD-81FD-AFBFE1BDDFA0", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:51:59", + "9": "1", + "index": 713 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 714 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 715 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 716 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 717 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "9": "1", + "index": 718 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 719 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "9": "1", + "index": 720 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "5": "104.7", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 721 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "9": "1", + "index": 722 + }, + { + "0": "903D435A-A4E4-489C-95E8-E97B11439B7C", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:19:19", + "9": "1", + "index": 723 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 724 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "9": "1", + "index": 725 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 726 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "9": "1", + "index": 727 + }, + { + "0": "6DCDA408-D527-4CC0-8ECD-BB1DD4C1B51B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:23:20", + "9": "1", + "index": 728 + }, + { + "0": "6DC4F5F7-598E-4782-9981-5466DF994D2B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:34:02", + "9": "1", + "index": 729 + }, + { + "0": "552F9E0D-5395-4995-9047-D71CD17F48CB", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:19:58", + "9": "1", + "index": 730 + }, + { + "0": "8C99CEBB-0BCA-4D2C-BEB7-09A627F46CDF", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:45:27", + "9": "1", + "index": 731 + }, + { + "0": "389398A4-D295-416A-91AE-E890749EFC58", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:30:28", + "9": "1", + "index": 732 + }, + { + "0": "FE374A34-0463-4D17-926A-7F697581AA35", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:24:44", + "9": "1", + "index": 733 + }, + { + "0": "E08DDC49-612E-4227-90CA-79EBCF477113", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-27 10:37:29", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 734 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 735 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "9": "1", + "index": 736 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "5": "793.8542", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 737 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "9": "1", + "index": 738 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 739 + }, + { + "0": "1D803FD7-051D-4D75-94DC-214FC9E55633", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:28:55", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 740 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "9": "1", + "index": 741 + }, + { + "0": "964F4854-0D2F-4852-BA0E-2FF1CAC93990", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:50:02", + "9": "1", + "index": 742 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "5": "240.45", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 743 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "9": "1", + "index": 744 + }, + { + "0": "69A49BAA-59B0-4AEC-AD40-EEE900AE308A", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 05:01:08", + "9": "1", + "index": 745 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "5": "424.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 746 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "9": "1", + "index": 747 + }, + { + "0": "36AD5A93-8DB0-4134-93EA-26D0A7EE8C3B", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:41:19", + "9": "1", + "index": 748 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 749 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "9": "1", + "index": 750 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "9": "1", + "index": 751 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 752 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 753 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "9": "1", + "index": 754 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 755 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "9": "1", + "index": 756 + }, + { + "0": "94BEE01F-8FA2-4685-9870-0172A53F3981", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:25:14", + "9": "1", + "index": 757 + }, + { + "0": "8F080C35-BA5C-41A5-8169-0EDBF1F27219", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:24:02", + "9": "1", + "index": 758 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 759 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "9": "1", + "index": 760 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 761 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "9": "1", + "index": 762 + }, + { + "0": "C365FB49-1531-4219-977D-CBA8CBEF8389", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:37:08", + "9": "1", + "index": 763 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 764 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "9": "1", + "index": 765 + }, + { + "0": "1CE81EB0-7399-41B6-8E55-79A52BBFE9AC", + "1": "A362221882887902", + "2": "0.0", + "4": "2023-03-06 18:07:51", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 766 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "5": "680.89", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 767 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "9": "1", + "index": 768 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 769 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "9": "1", + "index": 770 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 771 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "9": "1", + "index": 772 + }, + { + "0": "8D778823-BB51-4CA8-9CEC-84F4D48E035A", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:24:12", + "9": "1", + "index": 773 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 774 + }, + { + "0": "2193EA41-7C0E-442B-9A2A-A7E6F6CF6D0F", + "1": "A1899947010059410", + "2": "156450.0", + "3": "23.0", + "4": "2023-03-07 14:26:10", + "5": "1725.6435", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "0", + "index": 775 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "9": "1", + "index": 776 + }, + { + "0": "4BE98D88-C717-4C24-809B-1A92A1FFCEBC", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 15:02:16", + "9": "1", + "index": 777 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 778 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "9": "1", + "index": 779 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "5": "1307.65", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 780 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "9": "1", + "index": 781 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "5": "660.422", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 782 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "9": "1", + "index": 783 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 784 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "9": "1", + "index": 785 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 786 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "9": "1", + "index": 787 + }, + { + "0": "34E50410-3939-4466-BCE5-6207661FAF5C", + "1": "A1899946865208980", + "2": "73080.0", + "3": "0.0", + "4": "2023-03-09 16:20:26", + "9": "1", + "index": 788 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 789 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "9": "1", + "index": 790 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "5": "51.24", + "6": "false", + "7": "1.0", + "8": "3.0", + "9": "1", + "index": 791 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "9": "1", + "index": 792 + }, + { + "0": "9F442404-8F9E-45E0-8A10-D5B4C0B3A36A", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:47:03", + "9": "1", + "index": 793 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 794 + }, + { + "0": "A5343E7D-5553-4F25-B916-E18FE75CF2AC", + "1": "A1688853516414440", + "2": "125580.0", + "3": "0.0", + "4": "2023-03-10 15:51:52", + "5": "1385.1474", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 795 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "9": "1", + "index": 796 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "5": "519.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 797 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "9": "1", + "index": 798 + }, + { + "0": "3E6BEDBD-7B2A-40CF-87FC-AE161EA47713", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:57:49", + "9": "1", + "index": 799 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 800 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "9": "1", + "index": 801 + }, + { + "0": "0B787893-9340-4DE8-9CEF-AFFCD6BB8AB0", + "1": "A914800689334401", + "2": "109.99", + "3": "10.0", + "4": "2023-03-04 18:46:15", + "9": "1", + "index": 802 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 803 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "9": "1", + "index": 804 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "5": "103.48965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 805 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "9": "1", + "index": 806 + }, + { + "0": "D3507A5B-38A9-40F9-B992-DB1547B281C9", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:45:45", + "9": "1", + "index": 807 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 808 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "9": "1", + "index": 809 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "9": "1", + "index": 810 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 811 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 812 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "9": "1", + "index": 813 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 814 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "9": "1", + "index": 815 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "5": "403.0362", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 816 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "9": "1", + "index": 817 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "5": "752.68", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 818 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "9": "1", + "index": 819 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "5": "226.95", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 820 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "9": "1", + "index": 821 + }, + { + "0": "E87F43AB-36CC-481F-A7CB-E5F9C1B08F57", + "1": "A1899947009495620", + "2": "62580.0", + "3": "10.0", + "4": "2023-03-13 02:18:34", + "9": "1", + "index": 822 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 823 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "9": "1", + "index": 824 + }, + { + "0": "C2AE42D7-53F6-424F-8470-4B2EF42612EB", + "1": "A1688853662168790", + "2": "62580.0", + "3": "12.0", + "4": "2023-03-13 04:19:44", + "9": "1", + "index": 825 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 826 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "9": "1", + "index": 827 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "5": "152.94", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 828 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "9": "1", + "index": 829 + }, + { + "0": "14EF7AD5-A3AA-4E9E-B377-74A47CDC2785", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:58:58", + "9": "1", + "index": 830 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "5": "839.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 831 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "9": "1", + "index": 832 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "5": "593.58", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 833 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "9": "1", + "index": 834 + }, + { + "0": "1AE19EA1-54DF-4E2A-889F-E47C3AFE65AF", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:11:13", + "9": "1", + "index": 835 + }, + { + "0": "8717C0FD-51C1-4457-BABB-D356176DDF24", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:09:53", + "9": "1", + "index": 836 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 837 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "9": "1", + "index": 838 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 839 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "9": "1", + "index": 840 + }, + { + "0": "57E282C4-3F49-485B-B5B8-CACAEEF05078", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:47:32", + "9": "1", + "index": 841 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 842 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "9": "1", + "index": 843 + }, + { + "0": "A541504B-98D3-492E-89A4-994617EFA9CA", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:58:56", + "9": "1", + "index": 844 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 845 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "9": "1", + "index": 846 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 847 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "9": "1", + "index": 848 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "5": "210.99", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 849 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "9": "1", + "index": 850 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 851 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "9": "1", + "index": 852 + }, + { + "0": "0F4F57CC-5436-4377-9B91-B6C7D0CC67E8", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:35:53", + "9": "1", + "index": 853 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "5": "614.195251", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 854 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "9": "1", + "index": 855 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "5": "112.30134", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 856 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "9": "1", + "index": 857 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 858 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "9": "1", + "index": 859 + }, + { + "0": "47A9F4BA-03C8-4900-BEF0-BADCF3C21D99", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:19:14", + "9": "1", + "index": 860 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 861 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "9": "1", + "index": 862 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 863 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "9": "1", + "index": 864 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "5": "211.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 865 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "9": "1", + "index": 866 + }, + { + "0": "16346EB5-B1D7-438D-8F50-E46ADB6AEE9A", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:31:16", + "9": "1", + "index": 867 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 868 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "9": "1", + "index": 869 + }, + { + "0": "FFCA8791-18C3-4C81-9D89-1250936E41E1", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:04:04", + "9": "1", + "index": 870 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "5": "147.83", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 871 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "9": "1", + "index": 872 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 873 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "9": "1", + "index": 874 + }, + { + "0": "241DBB1D-3092-4FCE-A4A5-00219ECD6C99", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:35:42", + "9": "1", + "index": 875 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 876 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "9": "1", + "index": 877 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "5": "75.76", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 878 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "9": "1", + "index": 879 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 880 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "9": "1", + "index": 881 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 882 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "9": "1", + "index": 883 + }, + { + "0": "92EA085E-FD70-425B-80EB-4513BFBA8AF1", + "1": "A985157038112964", + "2": "150.14", + "3": "22.0", + "4": "2023-03-26 03:25:46", + "9": "1", + "index": 884 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "5": "150.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 885 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "9": "1", + "index": 886 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 887 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "9": "1", + "index": 888 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "5": "1132.3531", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 889 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "9": "1", + "index": 890 + }, + { + "0": "138D8A92-4C50-4A5F-BA5B-7E6517F3B0B9", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:48:08", + "9": "1", + "index": 891 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 892 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "9": "1", + "index": 893 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "5": "2264.7062", + "6": "true", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 894 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "9": "1", + "index": 895 + }, + { + "0": "237AD504-9222-4DAF-BBB9-5C86C4A0DF90", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:57:24", + "9": "1", + "index": 896 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "5": "260.370211", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 897 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "9": "1", + "index": 898 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "5": "159.0", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 899 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "9": "1", + "index": 900 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "9": "1", + "index": 901 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 902 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 903 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "9": "1", + "index": 904 + }, + { + "0": "A44E3875-069E-472A-B3FB-5ADC3A7CDF66", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:51:16", + "9": "1", + "index": 905 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "5": "285.167374", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 906 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "9": "1", + "index": 907 + }, + { + "0": "D6AE2567-ECC7-46FF-8389-BCF43C8A81D4", + "1": "A1055521435373420", + "2": "278.88", + "3": "0.0", + "4": "2023-03-30 06:20:02", + "9": "1", + "index": 908 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 909 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "9": "1", + "index": 910 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "5": "155.03704199999999", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 911 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "9": "1", + "index": 912 + }, + { + "0": "87726A9D-DF55-4685-82A1-5D4F9E022F5A", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:30:46", + "9": "1", + "index": 913 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "5": "145.347227", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 914 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "9": "1", + "index": 915 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "5": "405.099999", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 916 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "9": "1", + "index": 917 + }, + { + "0": "E4BE3429-CFC8-44D0-B48F-BCD7D875D0E9", + "1": "A1759222229520370", + "2": "599.0", + "3": "23.0", + "4": "2023-01-03 14:02:57", + "9": "1", + "index": 918 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "5": "176.66415", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 919 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "9": "1", + "index": 920 + }, + { + "0": "979DF1CE-FE47-47FE-A8ED-ED1119F41065", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:03:58", + "9": "1", + "index": 921 + }, + { + "0": "E9D60DF2-0E4B-4396-A84B-A0B9E88B3B63", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:02:50", + "9": "1", + "index": 922 + }, + { + "0": "F178386E-86A3-4F08-B9B0-6778898CAD4E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:56:06", + "9": "1", + "index": 923 + }, + { + "0": "2D228D45-7E38-45CF-BD23-8D4F3445FFF8", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:52:56", + "9": "1", + "index": 924 + }, + { + "0": "3FB022CD-5FEE-43CE-A742-F25EFC9F48DF", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:06:11", + "9": "1", + "index": 925 + }, + { + "0": "ABE168A6-3636-4202-9389-95E44E65881E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:14:56", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 926 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 927 + }, + { + "0": "169212AC-3DBA-4EA6-A5AE-031C407DC3AA", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:00:28", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 928 + }, + { + "0": "C4F83897-54F9-4208-987E-DDE9D20F0B4B", + "1": "A1688853657869890", + "2": "52.99", + "3": "11.0", + "4": "2023-01-03 17:27:59", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 929 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "9": "1", + "index": 930 + }, + { + "0": "783D965E-660F-4591-8AB5-3F3327E0B8AB", + "1": "A1759222095873190", + "2": "160.47", + "3": "11.0", + "4": "2023-01-03 17:41:15", + "9": "1", + "index": 931 + }, + { + "0": "DD2D73FD-7DAF-49A5-AC4A-47117E6DE03C", + "1": "A1759222095873190", + "2": "53.49", + "3": "11.0", + "4": "2023-01-03 17:37:53", + "9": "1", + "index": 932 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "5": "106.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 933 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "9": "1", + "index": 934 + }, + { + "0": "ADB8EB04-9D65-43A5-9CF1-5F86D904FC18", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:59:06", + "9": "1", + "index": 935 + }, + { + "0": "636DA8EE-8D04-49D9-9BFE-21FAE9991FE6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:57:29", + "9": "1", + "index": 936 + }, + { + "0": "FE12EF10-2C8B-4F97-8D72-8CA106A2FDB6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:56:12", + "9": "1", + "index": 937 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "5": "64.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 938 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "9": "1", + "index": 939 + }, + { + "0": "EE72DD0F-F132-4E86-9CC5-9FB6386668A0", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:41:24", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 940 + }, + { + "0": "DE94FF49-79D4-417C-87B2-6682EC4AA382", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:38:47", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 941 + }, + { + "0": "415F4169-0DE1-4D1D-B056-823D02BFEDF6", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:51:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 942 + }, + { + "0": "9B5ACCF3-D278-48E9-867E-6027988CEA01", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:24:33", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 943 + }, + { + "0": "B352C087-14C9-4B8A-B239-0C4D861AF091", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:45:31", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 944 + }, + { + "0": "CB9D1331-694E-46E6-8A0A-0C16404FD315", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:46:26", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 945 + }, + { + "0": "8B065D0D-9FBB-4815-B341-DDA432223550", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:35:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 946 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 947 + }, + { + "0": "C1399C61-74D6-40B3-8289-AC99FAFF4988", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:36:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 948 + }, + { + "0": "76770317-5FD5-4C96-B77B-43BE377FDC6D", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:48:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 949 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "9": "1", + "index": 950 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "5": "54.26", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 951 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "9": "1", + "index": 952 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 953 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "9": "1", + "index": 954 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 955 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "9": "1", + "index": 956 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "5": "26.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 957 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "9": "1", + "index": 958 + }, + { + "0": "84633227-12F0-4157-AEA8-4F844146BC47", + "1": "A985156984009293", + "2": "15.85", + "3": "9.0", + "4": "2023-01-06 17:45:55", + "9": "1", + "index": 959 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "5": "127.19", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 960 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "9": "1", + "index": 961 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "5": "63.89", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 962 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "9": "1", + "index": 963 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 964 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "9": "1", + "index": 965 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 966 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "9": "1", + "index": 967 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "5": "107.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 968 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "9": "1", + "index": 969 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 970 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "9": "1", + "index": 971 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "5": "137.3", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "1", + "index": 972 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "9": "1", + "index": 973 + }, + { + "0": "10B457AE-179C-457B-90BA-1A0E6D8F5143", + "1": "A1055521388773990", + "2": "119.06", + "3": "20.0", + "4": "2023-01-15 02:43:22", + "9": "1", + "index": 974 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "5": "108.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 975 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "9": "1", + "index": 976 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "5": "942.0987220000001", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 977 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "9": "1", + "index": 978 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "5": "299.21525099999997", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 979 + }, + { + "0": "50C46472-B928-49BF-82E2-D1BE1C9DBCF4", + "1": "A1899946943634320", + "2": "149.99", + "3": "12.0", + "4": "2023-01-15 12:57:30", + "5": "236.21925099999999", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 980 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "9": "1", + "index": 981 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 982 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "9": "1", + "index": 983 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "9": "1", + "index": 984 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 985 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 986 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "9": "1", + "index": 987 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 988 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "9": "1", + "index": 989 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "5": "210.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 990 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "9": "1", + "index": 991 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "5": "786.607837", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 992 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "9": "1", + "index": 993 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "5": "212.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 994 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "9": "1", + "index": 995 + }, + { + "0": "CDAFFE95-3687-4886-9668-96EB7645063F", + "1": "A1829582586398540", + "2": "786.79", + "3": "10.0", + "4": "2023-01-20 09:25:50", + "9": "1", + "index": 996 + }, + { + "0": "F70F7BCA-6F5F-4C6C-BEE4-6C92B53E5816", + "1": "A1829582586398540", + "2": "587.0", + "3": "21.0", + "4": "2023-02-03 21:10:03", + "9": "1", + "index": 997 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "5": "160.3882", + "6": "false", + "7": "1.0", + "8": "4.0", + "9": "1", + "index": 998 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "9": "1", + "index": 999 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 1000 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "double" + }, + { + "key": "3", + "name": "localHour", + "type": "double" + }, + { + "key": "4", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "5", + "name": "transactionAmountUSD", + "type": "double" + }, + { + "key": "6", + "name": "isProxyIP", + "type": "boolean" + }, + { + "key": "7", + "name": "digitalItemCount", + "type": "double" + }, + { + "key": "8", + "name": "physicalItemCount", + "type": "double" + }, + { + "key": "9", + "name": "is_fraud", + "type": "bigint" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "443376b9-bea9-4bda-a5e4-c88d119a3767": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "448949ec-b37c-4e56-b11e-8b13c0fa7fdb": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "4b0d5839-f89c-4249-a9aa-059f83145e02": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "12" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "EFFCEF09-9E31-4B39-AD1B-8E169D27C749", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:34:26", + "9": "1", + "10": "359.94", + "11": "59.99", + "12": "6", + "13": "59.99", + "index": 1 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "9": "1", + "10": "399.99", + "11": "399.99", + "12": "1", + "13": "399.99", + "index": 2 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "5": "418.129547", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "399.99", + "11": "399.99", + "12": "1", + "13": "399.99", + "index": 3 + }, + { + "0": "2D6EB785-22EC-4879-82A2-C643810EA7C1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:18:56", + "9": "1", + "10": "43.12", + "11": "5.39", + "12": "8", + "13": "5.39", + "index": 4 + }, + { + "0": "C365FB49-1531-4219-977D-CBA8CBEF8389", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:37:08", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 5 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 6 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 7 + }, + { + "0": "A8E3D8C2-10C0-429E-B6E1-743A0D5C3C17", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:26:46", + "9": "1", + "10": "971.82", + "11": "53.99", + "12": "18", + "13": "53.99", + "index": 8 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "9": "1", + "10": "149.44", + "11": "149.44", + "12": "1", + "13": "149.44", + "index": 9 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.44", + "11": "149.44", + "12": "1", + "13": "149.44", + "index": 10 + }, + { + "0": "87FD50BB-5621-4778-9CBF-604522DDC605", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:36:43", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 11 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 12 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "5": "85.59", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 13 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "9": "1", + "10": "1200.68", + "11": "1200.68", + "12": "1", + "13": "1200.68", + "index": 14 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "5": "1200.68", + "6": "false", + "7": "1.0", + "8": "2.0", + "9": "1", + "10": "1200.68", + "11": "1200.68", + "12": "1", + "13": "1200.68", + "index": 15 + }, + { + "0": "1CE81EB0-7399-41B6-8E55-79A52BBFE9AC", + "1": "A362221882887902", + "2": "0.0", + "4": "2023-03-06 18:07:51", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "10": "0.0", + "11": "0.0", + "12": "1", + "13": "0.0", + "index": 16 + }, + { + "0": "76770317-5FD5-4C96-B77B-43BE377FDC6D", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:48:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "655.6999999999998", + "11": "65.56999999999998", + "12": "10", + "13": "65.56999999999998", + "index": 17 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "9": "1", + "10": "91.93", + "11": "45.965", + "12": "2", + "13": "45.965", + "index": 18 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "5": "31.94", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "91.93", + "11": "45.965", + "12": "2", + "13": "45.965", + "index": 19 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 20 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 21 + }, + { + "0": "7C8DB972-42E3-4C98-B13B-C338C0714D3F", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:55:32", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "239.96", + "11": "59.99", + "12": "4", + "13": "59.99", + "index": 22 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "9": "1", + "10": "314.14", + "11": "157.07", + "12": "2", + "13": "157.07", + "index": 23 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "314.14", + "11": "157.07", + "12": "2", + "13": "157.07", + "index": 24 + }, + { + "0": "826E2F8E-D033-4287-A065-A26210923F90", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:40:40", + "9": "1", + "10": "1457.73", + "11": "53.99", + "12": "27", + "13": "53.99", + "index": 25 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "9": "1", + "10": "517.439999999999", + "11": "5.38999999999999", + "12": "94", + "13": "5.38999999999999", + "index": 26 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "517.439999999999", + "11": "5.38999999999999", + "12": "94", + "13": "5.38999999999999", + "index": 27 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "9": "1", + "10": "36540.0", + "11": "36540.0", + "12": "1", + "13": "36540.0", + "index": 28 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "5": "403.0362", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "36540.0", + "11": "36540.0", + "12": "1", + "13": "36540.0", + "index": 29 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "9": "1", + "10": "235.39", + "11": "235.39", + "12": "1", + "13": "235.39", + "index": 30 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "235.39", + "11": "235.39", + "12": "1", + "13": "235.39", + "index": 31 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "9": "1", + "10": "522.9", + "11": "261.45", + "12": "2", + "13": "261.45", + "index": 32 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "5": "260.370211", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "522.9", + "11": "261.45", + "12": "2", + "13": "261.45", + "index": 33 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "9": "1", + "10": "161.97", + "11": "53.99", + "12": "3", + "13": "53.99", + "index": 34 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "161.97", + "11": "53.99", + "12": "3", + "13": "53.99", + "index": 35 + }, + { + "0": "88A8FA38-800E-459D-A11C-77477E41FC5B", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:08:13", + "9": "1", + "10": "5258.949999999999", + "11": "146.08194444444442", + "12": "36", + "13": "146.08194444444442", + "index": 36 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "9": "1", + "10": "599.0", + "11": "599.0", + "12": "1", + "13": "599.0", + "index": 37 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "5": "626.16465", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "599.0", + "11": "599.0", + "12": "1", + "13": "599.0", + "index": 38 + }, + { + "0": "88CFD0B0-2A86-4BD2-9CED-4F37E1E9DFFE", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:21:26", + "9": "1", + "10": "48.51", + "11": "5.39", + "12": "9", + "13": "5.39", + "index": 39 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "9": "1", + "10": "134.72999999999996", + "11": "4.989999999999998", + "12": "27", + "13": "4.989999999999998", + "index": 40 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "134.72999999999996", + "11": "4.989999999999998", + "12": "27", + "13": "4.989999999999998", + "index": 41 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 42 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 43 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 44 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 45 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "9": "1", + "10": "659.89", + "11": "59.99", + "12": "11", + "13": "59.99", + "index": 46 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "659.89", + "11": "59.99", + "12": "11", + "13": "59.99", + "index": 47 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 48 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 49 + }, + { + "0": "3C38413D-BA5E-4F68-9CE5-BAF48E13DE3C", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:21:29", + "9": "1", + "10": "264.1099999999997", + "11": "5.3899999999999935", + "12": "47", + "13": "5.389999999999993", + "index": 50 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "9": "1", + "10": "216.76", + "11": "108.38", + "12": "2", + "13": "108.38", + "index": 51 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "5": "108.38", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "216.76", + "11": "108.38", + "12": "2", + "13": "108.38", + "index": 52 + }, + { + "0": "AC86DB3A-EEED-44C1-85CF-79DA0AF47B0F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:39:29", + "9": "1", + "10": "1403.74", + "11": "53.99", + "12": "26", + "13": "53.99", + "index": 53 + }, + { + "0": "28C2478A-7236-40ED-A5C4-5BB8A29E561B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:43:14", + "9": "1", + "10": "839.86", + "11": "59.99", + "12": "14", + "13": "59.99", + "index": 54 + }, + { + "0": "2F6CE5C9-1702-4E7A-8A88-40CE991E99BB", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:34:17", + "9": "1", + "10": "279.86", + "11": "19.990000000000002", + "12": "14", + "13": "19.990000000000002", + "index": 55 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 56 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 57 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "9": "1", + "10": "319.7", + "11": "159.85", + "12": "2", + "13": "159.85", + "index": 58 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "319.7", + "11": "159.85", + "12": "2", + "13": "159.85", + "index": 59 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "9": "1", + "10": "210.96", + "11": "105.48", + "12": "2", + "13": "105.48", + "index": 60 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "210.96", + "11": "105.48", + "12": "2", + "13": "105.48", + "index": 61 + }, + { + "0": "DD2D73FD-7DAF-49A5-AC4A-47117E6DE03C", + "1": "A1759222095873190", + "2": "53.49", + "3": "11.0", + "4": "2023-01-03 17:37:53", + "9": "1", + "10": "53.49", + "11": "53.49", + "12": "1", + "13": "53.49", + "index": 62 + }, + { + "0": "D1A1DEF3-8373-40A4-8337-742C4BC68770", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:50:44", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "10": "571.27", + "11": "190.42333333333332", + "12": "3", + "13": "190.42333333333332", + "index": 63 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 64 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 65 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 66 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 67 + }, + { + "0": "E87F43AB-36CC-481F-A7CB-E5F9C1B08F57", + "1": "A1899947009495620", + "2": "62580.0", + "3": "10.0", + "4": "2023-03-13 02:18:34", + "9": "1", + "10": "135660.0", + "11": "67830.0", + "12": "2", + "13": "67830.0", + "index": 68 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "9": "1", + "10": "210.19", + "11": "210.19", + "12": "1", + "13": "210.19", + "index": 69 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "5": "210.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "210.19", + "11": "210.19", + "12": "1", + "13": "210.19", + "index": 70 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "9": "1", + "10": "299.0", + "11": "299.0", + "12": "1", + "13": "299.0", + "index": 71 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "299.0", + "11": "299.0", + "12": "1", + "13": "299.0", + "index": 72 + }, + { + "0": "6DC4F5F7-598E-4782-9981-5466DF994D2B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:34:02", + "9": "1", + "10": "25.2", + "11": "5.04", + "12": "5", + "13": "5.04", + "index": 73 + }, + { + "0": "2193EA41-7C0E-442B-9A2A-A7E6F6CF6D0F", + "1": "A1899947010059410", + "2": "156450.0", + "3": "23.0", + "4": "2023-03-07 14:26:10", + "5": "1725.6435", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "0", + "10": "302610.0", + "11": "100870.0", + "12": "3", + "13": "100870.0", + "index": 74 + }, + { + "0": "BCBDF6C6-1D5A-42F2-A912-E295526FF9B7", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:04:05", + "9": "1", + "10": "4809.039999999998", + "11": "145.72848484848478", + "12": "33", + "13": "145.72848484848478", + "index": 75 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "9": "1", + "10": "301.26", + "11": "301.26", + "12": "1", + "13": "301.26", + "index": 76 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "5": "301.26", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "301.26", + "11": "301.26", + "12": "1", + "13": "301.26", + "index": 77 + }, + { + "0": "06CF9747-053E-4361-8048-CD6D0F16812C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:31", + "9": "1", + "10": "355.73999999999944", + "11": "5.389999999999992", + "12": "64", + "13": "5.389999999999992", + "index": 78 + }, + { + "0": "3BBA55DF-FAE7-4F71-A7E9-2CE883BE50C2", + "1": "A985156290472668", + "2": "5.34", + "3": "8.0", + "4": "2023-02-27 15:11:10", + "5": "5.34", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "21.36", + "11": "5.34", + "12": "4", + "13": "5.34", + "index": 79 + }, + { + "0": "F178386E-86A3-4F08-B9B0-6778898CAD4E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:56:06", + "9": "1", + "10": "158.97", + "11": "52.99", + "12": "3", + "13": "52.99", + "index": 80 + }, + { + "0": "50C46472-B928-49BF-82E2-D1BE1C9DBCF4", + "1": "A1899946943634320", + "2": "149.99", + "3": "12.0", + "4": "2023-01-15 12:57:30", + "5": "236.21925099999999", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "10": "339.98", + "11": "169.99", + "12": "2", + "13": "169.99", + "index": 81 + }, + { + "0": "F5606360-D929-4903-8771-E51207DAF2C6", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:53:31", + "9": "1", + "10": "909.82", + "11": "129.9742857142857", + "12": "7", + "13": "129.9742857142857", + "index": 82 + }, + { + "0": "C8AA8B84-1C89-4B76-B2BF-3C10C3444D89", + "1": "A914801007105746", + "2": "80.73", + "3": "9.0", + "4": "2023-01-25 18:07:59", + "9": "1", + "10": "257.64", + "11": "85.88", + "12": "3", + "13": "85.88", + "index": 83 + }, + { + "0": "F461D35F-457F-40E7-BF42-4C116CF0D921", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:48:49", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 84 + }, + { + "0": "996C6CB5-D9A8-4B88-A723-6A002E6B893F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:44:00", + "9": "1", + "10": "79.84", + "11": "4.99", + "12": "16", + "13": "4.99", + "index": 85 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "9": "1", + "10": "52.99", + "11": "52.99", + "12": "1", + "13": "52.99", + "index": 86 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "52.99", + "11": "52.99", + "12": "1", + "13": "52.99", + "index": 87 + }, + { + "0": "2120F51D-E109-4481-88D7-023757351EDF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:05:23", + "9": "1", + "10": "4959.009999999998", + "11": "145.8532352941176", + "12": "34", + "13": "145.8532352941176", + "index": 88 + }, + { + "0": "DF9AFB75-2D64-4A8A-8743-AA39724E34AD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:39:41", + "9": "1", + "10": "339.83000000000004", + "11": "19.990000000000002", + "12": "17", + "13": "19.990000000000002", + "index": 89 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "9": "1", + "10": "147.69", + "11": "147.69", + "12": "1", + "13": "147.69", + "index": 90 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "5": "147.69", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "147.69", + "11": "147.69", + "12": "1", + "13": "147.69", + "index": 91 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "9": "1", + "10": "63.59", + "11": "63.59", + "12": "1", + "13": "63.59", + "index": 92 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "63.59", + "11": "63.59", + "12": "1", + "13": "63.59", + "index": 93 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 94 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 95 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 96 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 97 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "9": "1", + "10": "752.68", + "11": "752.68", + "12": "1", + "13": "752.68", + "index": 98 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "5": "752.68", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "752.68", + "11": "752.68", + "12": "1", + "13": "752.68", + "index": 99 + }, + { + "0": "415F4169-0DE1-4D1D-B056-823D02BFEDF6", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:51:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "131.14", + "11": "65.57", + "12": "2", + "13": "65.57", + "index": 100 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "9": "1", + "10": "2409.5199999999995", + "11": "141.73647058823528", + "12": "17", + "13": "141.73647058823528", + "index": 101 + }, + { + "0": "3CF32319-BFF3-4CFE-8792-8C4775AD619F", + "1": "A1899946873142120", + "2": "99.98", + "3": "13.0", + "4": "2023-01-03 18:45:18", + "9": "1", + "10": "159.97", + "11": "79.985", + "12": "2", + "13": "79.985", + "index": 102 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "2409.5199999999995", + "11": "141.73647058823528", + "12": "17", + "13": "141.73647058823528", + "index": 103 + }, + { + "0": "2589C5DD-012D-429C-A3C1-8333C3ECE2A4", + "1": "A1829582519835540", + "2": "59.99", + "3": "5.0", + "4": "2023-02-17 11:22:08", + "9": "1", + "10": "247.16000000000003", + "11": "61.790000000000006", + "12": "4", + "13": "61.790000000000006", + "index": 104 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 105 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 106 + }, + { + "0": "961FCF4A-7930-4C04-B37B-A5FDFA414D9E", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:41:14", + "9": "1", + "10": "359.82000000000005", + "11": "19.990000000000002", + "12": "18", + "13": "19.990000000000002", + "index": 107 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "9": "1", + "10": "62.39", + "11": "62.39", + "12": "1", + "13": "62.39", + "index": 108 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "5": "62.39", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "62.39", + "11": "62.39", + "12": "1", + "13": "62.39", + "index": 109 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "9": "1", + "10": "118.58", + "11": "5.39", + "12": "22", + "13": "5.39", + "index": 110 + }, + { + "0": "10F2E1BB-B84B-425E-9CF4-1E9A6AB041D8", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:28:28", + "9": "1", + "10": "549.779999999999", + "11": "5.38999999999999", + "12": "100", + "13": "5.38999999999999", + "index": 111 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "118.58", + "11": "5.39", + "12": "22", + "13": "5.39", + "index": 112 + }, + { + "0": "CFF67307-A9EF-43AC-AE45-D448E2991474", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:39:12", + "9": "1", + "10": "99.99", + "11": "99.99", + "12": "1", + "13": "99.99", + "index": 113 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "9": "1", + "10": "102.48", + "11": "102.48", + "12": "1", + "13": "102.48", + "index": 114 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "5": "102.48", + "6": "false", + "7": "2.0", + "8": "1.0", + "9": "1", + "10": "102.48", + "11": "102.48", + "12": "1", + "13": "102.48", + "index": 115 + }, + { + "0": "69A49BAA-59B0-4AEC-AD40-EEE900AE308A", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 05:01:08", + "9": "1", + "10": "849.98", + "11": "424.99", + "12": "2", + "13": "424.99", + "index": 116 + }, + { + "0": "ACB1088D-CB05-45F9-9B3E-4709989A7443", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:06:03", + "9": "1", + "10": "215.96", + "11": "53.99", + "12": "4", + "13": "53.99", + "index": 117 + }, + { + "0": "07C1A129-EF6A-4B87-BFE4-C4D4CDF7049B", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:01:39", + "9": "1", + "10": "54.11", + "11": "54.11", + "12": "1", + "13": "54.11", + "index": 118 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "9": "1", + "10": "490.0", + "11": "490.0", + "12": "1", + "13": "490.0", + "index": 119 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "5": "660.422", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "490.0", + "11": "490.0", + "12": "1", + "13": "490.0", + "index": 120 + }, + { + "0": "C173A9A3-90B7-4B38-8DAC-D001CDD47814", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:51:29", + "9": "1", + "10": "570.5", + "11": "114.1", + "12": "5", + "13": "114.1", + "index": 121 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "9": "1", + "10": "135660.0", + "11": "67830.0", + "12": "2", + "13": "67830.0", + "index": 122 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "135660.0", + "11": "67830.0", + "12": "2", + "13": "67830.0", + "index": 123 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "9": "1", + "10": "212.49", + "11": "212.49", + "12": "1", + "13": "212.49", + "index": 124 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "5": "212.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "212.49", + "11": "212.49", + "12": "1", + "13": "212.49", + "index": 125 + }, + { + "0": "4B1F2669-E141-4218-8048-95E751DCF8F1", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:54:20", + "9": "1", + "10": "179.97", + "11": "59.99", + "12": "3", + "13": "59.99", + "index": 126 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "9": "1", + "10": "350.34999999999945", + "11": "5.389999999999992", + "12": "63", + "13": "5.389999999999992", + "index": 127 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "350.34999999999945", + "11": "5.389999999999992", + "12": "63", + "13": "5.389999999999992", + "index": 128 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "9": "1", + "10": "139.71999999999997", + "11": "4.989999999999999", + "12": "28", + "13": "4.989999999999999", + "index": 129 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "139.71999999999997", + "11": "4.989999999999999", + "12": "28", + "13": "4.989999999999999", + "index": 130 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "9": "1", + "10": "152.38", + "11": "76.19", + "12": "2", + "13": "76.19", + "index": 131 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "152.38", + "11": "76.19", + "12": "2", + "13": "76.19", + "index": 132 + }, + { + "0": "72B7AED1-0944-4DE8-8BEF-74680BBAC3F1", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:55:28", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "179.97", + "11": "59.99", + "12": "3", + "13": "59.99", + "index": 133 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "9": "1", + "10": "199.4299999999998", + "11": "5.389999999999995", + "12": "35", + "13": "5.389999999999995", + "index": 134 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "199.4299999999998", + "11": "5.389999999999995", + "12": "35", + "13": "5.389999999999995", + "index": 135 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "9": "1", + "10": "119.75", + "11": "119.75", + "12": "1", + "13": "119.75", + "index": 136 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.75", + "11": "119.75", + "12": "1", + "13": "119.75", + "index": 137 + }, + { + "0": "40F8D07E-67EF-4678-8612-FC130DC84F5E", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:00:08", + "9": "1", + "10": "1359.73", + "11": "135.973", + "12": "10", + "13": "135.973", + "index": 138 + }, + { + "0": "0A82E4ED-93EC-4386-AA16-0EA1FC946B6C", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 19:20:25", + "9": "1", + "10": "159.92", + "11": "19.99", + "12": "8", + "13": "19.99", + "index": 139 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "9": "1", + "10": "145.52999999999994", + "11": "5.389999999999998", + "12": "25", + "13": "5.389999999999999", + "index": 140 + }, + { + "0": "411DF6C0-02DE-4D70-977B-EF261BF1D4A1", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:43:06", + "9": "1", + "10": "318.00999999999954", + "11": "5.389999999999993", + "12": "57", + "13": "5.389999999999993", + "index": 141 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "145.52999999999994", + "11": "5.389999999999998", + "12": "25", + "13": "5.389999999999999", + "index": 142 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "9": "1", + "10": "74.89", + "11": "74.89", + "12": "1", + "13": "74.89", + "index": 143 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "74.89", + "11": "74.89", + "12": "1", + "13": "74.89", + "index": 144 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "9": "1", + "10": "768.0", + "11": "384.0", + "12": "2", + "13": "384.0", + "index": 145 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "5": "176.66415", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "768.0", + "11": "384.0", + "12": "2", + "13": "384.0", + "index": 146 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 147 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 148 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "9": "1", + "10": "239.51", + "11": "239.51", + "12": "1", + "13": "239.51", + "index": 149 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.51", + "11": "239.51", + "12": "1", + "13": "239.51", + "index": 150 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "9": "1", + "10": "279.98", + "11": "139.99", + "12": "2", + "13": "139.99", + "index": 151 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "279.98", + "11": "139.99", + "12": "2", + "13": "139.99", + "index": 152 + }, + { + "0": "DE15CA12-F07E-4C7C-9C30-19EF38B2B3E6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:42:16", + "9": "1", + "10": "1511.72", + "11": "53.99", + "12": "28", + "13": "53.99", + "index": 153 + }, + { + "0": "B30F54F2-BBB5-4DFC-B4D6-F3BA03220790", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:28:43", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 154 + }, + { + "0": "964F4854-0D2F-4852-BA0E-2FF1CAC93990", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:50:02", + "9": "1", + "10": "240.45", + "11": "240.45", + "12": "1", + "13": "240.45", + "index": 155 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 156 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 157 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 158 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "85.59", + "11": "85.59", + "12": "1", + "13": "85.59", + "index": 159 + }, + { + "0": "C4F7FAB1-FE05-4F4D-8E52-8C6A3EE96115", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:10", + "9": "1", + "10": "609.0699999999988", + "11": "5.389999999999989", + "12": "50", + "13": "5.3899999999999935", + "index": 160 + }, + { + "0": "B49DBC29-4D81-4FEE-8B9F-44415FD7BC80", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:42:26", + "9": "1", + "10": "74.85000000000001", + "11": "4.99", + "12": "15", + "13": "4.99", + "index": 161 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "9": "1", + "10": "2398.0", + "11": "1199.0", + "12": "2", + "13": "1199.0", + "index": 162 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "2398.0", + "11": "1199.0", + "12": "2", + "13": "1199.0", + "index": 163 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "9": "1", + "10": "1032.48", + "11": "516.24", + "12": "2", + "13": "516.24", + "index": 164 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "5": "514.107929", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "1032.48", + "11": "516.24", + "12": "2", + "13": "516.24", + "index": 165 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "9": "1", + "10": "104.7", + "11": "104.7", + "12": "1", + "13": "104.7", + "index": 166 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "5": "104.7", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "104.7", + "11": "104.7", + "12": "1", + "13": "104.7", + "index": 167 + }, + { + "0": "4BE98D88-C717-4C24-809B-1A92A1FFCEBC", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 15:02:16", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 168 + }, + { + "0": "C110E452-388B-4D53-A271-DE2C06DB410A", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:17:45", + "9": "1", + "10": "647.88", + "11": "53.99", + "12": "12", + "13": "53.99", + "index": 169 + }, + { + "0": "AF5BC5D5-9280-4F4A-860B-D8A4772823AD", + "1": "A985157000299534", + "2": "281.37", + "3": "14.0", + "4": "2023-02-03 19:43:12", + "9": "1", + "10": "438.44", + "11": "219.22", + "12": "2", + "13": "219.22", + "index": 170 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "9": "1", + "10": "377.2999999999994", + "11": "5.389999999999991", + "12": "68", + "13": "5.389999999999992", + "index": 171 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "377.2999999999994", + "11": "5.389999999999991", + "12": "68", + "13": "5.389999999999992", + "index": 172 + }, + { + "0": "96007AC1-F260-4648-97B6-3D3527611B1B", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:29:39", + "9": "1", + "10": "89.82", + "11": "4.989999999999999", + "12": "18", + "13": "4.989999999999999", + "index": 173 + }, + { + "0": "F825E26E-89D0-43AB-B281-D62588C4779A", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:49:42", + "9": "1", + "10": "3609.279999999998", + "11": "144.37119999999993", + "12": "25", + "13": "144.37119999999993", + "index": 174 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "9": "1", + "10": "24.99", + "11": "24.99", + "12": "1", + "13": "24.99", + "index": 175 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "5": "24.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "24.99", + "11": "24.99", + "12": "1", + "13": "24.99", + "index": 176 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "9": "1", + "10": "159.85", + "11": "159.85", + "12": "1", + "13": "159.85", + "index": 177 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "159.85", + "11": "159.85", + "12": "1", + "13": "159.85", + "index": 178 + }, + { + "0": "3826E27E-AAFD-4443-A7E9-A0586D2F0729", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:26:58", + "9": "1", + "10": "254.36", + "11": "127.18", + "12": "2", + "13": "127.18", + "index": 179 + }, + { + "0": "93796897-06CD-4111-8F2D-E27D5CE46B66", + "1": "A844427218518467", + "2": "157.94", + "3": "18.0", + "4": "2023-02-17 23:30:32", + "9": "1", + "10": "315.88", + "11": "157.94", + "12": "2", + "13": "157.94", + "index": 180 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 181 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 182 + }, + { + "0": "21EB96F0-6C2C-4168-BEEA-A253EE75FE7B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:10", + "9": "1", + "10": "458.1499999999992", + "11": "5.389999999999991", + "12": "83", + "13": "5.389999999999991", + "index": 183 + }, + { + "0": "9BE72279-7902-492D-9265-744491E4F86D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:16:50", + "9": "1", + "10": "124.74999999999996", + "11": "4.989999999999998", + "12": "25", + "13": "4.989999999999998", + "index": 184 + }, + { + "0": "8717C0FD-51C1-4457-BABB-D356176DDF24", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:09:53", + "9": "1", + "10": "538.0", + "11": "538.0", + "12": "1", + "13": "538.0", + "index": 185 + }, + { + "0": "9B5ACCF3-D278-48E9-867E-6027988CEA01", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:24:33", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "196.70999999999998", + "11": "65.57", + "12": "3", + "13": "65.57", + "index": 186 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 187 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 188 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "9": "1", + "10": "239.24", + "11": "239.24", + "12": "1", + "13": "239.24", + "index": 189 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "5": "239.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.24", + "11": "239.24", + "12": "1", + "13": "239.24", + "index": 190 + }, + { + "0": "5CE4020A-ABA5-4B60-9BC3-131A126670C6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:03:22", + "9": "1", + "10": "107.98", + "11": "53.99", + "12": "2", + "13": "53.99", + "index": 191 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "9": "1", + "10": "939.0", + "11": "939.0", + "12": "1", + "13": "939.0", + "index": 192 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "5": "170.67264", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "939.0", + "11": "939.0", + "12": "1", + "13": "939.0", + "index": 193 + }, + { + "0": "0B666A57-4CBF-411F-A855-A7B615726FED", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:11:06", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "10": "316.44", + "11": "105.48", + "12": "3", + "13": "105.48", + "index": 194 + }, + { + "0": "16346EB5-B1D7-438D-8F50-E46ADB6AEE9A", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:31:16", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 195 + }, + { + "0": "038E2738-E619-431A-8597-5952B7710EF8", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:20:26", + "9": "1", + "10": "6158.77", + "11": "146.63738095238097", + "12": "42", + "13": "146.63738095238097", + "index": 196 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "9": "1", + "10": "233.19", + "11": "233.19", + "12": "1", + "13": "233.19", + "index": 197 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "233.19", + "11": "233.19", + "12": "1", + "13": "233.19", + "index": 198 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 199 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 200 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 201 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 202 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "9": "1", + "10": "181.77", + "11": "60.59", + "12": "3", + "13": "60.59", + "index": 203 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "5": "60.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "181.77", + "11": "60.59", + "12": "3", + "13": "60.59", + "index": 204 + }, + { + "0": "A6FD29AF-1C86-4558-8D18-89D7F53EC691", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:54", + "9": "1", + "10": "70.07", + "11": "5.39", + "12": "13", + "13": "5.39", + "index": 205 + }, + { + "0": "A06EBEB4-92ED-4F42-8211-F28EC67E5DF5", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:18:42", + "9": "1", + "10": "560.5599999999989", + "11": "5.38999999999999", + "12": "41", + "13": "5.389999999999994", + "index": 206 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 207 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 208 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "9": "1", + "10": "598.0", + "11": "299.0", + "12": "2", + "13": "299.0", + "index": 209 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "598.0", + "11": "299.0", + "12": "2", + "13": "299.0", + "index": 210 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "9": "1", + "10": "406.78", + "11": "406.78", + "12": "1", + "13": "406.78", + "index": 211 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "5": "405.099999", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "406.78", + "11": "406.78", + "12": "1", + "13": "406.78", + "index": 212 + }, + { + "0": "57C6D5D6-43F4-4BD0-9FF5-67E4BB395B99", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:15:43", + "9": "1", + "10": "2259.5499999999997", + "11": "141.22187499999998", + "12": "16", + "13": "141.22187499999998", + "index": 213 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "9": "1", + "10": "258.7199999999997", + "11": "5.3899999999999935", + "12": "46", + "13": "5.3899999999999935", + "index": 214 + }, + { + "0": "1E8F78CA-543C-46F5-A429-593B1B48D8E9", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:02", + "9": "1", + "10": "91.63", + "11": "5.39", + "12": "17", + "13": "5.39", + "index": 215 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "258.7199999999997", + "11": "5.3899999999999935", + "12": "46", + "13": "5.3899999999999935", + "index": 216 + }, + { + "0": "3FB022CD-5FEE-43CE-A742-F25EFC9F48DF", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:06:11", + "9": "1", + "10": "370.93", + "11": "52.99", + "12": "7", + "13": "52.99", + "index": 217 + }, + { + "0": "636DA8EE-8D04-49D9-9BFE-21FAE9991FE6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:57:29", + "9": "1", + "10": "323.95000000000005", + "11": "107.98333333333335", + "12": "3", + "13": "107.98333333333335", + "index": 218 + }, + { + "0": "4324B9F6-5D21-4327-B80F-99057A3B541C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:33:20", + "9": "1", + "10": "299.95", + "11": "59.989999999999995", + "12": "5", + "13": "59.989999999999995", + "index": 219 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "9": "1", + "10": "459.7700000000001", + "11": "19.990000000000006", + "12": "23", + "13": "19.990000000000006", + "index": 220 + }, + { + "0": "9E492C70-9940-4103-9414-FC8F0C741490", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:27:34", + "9": "1", + "10": "219.89000000000001", + "11": "19.990000000000002", + "12": "11", + "13": "19.990000000000002", + "index": 221 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "459.7700000000001", + "11": "19.990000000000006", + "12": "23", + "13": "19.990000000000006", + "index": 222 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "9": "1", + "10": "519.99", + "11": "519.99", + "12": "1", + "13": "519.99", + "index": 223 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "5": "519.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "519.99", + "11": "519.99", + "12": "1", + "13": "519.99", + "index": 224 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "9": "1", + "10": "75.76", + "11": "75.76", + "12": "1", + "13": "75.76", + "index": 225 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "5": "75.76", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "75.76", + "11": "75.76", + "12": "1", + "13": "75.76", + "index": 226 + }, + { + "0": "9E9BB950-7681-4213-B8D7-1E71AE232C43", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:55:40", + "9": "1", + "10": "4059.1899999999973", + "11": "144.97107142857132", + "12": "28", + "13": "144.97107142857132", + "index": 227 + }, + { + "0": "E112F541-98DE-420B-B009-FAA21420164B", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:00", + "9": "1", + "10": "459.7700000000001", + "11": "19.990000000000006", + "12": "23", + "13": "19.990000000000006", + "index": 228 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "9": "1", + "10": "189.99", + "11": "189.99", + "12": "1", + "13": "189.99", + "index": 229 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "5": "299.21525099999997", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "189.99", + "11": "189.99", + "12": "1", + "13": "189.99", + "index": 230 + }, + { + "0": "B44556BB-1C72-4B05-B89B-8B078FE110FC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:46", + "9": "1", + "10": "140.13999999999996", + "11": "5.389999999999999", + "12": "24", + "13": "5.39", + "index": 231 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "9": "1", + "10": "719.0", + "11": "719.0", + "12": "1", + "13": "719.0", + "index": 232 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "5": "1132.3531", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "719.0", + "11": "719.0", + "12": "1", + "13": "719.0", + "index": 233 + }, + { + "0": "84633227-12F0-4157-AEA8-4F844146BC47", + "1": "A985156984009293", + "2": "15.85", + "3": "9.0", + "4": "2023-01-06 17:45:55", + "9": "1", + "10": "143.04", + "11": "71.52", + "12": "2", + "13": "71.52", + "index": 234 + }, + { + "0": "287F81B6-06F6-4C3B-8714-401FA70EC7DA", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:29:49", + "9": "1", + "10": "1025.81", + "11": "53.989999999999995", + "12": "19", + "13": "53.989999999999995", + "index": 235 + }, + { + "0": "19DB47CE-E027-4D8D-8439-ADCC4BBE9879", + "1": "A1899946873142120", + "2": "59.99", + "3": "13.0", + "4": "2023-01-03 18:42:51", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 236 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "9": "1", + "10": "53.9", + "11": "5.39", + "12": "10", + "13": "5.39", + "index": 237 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "53.9", + "11": "5.39", + "12": "10", + "13": "5.39", + "index": 238 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 239 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 240 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "9": "1", + "10": "479.02", + "11": "239.51", + "12": "2", + "13": "239.51", + "index": 241 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "479.02", + "11": "239.51", + "12": "2", + "13": "239.51", + "index": 242 + }, + { + "0": "128EAA6F-8869-498D-8ADD-990F268B7F4D", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:35:59", + "9": "1", + "10": "285.6699999999996", + "11": "5.389999999999993", + "12": "51", + "13": "5.3899999999999935", + "index": 243 + }, + { + "0": "D52E262C-77C6-4C20-B9FA-F5A408BED455", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:31:12", + "9": "1", + "10": "99.79999999999998", + "11": "4.989999999999999", + "12": "20", + "13": "4.989999999999999", + "index": 244 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "9": "1", + "10": "99.0", + "11": "99.0", + "12": "1", + "13": "99.0", + "index": 245 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "5": "99.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "99.0", + "11": "99.0", + "12": "1", + "13": "99.0", + "index": 246 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "9": "1", + "10": "220.98999999999975", + "11": "5.389999999999994", + "12": "39", + "13": "5.389999999999994", + "index": 247 + }, + { + "0": "FB41B881-4D5F-4357-9363-35FB4856F4B6", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:37", + "9": "1", + "10": "592.8999999999988", + "11": "5.389999999999989", + "12": "47", + "13": "5.389999999999993", + "index": 248 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "220.98999999999975", + "11": "5.389999999999994", + "12": "39", + "13": "5.389999999999994", + "index": 249 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "9": "1", + "10": "177.86999999999986", + "11": "5.389999999999996", + "12": "31", + "13": "5.389999999999996", + "index": 250 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "177.86999999999986", + "11": "5.389999999999996", + "12": "31", + "13": "5.389999999999996", + "index": 251 + }, + { + "0": "E08DDC49-612E-4227-90CA-79EBCF477113", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-27 10:37:29", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "5.04", + "11": "5.04", + "12": "1", + "13": "5.04", + "index": 252 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "9": "1", + "10": "538.0", + "11": "538.0", + "12": "1", + "13": "538.0", + "index": 253 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "538.0", + "11": "538.0", + "12": "1", + "13": "538.0", + "index": 254 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "9": "1", + "10": "99.99", + "11": "99.99", + "12": "1", + "13": "99.99", + "index": 255 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "99.99", + "11": "99.99", + "12": "1", + "13": "99.99", + "index": 256 + }, + { + "0": "ADB8EB04-9D65-43A5-9CF1-5F86D904FC18", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:59:06", + "9": "1", + "10": "453.5300000000001", + "11": "113.38250000000002", + "12": "4", + "13": "113.38250000000002", + "index": 257 + }, + { + "0": "F2CD36F5-0FC9-4DBF-9D5A-D6B043795C0C", + "1": "A914801007105746", + "2": "83.06", + "3": "8.0", + "4": "2023-01-23 16:39:58", + "9": "1", + "10": "83.06", + "11": "83.06", + "12": "1", + "13": "83.06", + "index": 258 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "9": "1", + "10": "164.74", + "11": "82.37", + "12": "2", + "13": "82.37", + "index": 259 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "5": "83.14", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "164.74", + "11": "82.37", + "12": "2", + "13": "82.37", + "index": 260 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "9": "1", + "10": "1079.0", + "11": "1079.0", + "12": "1", + "13": "1079.0", + "index": 261 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "5": "542.25145", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "1079.0", + "11": "1079.0", + "12": "1", + "13": "1079.0", + "index": 262 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "9": "1", + "10": "163.16", + "11": "163.16", + "12": "1", + "13": "163.16", + "index": 263 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "5": "163.16", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "163.16", + "11": "163.16", + "12": "1", + "13": "163.16", + "index": 264 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "9": "1", + "10": "304.06", + "11": "152.03", + "12": "2", + "13": "152.03", + "index": 265 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "304.06", + "11": "152.03", + "12": "2", + "13": "152.03", + "index": 266 + }, + { + "0": "3FC40238-6110-46A6-BE38-CF80320791A1", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:28:41", + "9": "1", + "10": "129.73999999999995", + "11": "4.989999999999998", + "12": "26", + "13": "4.989999999999998", + "index": 267 + }, + { + "0": "C2AE42D7-53F6-424F-8470-4B2EF42612EB", + "1": "A1688853662168790", + "2": "62580.0", + "3": "12.0", + "4": "2023-03-13 04:19:44", + "9": "1", + "10": "62580.0", + "11": "62580.0", + "12": "1", + "13": "62580.0", + "index": 268 + }, + { + "0": "A8410FBF-9EE3-4200-A0ED-05631423E0F9", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 08:58:29", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "1199.0", + "11": "1199.0", + "12": "1", + "13": "1199.0", + "index": 269 + }, + { + "0": "EA452A8D-BA16-42A9-BC9E-D2A1ECE62675", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:13:51", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "21.56", + "11": "5.39", + "12": "4", + "13": "5.39", + "index": 270 + }, + { + "0": "F70F7BCA-6F5F-4C6C-BEE4-6C92B53E5816", + "1": "A1829582586398540", + "2": "587.0", + "3": "21.0", + "4": "2023-02-03 21:10:03", + "9": "1", + "10": "587.0", + "11": "587.0", + "12": "1", + "13": "587.0", + "index": 271 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "9": "1", + "10": "16.21", + "11": "8.105", + "12": "2", + "13": "8.105", + "index": 272 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "5": "10.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "16.21", + "11": "8.105", + "12": "2", + "13": "8.105", + "index": 273 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "9": "1", + "10": "1499.0", + "11": "1499.0", + "12": "1", + "13": "1499.0", + "index": 274 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "1499.0", + "11": "1499.0", + "12": "1", + "13": "1499.0", + "index": 275 + }, + { + "0": "EE63EE82-8A5F-4422-8CFA-3CF0C48D05FD", + "1": "A1688853524321290", + "2": "49.98", + "3": "19.0", + "4": "2023-01-05 00:32:25", + "9": "1", + "10": "74.97", + "11": "37.485", + "12": "2", + "13": "37.485", + "index": 276 + }, + { + "0": "673A772C-71A1-4541-8468-7298A4FC0844", + "1": "A1899946873128090", + "2": "75.58", + "3": "20.0", + "4": "2023-02-15 02:34:45", + "9": "1", + "10": "75.58", + "11": "75.58", + "12": "1", + "13": "75.58", + "index": 277 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 278 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 279 + }, + { + "0": "D0F517D0-F18C-41DE-A53F-65C3264C4C5E", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:13:40", + "9": "1", + "10": "485.91", + "11": "53.99", + "12": "9", + "13": "53.99", + "index": 280 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "9": "1", + "10": "149.79", + "11": "149.79", + "12": "1", + "13": "149.79", + "index": 281 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "5": "149.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.79", + "11": "149.79", + "12": "1", + "13": "149.79", + "index": 282 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 283 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 284 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "9": "1", + "10": "65.54", + "11": "65.54", + "12": "1", + "13": "65.54", + "index": 285 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "5": "65.54", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "65.54", + "11": "65.54", + "12": "1", + "13": "65.54", + "index": 286 + }, + { + "0": "43BF9531-63BE-46A1-AA90-CFD08FEB3BBB", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:41:50", + "9": "1", + "10": "74.85000000000001", + "11": "4.99", + "12": "15", + "13": "4.99", + "index": 287 + }, + { + "0": "783D965E-660F-4591-8AB5-3F3327E0B8AB", + "1": "A1759222095873190", + "2": "160.47", + "3": "11.0", + "4": "2023-01-03 17:41:15", + "9": "1", + "10": "320.94", + "11": "106.98", + "12": "3", + "13": "106.98", + "index": 288 + }, + { + "0": "ECC38318-E094-4FAA-9638-6C664AB49DB8", + "1": "A985157000491580", + "2": "299.0", + "3": "19.0", + "4": "2023-02-05 10:03:12", + "9": "1", + "10": "698.99", + "11": "349.495", + "12": "2", + "13": "349.495", + "index": 289 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 290 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 291 + }, + { + "0": "0B787893-9340-4DE8-9CEF-AFFCD6BB8AB0", + "1": "A914800689334401", + "2": "109.99", + "3": "10.0", + "4": "2023-03-04 18:46:15", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 292 + }, + { + "0": "B117C813-5EB9-4747-92B5-C52D520AC13F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:36:39", + "9": "1", + "10": "1295.76", + "11": "53.99", + "12": "24", + "13": "53.99", + "index": 293 + }, + { + "0": "4560AC71-6EB0-4590-8C1D-F39E8C2B743A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:57", + "9": "1", + "10": "339.5699999999995", + "11": "5.389999999999992", + "12": "61", + "13": "5.389999999999992", + "index": 294 + }, + { + "0": "A02AA3CD-C055-4B0D-93B3-5D84CFDED0D7", + "1": "A1759222251254350", + "2": "516.24", + "3": "12.0", + "4": "2023-02-21 17:46:31", + "9": "1", + "10": "516.24", + "11": "516.24", + "12": "1", + "13": "516.24", + "index": 295 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 296 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 297 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "9": "1", + "10": "593.58", + "11": "593.58", + "12": "1", + "13": "593.58", + "index": 298 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "5": "593.58", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "593.58", + "11": "593.58", + "12": "1", + "13": "593.58", + "index": 299 + }, + { + "0": "53F9A1F3-DB12-474B-8E9B-E6ADF22699AF", + "1": "A914800996051170", + "2": "139.99", + "3": "17.0", + "4": "2023-01-07 22:30:40", + "9": "1", + "10": "139.99", + "11": "139.99", + "12": "1", + "13": "139.99", + "index": 300 + }, + { + "0": "C61F74AD-F654-4042-9DFF-567978FA7CF7", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:57:11", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "699.5699999999999", + "11": "233.18999999999997", + "12": "3", + "13": "233.18999999999997", + "index": 301 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "9": "1", + "10": "224.11", + "11": "224.11", + "12": "1", + "13": "224.11", + "index": 302 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "5": "224.11", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "224.11", + "11": "224.11", + "12": "1", + "13": "224.11", + "index": 303 + }, + { + "0": "34DE06CA-82E2-44D3-8E83-E650A493EE27", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:50:42", + "9": "1", + "10": "7958.4100000000035", + "11": "147.37796296296304", + "12": "54", + "13": "147.37796296296304", + "index": 304 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "9": "1", + "10": "95.02", + "11": "95.02", + "12": "1", + "13": "95.02", + "index": 305 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "5": "95.02", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "95.02", + "11": "95.02", + "12": "1", + "13": "95.02", + "index": 306 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "9": "1", + "10": "237.04", + "11": "237.04", + "12": "1", + "13": "237.04", + "index": 307 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "5": "237.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "237.04", + "11": "237.04", + "12": "1", + "13": "237.04", + "index": 308 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "9": "1", + "10": "999999.0", + "11": "999999.0", + "12": "1", + "13": "999999.0", + "index": 309 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "5": "102.999897", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "999999.0", + "11": "999999.0", + "12": "1", + "13": "999999.0", + "index": 310 + }, + { + "0": "D74E0304-9D1B-40AC-8418-33C7FD7FDBD9", + "1": "A844428056745591", + "2": "249.95", + "3": "12.0", + "4": "2023-02-16 20:40:53", + "9": "1", + "10": "299.94", + "11": "149.97", + "12": "2", + "13": "149.97", + "index": 311 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "9": "1", + "10": "307.22999999999956", + "11": "5.389999999999993", + "12": "55", + "13": "5.389999999999993", + "index": 312 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "9": "1", + "10": "555.1699999999989", + "11": "5.38999999999999", + "12": "40", + "13": "5.389999999999994", + "index": 313 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "307.22999999999956", + "11": "5.389999999999993", + "12": "55", + "13": "5.389999999999993", + "index": 314 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "555.1699999999989", + "11": "5.38999999999999", + "12": "40", + "13": "5.389999999999994", + "index": 315 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 316 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 317 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "9": "1", + "10": "150.14", + "11": "150.14", + "12": "1", + "13": "150.14", + "index": 318 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "5": "150.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "150.14", + "11": "150.14", + "12": "1", + "13": "150.14", + "index": 319 + }, + { + "0": "56176B76-FFD4-4252-8BAD-C8F0E105EE2E", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 11:52:43", + "9": "1", + "10": "105.48", + "11": "105.48", + "12": "1", + "13": "105.48", + "index": 320 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "9": "1", + "10": "157.94", + "11": "157.94", + "12": "1", + "13": "157.94", + "index": 321 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "5": "157.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "157.94", + "11": "157.94", + "12": "1", + "13": "157.94", + "index": 322 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 323 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 324 + }, + { + "0": "A440EC4D-B52B-4F0E-949A-EB6699D67175", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:54", + "9": "1", + "10": "253.32999999999967", + "11": "5.389999999999993", + "12": "45", + "13": "5.3899999999999935", + "index": 325 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "9": "1", + "10": "152.94", + "11": "152.94", + "12": "1", + "13": "152.94", + "index": 326 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "5": "152.94", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "152.94", + "11": "152.94", + "12": "1", + "13": "152.94", + "index": 327 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "9": "1", + "10": "75.58", + "11": "75.58", + "12": "1", + "13": "75.58", + "index": 328 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "75.58", + "11": "75.58", + "12": "1", + "13": "75.58", + "index": 329 + }, + { + "0": "35AC8DA0-24ED-4461-B732-7994EAC7AD2C", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:23:47", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 330 + }, + { + "0": "B3B0727B-ADF3-4621-9DFC-D0C8CB6E6F26", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:41", + "9": "1", + "10": "99.79999999999998", + "11": "4.989999999999999", + "12": "20", + "13": "4.989999999999999", + "index": 331 + }, + { + "0": "6EB304F3-0D0F-4767-BFBB-2ACD515CAA42", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:37:35", + "9": "1", + "10": "296.4499999999996", + "11": "5.389999999999993", + "12": "53", + "13": "5.389999999999993", + "index": 332 + }, + { + "0": "389398A4-D295-416A-91AE-E890749EFC58", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:30:28", + "9": "1", + "10": "20.16", + "11": "5.04", + "12": "4", + "13": "5.04", + "index": 333 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "9": "1", + "10": "905.79", + "11": "452.895", + "12": "2", + "13": "452.895", + "index": 334 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "5": "160.3882", + "6": "false", + "7": "1.0", + "8": "4.0", + "9": "1", + "10": "905.79", + "11": "452.895", + "12": "2", + "13": "452.895", + "index": 335 + }, + { + "0": "E6789403-5C39-4D44-BA7C-3A1F481E718B", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:37:59", + "9": "1", + "10": "1349.75", + "11": "53.99", + "12": "25", + "13": "53.99", + "index": 336 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 337 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 338 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "9": "1", + "10": "404.2499999999993", + "11": "5.389999999999991", + "12": "73", + "13": "5.389999999999991", + "index": 339 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "404.2499999999993", + "11": "5.389999999999991", + "12": "73", + "13": "5.389999999999991", + "index": 340 + }, + { + "0": "2E8C3C5B-4ECB-451D-8F50-BD946950FAC4", + "1": "A1899945509487400", + "2": "5.4", + "3": "20.0", + "4": "2023-02-26 02:50:39", + "9": "1", + "10": "5.4", + "11": "5.4", + "12": "1", + "13": "5.4", + "index": 341 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 342 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 343 + }, + { + "0": "5BDE388B-8A30-4D45-8122-F7CA341442C8", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 13:00:25", + "9": "1", + "10": "106.72", + "11": "53.36", + "12": "2", + "13": "53.36", + "index": 344 + }, + { + "0": "A7FC7EAE-BB1E-4E93-8BFE-E9C1B71792AB", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:49", + "9": "1", + "10": "420.4199999999993", + "11": "5.389999999999991", + "12": "76", + "13": "5.389999999999991", + "index": 345 + }, + { + "0": "D024ED6A-545B-44B2-827E-D7B9D98C592D", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:23", + "9": "1", + "10": "377.2999999999994", + "11": "5.389999999999991", + "12": "68", + "13": "5.389999999999992", + "index": 346 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "9": "1", + "10": "40.32", + "11": "5.04", + "12": "8", + "13": "5.04", + "index": 347 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "40.32", + "11": "5.04", + "12": "8", + "13": "5.04", + "index": 348 + }, + { + "0": "DDE0B1F6-40B2-44CA-B0A7-AE46453D51A0", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:25:29", + "9": "1", + "10": "917.83", + "11": "53.99", + "12": "17", + "13": "53.99", + "index": 349 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "9": "1", + "10": "355.63", + "11": "177.815", + "12": "2", + "13": "177.815", + "index": 350 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "355.63", + "11": "177.815", + "12": "2", + "13": "177.815", + "index": 351 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "9": "1", + "10": "549.779999999999", + "11": "5.38999999999999", + "12": "100", + "13": "5.38999999999999", + "index": 352 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "549.779999999999", + "11": "5.38999999999999", + "12": "100", + "13": "5.38999999999999", + "index": 353 + }, + { + "0": "138D8A92-4C50-4A5F-BA5B-7E6517F3B0B9", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:48:08", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 354 + }, + { + "0": "CACD0238-79D3-4506-B78A-F24E494B3AAC", + "1": "A1055521395048230", + "2": "81.6", + "3": "2.0", + "4": "2023-01-25 08:02:13", + "9": "1", + "10": "81.6", + "11": "81.6", + "12": "1", + "13": "81.6", + "index": 355 + }, + { + "0": "8FBB1DE1-60CE-4F82-A2E8-8CBAB946FED7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:19:02", + "9": "1", + "10": "194.03999999999982", + "11": "5.389999999999995", + "12": "34", + "13": "5.389999999999995", + "index": 356 + }, + { + "0": "E8CA30F7-3805-48E0-A5E6-6FD71ACF2BE2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:11:36", + "9": "1", + "10": "167.0899999999999", + "11": "5.389999999999996", + "12": "29", + "13": "5.389999999999997", + "index": 357 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "9": "1", + "10": "789.87", + "11": "789.87", + "12": "1", + "13": "789.87", + "index": 358 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "5": "786.607837", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "789.87", + "11": "789.87", + "12": "1", + "13": "789.87", + "index": 359 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "9": "1", + "10": "269.95", + "11": "53.989999999999995", + "12": "5", + "13": "53.989999999999995", + "index": 360 + }, + { + "0": "A45B5295-84D3-47CD-AFA3-E074A9DF9EF6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:43:38", + "9": "1", + "10": "1565.71", + "11": "53.99", + "12": "29", + "13": "53.99", + "index": 361 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "269.95", + "11": "53.989999999999995", + "12": "5", + "13": "53.989999999999995", + "index": 362 + }, + { + "0": "E7F77A61-785B-4E7D-8C99-6A237E368BC5", + "1": "A1899946895455190", + "2": "19.99", + "3": "12.0", + "4": "2023-01-13 17:22:25", + "9": "1", + "10": "39.98", + "11": "19.99", + "12": "2", + "13": "19.99", + "index": 363 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "9": "1", + "10": "75.46", + "11": "5.39", + "12": "14", + "13": "5.39", + "index": 364 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "75.46", + "11": "5.39", + "12": "14", + "13": "5.39", + "index": 365 + }, + { + "0": "CB9D1331-694E-46E6-8A0A-0C16404FD315", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:46:26", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "590.1299999999999", + "11": "65.57", + "12": "9", + "13": "65.57", + "index": 366 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 367 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 368 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "9": "1", + "10": "53.11", + "11": "53.11", + "12": "1", + "13": "53.11", + "index": 369 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "5": "53.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "53.11", + "11": "53.11", + "12": "1", + "13": "53.11", + "index": 370 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "9": "1", + "10": "108.22", + "11": "54.11", + "12": "2", + "13": "54.11", + "index": 371 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "5": "54.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "108.22", + "11": "54.11", + "12": "2", + "13": "54.11", + "index": 372 + }, + { + "0": "5ABD00A4-C232-4D58-8A78-63ABE223F182", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:58", + "9": "1", + "10": "113.19", + "11": "5.39", + "12": "21", + "13": "5.39", + "index": 373 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "9": "1", + "10": "65.16", + "11": "65.16", + "12": "1", + "13": "65.16", + "index": 374 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "5": "65.16", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "65.16", + "11": "65.16", + "12": "1", + "13": "65.16", + "index": 375 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "9": "1", + "10": "137.3", + "11": "137.3", + "12": "1", + "13": "137.3", + "index": 376 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "5": "137.3", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "1", + "10": "137.3", + "11": "137.3", + "12": "1", + "13": "137.3", + "index": 377 + }, + { + "0": "AD22A063-D3FB-4623-B7A2-69A6C8E5CEE0", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:53:28", + "9": "1", + "10": "3909.2199999999975", + "11": "144.78592592592582", + "12": "27", + "13": "144.78592592592582", + "index": 378 + }, + { + "0": "BE25CE28-7142-4EB4-8157-77654E4816D0", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:24:35", + "9": "1", + "10": "6458.710000000001", + "11": "146.78886363636366", + "12": "44", + "13": "146.78886363636366", + "index": 379 + }, + { + "0": "D3F14FD5-C8C3-4401-8053-A5DCB4086473", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:30:44", + "9": "1", + "10": "179.97", + "11": "59.99", + "12": "3", + "13": "59.99", + "index": 380 + }, + { + "0": "D02E8FB4-3170-4C47-8886-ABE470F197C3", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:03:30", + "9": "1", + "10": "1659.67", + "11": "138.30583333333334", + "12": "12", + "13": "138.30583333333334", + "index": 381 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "9": "1", + "10": "80.79", + "11": "80.79", + "12": "1", + "13": "80.79", + "index": 382 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "5": "80.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "80.79", + "11": "80.79", + "12": "1", + "13": "80.79", + "index": 383 + }, + { + "0": "0D385B17-41FC-4D3B-8C36-BFD0FAF6AA20", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:26:33", + "9": "1", + "10": "847.98", + "11": "423.99", + "12": "2", + "13": "423.99", + "index": 384 + }, + { + "0": "03D4C75E-6EE7-421E-85F5-BD0BF2158BD4", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:33:21", + "9": "1", + "10": "280.27999999999963", + "11": "5.389999999999993", + "12": "50", + "13": "5.3899999999999935", + "index": 385 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "9": "1", + "10": "158760.0", + "11": "79380.0", + "12": "2", + "13": "79380.0", + "index": 386 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "158760.0", + "11": "79380.0", + "12": "2", + "13": "79380.0", + "index": 387 + }, + { + "0": "E44AA2DD-8814-4746-839A-4A3D8EE5F243", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:12:20", + "9": "1", + "10": "431.92", + "11": "53.99", + "12": "8", + "13": "53.99", + "index": 388 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "9": "1", + "10": "153.29", + "11": "153.29", + "12": "1", + "13": "153.29", + "index": 389 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "153.29", + "11": "153.29", + "12": "1", + "13": "153.29", + "index": 390 + }, + { + "0": "8F080C35-BA5C-41A5-8169-0EDBF1F27219", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:24:02", + "9": "1", + "10": "125160.0", + "11": "62580.0", + "12": "2", + "13": "62580.0", + "index": 391 + }, + { + "0": "5AF9F5B3-7386-426B-878E-3F1B7BBF48D9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:56:55", + "9": "1", + "10": "1209.76", + "11": "134.4177777777778", + "12": "9", + "13": "134.4177777777778", + "index": 392 + }, + { + "0": "73F74DE9-9679-417D-A7A8-6D1D74769D9D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:28:23", + "9": "1", + "10": "6758.6500000000015", + "11": "146.9271739130435", + "12": "46", + "13": "146.9271739130435", + "index": 393 + }, + { + "0": "52961216-05ED-4183-8EF5-5237F0352C41", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:17:31", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 394 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "9": "1", + "10": "242.5499999999997", + "11": "5.3899999999999935", + "12": "43", + "13": "5.3899999999999935", + "index": 395 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "242.5499999999997", + "11": "5.3899999999999935", + "12": "43", + "13": "5.3899999999999935", + "index": 396 + }, + { + "0": "B2F718B0-6639-44C6-9E86-04BCCB6765B6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:15:03", + "9": "1", + "10": "539.9", + "11": "53.989999999999995", + "12": "10", + "13": "53.989999999999995", + "index": 397 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "9": "1", + "10": "119.98", + "11": "119.98", + "12": "1", + "13": "119.98", + "index": 398 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "119.98", + "12": "1", + "13": "119.98", + "index": 399 + }, + { + "0": "10366C01-E5BE-4DD8-BD52-1B22971F1F4B", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:39:39", + "9": "1", + "10": "125.30000000000001", + "11": "62.650000000000006", + "12": "2", + "13": "62.650000000000006", + "index": 400 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "9": "1", + "10": "188.64999999999984", + "11": "5.389999999999995", + "12": "33", + "13": "5.389999999999996", + "index": 401 + }, + { + "0": "8DDECA4B-95EF-4FAD-8781-99F8134532FF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:51", + "9": "1", + "10": "188.64999999999984", + "11": "5.389999999999995", + "12": "33", + "13": "5.389999999999996", + "index": 402 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "188.64999999999984", + "11": "5.389999999999995", + "12": "33", + "13": "5.389999999999996", + "index": 403 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "9": "1", + "10": "389.99", + "11": "389.99", + "12": "1", + "13": "389.99", + "index": 404 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "5": "614.195251", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "389.99", + "11": "389.99", + "12": "1", + "13": "389.99", + "index": 405 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "9": "1", + "10": "64.79", + "11": "64.79", + "12": "1", + "13": "64.79", + "index": 406 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "5": "64.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "64.79", + "11": "64.79", + "12": "1", + "13": "64.79", + "index": 407 + }, + { + "0": "630F1681-99D1-4F3C-BCE0-69C6B28E5A98", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:43:12", + "9": "1", + "10": "419.7900000000001", + "11": "19.990000000000002", + "12": "21", + "13": "19.990000000000002", + "index": 408 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "9": "1", + "10": "231.56", + "11": "231.56", + "12": "1", + "13": "231.56", + "index": 409 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "5": "231.56", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "231.56", + "11": "231.56", + "12": "1", + "13": "231.56", + "index": 410 + }, + { + "0": "A5D379FD-D933-4F68-8763-0C5AF07F7834", + "1": "A914801013785993", + "2": "86.98", + "3": "4.0", + "4": "2023-02-03 09:47:07", + "9": "1", + "10": "182.0", + "11": "91.0", + "12": "2", + "13": "91.0", + "index": 411 + }, + { + "0": "29140357-C78E-4066-9BE5-CB7D5364BBD0", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:56", + "9": "1", + "10": "393.46999999999935", + "11": "5.389999999999991", + "12": "71", + "13": "5.389999999999991", + "index": 412 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "9": "1", + "10": "528.219999999999", + "11": "5.38999999999999", + "12": "96", + "13": "5.38999999999999", + "index": 413 + }, + { + "0": "33615076-74BA-414F-A51C-470C5AFD1FD7", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:37", + "9": "1", + "10": "318.00999999999954", + "11": "5.389999999999993", + "12": "57", + "13": "5.389999999999993", + "index": 414 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "528.219999999999", + "11": "5.38999999999999", + "12": "96", + "13": "5.38999999999999", + "index": 415 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 416 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 417 + }, + { + "0": "D6AE2567-ECC7-46FF-8389-BCF43C8A81D4", + "1": "A1055521435373420", + "2": "278.88", + "3": "0.0", + "4": "2023-03-30 06:20:02", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 418 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "9": "1", + "10": "145.59", + "11": "145.59", + "12": "1", + "13": "145.59", + "index": 419 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "5": "145.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "145.59", + "11": "145.59", + "12": "1", + "13": "145.59", + "index": 420 + }, + { + "0": "E9D60DF2-0E4B-4396-A84B-A0B9E88B3B63", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:02:50", + "9": "1", + "10": "264.95", + "11": "52.989999999999995", + "12": "5", + "13": "52.989999999999995", + "index": 421 + }, + { + "0": "973F228D-6E34-4E2C-A8ED-86A560FFE993", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:37:33", + "9": "1", + "10": "3159.3699999999985", + "11": "143.6077272727272", + "12": "22", + "13": "143.6077272727272", + "index": 422 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 423 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 424 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 425 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 426 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 427 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 428 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "9": "1", + "10": "1438.0", + "11": "1438.0", + "12": "1", + "13": "1438.0", + "index": 429 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "5": "2264.7062", + "6": "true", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "1438.0", + "11": "1438.0", + "12": "1", + "13": "1438.0", + "index": 430 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "9": "1", + "10": "701.87", + "11": "53.99", + "12": "13", + "13": "53.99", + "index": 431 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "701.87", + "11": "53.99", + "12": "13", + "13": "53.99", + "index": 432 + }, + { + "0": "64A65086-D78C-4C67-994D-06DC95737FB5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:09:49", + "9": "1", + "10": "2109.58", + "11": "140.63866666666667", + "12": "15", + "13": "140.63866666666667", + "index": 433 + }, + { + "0": "44D80959-7137-4EDB-AEEE-1B7654A9A2A2", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-23 01:16:41", + "9": "1", + "10": "119.99", + "11": "119.99", + "12": "1", + "13": "119.99", + "index": 434 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 435 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 436 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "9": "1", + "10": "235.39", + "11": "235.39", + "12": "1", + "13": "235.39", + "index": 437 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "235.39", + "11": "235.39", + "12": "1", + "13": "235.39", + "index": 438 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "9": "1", + "10": "479.7099999999991", + "11": "5.38999999999999", + "12": "87", + "13": "5.38999999999999", + "index": 439 + }, + { + "0": "47E230FD-DD71-432D-8EDA-F6F721A0611B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:09", + "9": "1", + "10": "447.3699999999992", + "11": "5.389999999999991", + "12": "81", + "13": "5.389999999999991", + "index": 440 + }, + { + "0": "910E41CD-FF30-4CFB-80F2-9799BDC60C48", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:31:33", + "9": "1", + "10": "80.85", + "11": "5.39", + "12": "15", + "13": "5.39", + "index": 441 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "479.7099999999991", + "11": "5.38999999999999", + "12": "87", + "13": "5.38999999999999", + "index": 442 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 443 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 444 + }, + { + "0": "947519EE-C2DE-42CC-A5CA-B075AEEA05D3", + "1": "A844427390246047", + "2": "5.39", + "3": "22.0", + "4": "2023-02-26 03:30:51", + "9": "1", + "10": "533.609999999999", + "11": "5.38999999999999", + "12": "97", + "13": "5.38999999999999", + "index": 445 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "9": "1", + "10": "466.38", + "11": "233.19", + "12": "2", + "13": "233.19", + "index": 446 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "466.38", + "11": "233.19", + "12": "2", + "13": "233.19", + "index": 447 + }, + { + "0": "EA8C66F4-8916-4822-85FA-583C2186501A", + "1": "A985156821621035", + "2": "152.03", + "3": "21.0", + "4": "2023-02-22 05:05:07", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "152.03", + "11": "152.03", + "12": "1", + "13": "152.03", + "index": 448 + }, + { + "0": "69A8BDFE-9310-4098-B8E9-D5C0D938E851", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:43:02", + "9": "1", + "10": "641.4099999999987", + "11": "5.389999999999989", + "12": "56", + "13": "5.389999999999993", + "index": 449 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "9": "1", + "10": "119.98", + "11": "119.98", + "12": "1", + "13": "119.98", + "index": 450 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "119.98", + "12": "1", + "13": "119.98", + "index": 451 + }, + { + "0": "8875BFC3-B41E-416A-A334-65EB49672BEC", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:29:02", + "9": "1", + "10": "227.5", + "11": "113.75", + "12": "2", + "13": "113.75", + "index": 452 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "9": "1", + "10": "149.94", + "11": "49.98", + "12": "3", + "13": "49.98", + "index": 453 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "5": "74.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "149.94", + "11": "49.98", + "12": "3", + "13": "49.98", + "index": 454 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 455 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 456 + }, + { + "0": "6867FF41-D687-4B12-B2D2-A7B54F3728B9", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:52", + "9": "1", + "10": "474.31999999999914", + "11": "5.38999999999999", + "12": "86", + "13": "5.38999999999999", + "index": 457 + }, + { + "0": "1ECF8464-01D3-40DC-AC34-DC665D7839C4", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:14:50", + "9": "1", + "10": "210.20999999999978", + "11": "5.389999999999994", + "12": "37", + "13": "5.389999999999995", + "index": 458 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "9": "1", + "10": "839.97", + "11": "839.97", + "12": "1", + "13": "839.97", + "index": 459 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "5": "839.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "839.97", + "11": "839.97", + "12": "1", + "13": "839.97", + "index": 460 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "9": "1", + "10": "211.89", + "11": "211.89", + "12": "1", + "13": "211.89", + "index": 461 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "5": "211.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "211.89", + "11": "211.89", + "12": "1", + "13": "211.89", + "index": 462 + }, + { + "0": "76824E16-8144-4C10-8769-DF9049DE4BB3", + "1": "A1899946873128090", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 03:38:31", + "9": "1", + "10": "315.54", + "11": "105.18", + "12": "3", + "13": "105.18", + "index": 463 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "9": "1", + "10": "424.99", + "11": "424.99", + "12": "1", + "13": "424.99", + "index": 464 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "5": "424.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "424.99", + "11": "424.99", + "12": "1", + "13": "424.99", + "index": 465 + }, + { + "0": "A541504B-98D3-492E-89A4-994617EFA9CA", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:58:56", + "9": "1", + "10": "157500.0", + "11": "78750.0", + "12": "2", + "13": "78750.0", + "index": 466 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "9": "1", + "10": "210.99", + "11": "210.99", + "12": "1", + "13": "210.99", + "index": 467 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "5": "210.99", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "210.99", + "11": "210.99", + "12": "1", + "13": "210.99", + "index": 468 + }, + { + "0": "87726A9D-DF55-4685-82A1-5D4F9E022F5A", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:30:46", + "9": "1", + "10": "145.95", + "11": "145.95", + "12": "1", + "13": "145.95", + "index": 469 + }, + { + "0": "D1119E3D-720D-46A4-9772-C456EA3B0D4D", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:46:16", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 470 + }, + { + "0": "A5DA7BE5-A6BA-492B-B43E-588713661CDE", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:32", + "9": "1", + "10": "361.1299999999994", + "11": "5.389999999999992", + "12": "65", + "13": "5.389999999999992", + "index": 471 + }, + { + "0": "FE12EF10-2C8B-4F97-8D72-8CA106A2FDB6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:56:12", + "9": "1", + "10": "194.37", + "11": "97.185", + "12": "2", + "13": "97.185", + "index": 472 + }, + { + "0": "2DC3FDC7-C677-4479-A4C4-85C9A5E2F4FC", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:11:32", + "9": "1", + "10": "5558.889999999999", + "11": "146.2865789473684", + "12": "38", + "13": "146.2865789473684", + "index": 473 + }, + { + "0": "A3BEE7DE-D634-4C72-A05D-77A80D7D613B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:44:48", + "9": "1", + "10": "899.85", + "11": "59.99", + "12": "15", + "13": "59.99", + "index": 474 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "9": "1", + "10": "62.49", + "11": "62.49", + "12": "1", + "13": "62.49", + "index": 475 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "5": "62.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "62.49", + "11": "62.49", + "12": "1", + "13": "62.49", + "index": 476 + }, + { + "0": "169212AC-3DBA-4EA6-A5AE-031C407DC3AA", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:00:28", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "211.96", + "11": "52.99", + "12": "4", + "13": "52.99", + "index": 477 + }, + { + "0": "D1834580-E9C8-4D34-9433-0BA410FA0DF4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:30:31", + "9": "1", + "10": "239.88000000000002", + "11": "19.990000000000002", + "12": "12", + "13": "19.990000000000002", + "index": 478 + }, + { + "0": "D1884A1A-0865-47C3-A8DC-43DC991D661C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:41:02", + "9": "1", + "10": "719.88", + "11": "59.99", + "12": "12", + "13": "59.99", + "index": 479 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "9": "1", + "10": "75.58", + "11": "75.58", + "12": "1", + "13": "75.58", + "index": 480 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "75.58", + "11": "75.58", + "12": "1", + "13": "75.58", + "index": 481 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "9": "1", + "10": "160.47", + "11": "80.235", + "12": "2", + "13": "80.235", + "index": 482 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "5": "106.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "160.47", + "11": "80.235", + "12": "2", + "13": "80.235", + "index": 483 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "9": "1", + "10": "86.74", + "11": "86.74", + "12": "1", + "13": "86.74", + "index": 484 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "5": "86.74", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "86.74", + "11": "86.74", + "12": "1", + "13": "86.74", + "index": 485 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "9": "1", + "10": "457.58", + "11": "228.79", + "12": "2", + "13": "228.79", + "index": 486 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "5": "228.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "457.58", + "11": "228.79", + "12": "2", + "13": "228.79", + "index": 487 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 488 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "151.54", + "11": "151.54", + "12": "1", + "13": "151.54", + "index": 489 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 490 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 491 + }, + { + "0": "94BEE01F-8FA2-4685-9870-0172A53F3981", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:25:14", + "9": "1", + "10": "187740.0", + "11": "62580.0", + "12": "3", + "13": "62580.0", + "index": 492 + }, + { + "0": "6BA9D314-0ECC-425F-BCA8-FE3DC74581C8", + "1": "A914801012822158", + "2": "104.25", + "3": "6.0", + "4": "2023-02-01 11:41:23", + "9": "1", + "10": "104.25", + "11": "104.25", + "12": "1", + "13": "104.25", + "index": 493 + }, + { + "0": "3BDC3741-807B-447D-9A8D-9396CB1519BA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:16:10", + "9": "1", + "10": "183.25999999999985", + "11": "5.389999999999995", + "12": "32", + "13": "5.389999999999996", + "index": 494 + }, + { + "0": "A1979FD7-32C8-4BE2-AB5F-3FFDDD7C584A", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:24:17", + "9": "1", + "10": "863.84", + "11": "53.99", + "12": "16", + "13": "53.99", + "index": 495 + }, + { + "0": "D141370E-DD9D-4316-A2F9-A5D8244C61A2", + "1": "A1899946873128090", + "2": "119.98", + "3": "20.0", + "4": "2023-02-15 02:37:52", + "9": "1", + "10": "195.56", + "11": "97.78", + "12": "2", + "13": "97.78", + "index": 496 + }, + { + "0": "D2155FC9-8E47-46A6-B8F3-1395DECE7D82", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:35:07", + "9": "1", + "10": "592.8999999999988", + "11": "5.389999999999989", + "12": "47", + "13": "5.389999999999993", + "index": 497 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "9": "1", + "10": "153.29", + "11": "153.29", + "12": "1", + "13": "153.29", + "index": 498 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "153.29", + "11": "153.29", + "12": "1", + "13": "153.29", + "index": 499 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "9": "1", + "10": "150.49", + "11": "150.49", + "12": "1", + "13": "150.49", + "index": 500 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "150.49", + "11": "150.49", + "12": "1", + "13": "150.49", + "index": 501 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "9": "1", + "10": "127.18", + "11": "127.18", + "12": "1", + "13": "127.18", + "index": 502 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "5": "127.18", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "127.18", + "11": "127.18", + "12": "1", + "13": "127.18", + "index": 503 + }, + { + "0": "C2440D4D-3768-4108-BCAF-E43441537783", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:38:15", + "9": "1", + "10": "7208.560000000002", + "11": "147.11346938775515", + "12": "49", + "13": "147.11346938775515", + "index": 504 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "9": "1", + "10": "399.80000000000007", + "11": "19.990000000000002", + "12": "20", + "13": "19.990000000000002", + "index": 505 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "399.80000000000007", + "11": "19.990000000000002", + "12": "20", + "13": "19.990000000000002", + "index": 506 + }, + { + "0": "A66793DD-03E4-4E15-9CDB-79EC4733C3CA", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:39:54", + "9": "1", + "10": "104.78999999999998", + "11": "4.989999999999999", + "12": "21", + "13": "4.989999999999999", + "index": 507 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 508 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 509 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "9": "1", + "10": "176.91", + "11": "88.455", + "12": "2", + "13": "88.455", + "index": 510 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "5": "93.85", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "176.91", + "11": "88.455", + "12": "2", + "13": "88.455", + "index": 511 + }, + { + "0": "D43FE025-6D1B-4FE0-8E42-BC3E95A76823", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:52", + "9": "1", + "10": "334.1799999999995", + "11": "5.389999999999992", + "12": "60", + "13": "5.389999999999992", + "index": 512 + }, + { + "0": "9C4E2317-10BB-4BDE-AE2F-09EA29B0FD8A", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:14", + "9": "1", + "10": "113.19", + "11": "5.39", + "12": "21", + "13": "5.39", + "index": 513 + }, + { + "0": "979DF1CE-FE47-47FE-A8ED-ED1119F41065", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:03:58", + "9": "1", + "10": "317.94", + "11": "52.99", + "12": "6", + "13": "52.99", + "index": 514 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "9": "1", + "10": "458.98999999999995", + "11": "65.57", + "12": "7", + "13": "65.57", + "index": 515 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "458.98999999999995", + "11": "65.57", + "12": "7", + "13": "65.57", + "index": 516 + }, + { + "0": "105FE6E4-4E43-4042-937C-4E6748781A3D", + "1": "A914801012822158", + "2": "92.63", + "3": "0.0", + "4": "2023-02-03 05:37:23", + "9": "1", + "10": "289.08", + "11": "96.36", + "12": "3", + "13": "96.36", + "index": 517 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "9": "1", + "10": "66.05", + "11": "66.05", + "12": "1", + "13": "66.05", + "index": 518 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "5": "66.05", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "66.05", + "11": "66.05", + "12": "1", + "13": "66.05", + "index": 519 + }, + { + "0": "0D43D3F2-A352-4700-8FEC-8E02EF44A514", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:45", + "9": "1", + "10": "39.92000000000001", + "11": "4.990000000000001", + "12": "8", + "13": "4.990000000000001", + "index": 520 + }, + { + "0": "9606F304-48F8-47E9-A666-2BD97690632F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:47", + "9": "1", + "10": "409.6399999999993", + "11": "5.389999999999991", + "12": "74", + "13": "5.389999999999991", + "index": 521 + }, + { + "0": "566C00BC-EB37-41D8-9202-CCAC36616EB0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:43:37", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "5.39", + "11": "5.39", + "12": "1", + "13": "5.39", + "index": 522 + }, + { + "0": "66709ABD-6D12-456B-82D6-CBD25CFBE285", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:39:19", + "9": "1", + "10": "64.87000000000002", + "11": "4.990000000000001", + "12": "13", + "13": "4.990000000000001", + "index": 523 + }, + { + "0": "9E151E5A-C4BE-4AE6-A0F2-62320FD3FD14", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:49:39", + "9": "1", + "10": "9.98", + "11": "4.99", + "12": "2", + "13": "4.99", + "index": 524 + }, + { + "0": "9F442404-8F9E-45E0-8A10-D5B4C0B3A36A", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:47:03", + "9": "1", + "10": "79380.0", + "11": "79380.0", + "12": "1", + "13": "79380.0", + "index": 525 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "9": "1", + "10": "150.31", + "11": "150.31", + "12": "1", + "13": "150.31", + "index": 526 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "150.31", + "11": "150.31", + "12": "1", + "13": "150.31", + "index": 527 + }, + { + "0": "A75939D1-EE17-4E78-8478-6937CD08D5E9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:52:01", + "9": "1", + "10": "759.85", + "11": "126.64166666666667", + "12": "6", + "13": "126.64166666666667", + "index": 528 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "9": "1", + "10": "169.0", + "11": "169.0", + "12": "1", + "13": "169.0", + "index": 529 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "5": "176.66415", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "169.0", + "11": "169.0", + "12": "1", + "13": "169.0", + "index": 530 + }, + { + "0": "4A7523C3-17EE-4AB6-92D9-6535A3A41331", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:22:20", + "9": "1", + "10": "179.91", + "11": "19.99", + "12": "9", + "13": "19.99", + "index": 531 + }, + { + "0": "DDBCD8B8-C45B-45BB-8373-E184F6776E09", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:01:13", + "9": "1", + "10": "4509.099999999998", + "11": "145.45483870967735", + "12": "31", + "13": "145.45483870967735", + "index": 532 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "9": "1", + "10": "149.99", + "11": "149.99", + "12": "1", + "13": "149.99", + "index": 533 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "5": "156.792046", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.99", + "11": "149.99", + "12": "1", + "13": "149.99", + "index": 534 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "9": "1", + "10": "27.0", + "11": "5.4", + "12": "5", + "13": "5.4", + "index": 535 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "27.0", + "11": "5.4", + "12": "5", + "13": "5.4", + "index": 536 + }, + { + "0": "11FAFE8A-E9F5-4FB4-BC04-4C96AE6E852F", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:16:26", + "9": "1", + "10": "593.89", + "11": "53.99", + "12": "11", + "13": "53.99", + "index": 537 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "9": "1", + "10": "64.19", + "11": "64.19", + "12": "1", + "13": "64.19", + "index": 538 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "5": "64.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "64.19", + "11": "64.19", + "12": "1", + "13": "64.19", + "index": 539 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "9": "1", + "10": "517.439999999999", + "11": "5.38999999999999", + "12": "94", + "13": "5.38999999999999", + "index": 540 + }, + { + "0": "460FA98A-658B-4543-BBC0-EFBFCD7436FD", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:07", + "9": "1", + "10": "140.13999999999996", + "11": "5.389999999999999", + "12": "24", + "13": "5.39", + "index": 541 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "517.439999999999", + "11": "5.38999999999999", + "12": "94", + "13": "5.38999999999999", + "index": 542 + }, + { + "0": "7CD9A9C3-3CE1-49B9-8299-039B7955F0F4", + "1": "A985156290472668", + "2": "5.34", + "3": "17.0", + "4": "2023-02-27 22:55:15", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "26.7", + "11": "5.34", + "12": "5", + "13": "5.34", + "index": 543 + }, + { + "0": "FE374A34-0463-4D17-926A-7F697581AA35", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:24:44", + "9": "1", + "10": "15.120000000000001", + "11": "5.04", + "12": "3", + "13": "5.04", + "index": 544 + }, + { + "0": "D2CE31CE-7D5A-4E80-8D3E-F2E184DFAC98", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:27:17", + "9": "1", + "10": "107.52", + "11": "107.52", + "12": "1", + "13": "107.52", + "index": 545 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "9": "1", + "10": "149.44", + "11": "149.44", + "12": "1", + "13": "149.44", + "index": 546 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.44", + "11": "149.44", + "12": "1", + "13": "149.44", + "index": 547 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "9": "1", + "10": "279.98", + "11": "279.98", + "12": "1", + "13": "279.98", + "index": 548 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "279.98", + "11": "279.98", + "12": "1", + "13": "279.98", + "index": 549 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 550 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "5": "79.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 551 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "9": "1", + "10": "973.17", + "11": "973.17", + "12": "1", + "13": "973.17", + "index": 552 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "5": "973.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "973.17", + "11": "973.17", + "12": "1", + "13": "973.17", + "index": 553 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "9": "1", + "10": "463.53999999999917", + "11": "5.38999999999999", + "12": "84", + "13": "5.389999999999991", + "index": 554 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "463.53999999999917", + "11": "5.38999999999999", + "12": "84", + "13": "5.389999999999991", + "index": 555 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 556 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 557 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "9": "1", + "10": "562.74", + "11": "281.37", + "12": "2", + "13": "281.37", + "index": 558 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "562.74", + "11": "281.37", + "12": "2", + "13": "281.37", + "index": 559 + }, + { + "0": "B375BB8C-242A-4DC6-8FC3-F35EA5ADDADD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:21:25", + "9": "1", + "10": "179.91", + "11": "19.99", + "12": "9", + "13": "19.99", + "index": 560 + }, + { + "0": "F1FE235C-84E4-4770-BA47-2F70994718C1", + "1": "A914801011218316", + "2": "330.86", + "3": "17.0", + "4": "2023-02-12 23:03:05", + "9": "1", + "10": "330.86", + "11": "330.86", + "12": "1", + "13": "330.86", + "index": 561 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "9": "1", + "10": "116.86", + "11": "116.86", + "12": "1", + "13": "116.86", + "index": 562 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "116.86", + "11": "116.86", + "12": "1", + "13": "116.86", + "index": 563 + }, + { + "0": "5C9ABE6A-E977-4767-BCC8-A9A0952DB43A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:19:49", + "9": "1", + "10": "565.9499999999989", + "11": "5.38999999999999", + "12": "42", + "13": "5.3899999999999935", + "index": 564 + }, + { + "0": "42FC2159-6C83-4CBE-A323-DE9E0546A311", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:34:38", + "9": "1", + "10": "102.41", + "11": "5.39", + "12": "19", + "13": "5.39", + "index": 565 + }, + { + "0": "5EE5C089-EEC1-40F9-B997-D8EA4BDA79C1", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:19:40", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "26.95", + "11": "5.39", + "12": "5", + "13": "5.39", + "index": 566 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 567 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 568 + }, + { + "0": "441AEEE6-AAA6-40CB-9173-FBEF1C355ACC", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:46:27", + "9": "1", + "10": "114.76999999999997", + "11": "4.989999999999998", + "12": "23", + "13": "4.989999999999998", + "index": 569 + }, + { + "0": "36AD5A93-8DB0-4134-93EA-26D0A7EE8C3B", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:41:19", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 570 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "9": "1", + "10": "569.97", + "11": "569.97", + "12": "1", + "13": "569.97", + "index": 571 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "569.97", + "11": "569.97", + "12": "1", + "13": "569.97", + "index": 572 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "9": "1", + "10": "105.98", + "11": "105.98", + "12": "1", + "13": "105.98", + "index": 573 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "5": "105.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "105.98", + "11": "105.98", + "12": "1", + "13": "105.98", + "index": 574 + }, + { + "0": "E9AE2FFC-1BA4-45CC-858C-DCE5E3BA51B8", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:51:45", + "9": "1", + "10": "108.38", + "11": "108.38", + "12": "1", + "13": "108.38", + "index": 575 + }, + { + "0": "F3606B8D-3008-4781-AC9C-BA159F1BF3B5", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:24:09", + "9": "1", + "10": "199.9", + "11": "19.990000000000002", + "12": "10", + "13": "19.990000000000002", + "index": 576 + }, + { + "0": "1353C004-23CE-4887-8611-0986140B9411", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:22:26", + "9": "1", + "10": "6308.740000000001", + "11": "146.71488372093026", + "12": "43", + "13": "146.71488372093026", + "index": 577 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "9": "1", + "10": "538.0", + "11": "538.0", + "12": "1", + "13": "538.0", + "index": 578 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "538.0", + "11": "538.0", + "12": "1", + "13": "538.0", + "index": 579 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "9": "1", + "10": "4659.069999999998", + "11": "145.59593749999993", + "12": "32", + "13": "145.59593749999993", + "index": 580 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "4659.069999999998", + "11": "145.59593749999993", + "12": "32", + "13": "145.59593749999993", + "index": 581 + }, + { + "0": "4A4AF956-41C3-4723-8BAD-527243728FE8", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:54", + "9": "1", + "10": "97.02", + "11": "5.39", + "12": "18", + "13": "5.39", + "index": 582 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "9": "1", + "10": "119.75", + "11": "119.75", + "12": "1", + "13": "119.75", + "index": 583 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.75", + "11": "119.75", + "12": "1", + "13": "119.75", + "index": 584 + }, + { + "0": "98D7E9CF-D308-4B97-BF45-00263A93B702", + "1": "A914801004943538", + "2": "59.99", + "4": "2023-01-20 02:02:01", + "9": "1", + "10": "91.93", + "11": "45.965", + "12": "2", + "13": "45.965", + "index": 585 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 586 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 587 + }, + { + "0": "1DA8653D-7E02-48A4-AECA-CF30E3784FD3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:40", + "9": "1", + "10": "431.19999999999925", + "11": "5.389999999999991", + "12": "78", + "13": "5.389999999999991", + "index": 588 + }, + { + "0": "667490FD-D4B7-4039-A69B-C4E70A9F5DE3", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:23:04", + "9": "1", + "10": "809.85", + "11": "53.99", + "12": "15", + "13": "53.99", + "index": 589 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "9": "1", + "10": "2709.459999999999", + "11": "142.6031578947368", + "12": "19", + "13": "142.6031578947368", + "index": 590 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "2709.459999999999", + "11": "142.6031578947368", + "12": "19", + "13": "142.6031578947368", + "index": 591 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "9": "1", + "10": "149.99", + "11": "149.99", + "12": "1", + "13": "149.99", + "index": 592 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "5": "149.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.99", + "11": "149.99", + "12": "1", + "13": "149.99", + "index": 593 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "9": "1", + "10": "444.38", + "11": "222.19", + "12": "2", + "13": "222.19", + "index": 594 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "444.38", + "11": "222.19", + "12": "2", + "13": "222.19", + "index": 595 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "9": "1", + "10": "185.82", + "11": "92.91", + "12": "2", + "13": "92.91", + "index": 596 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "185.82", + "11": "92.91", + "12": "2", + "13": "92.91", + "index": 597 + }, + { + "0": "6083FE06-FDAB-4725-8CB2-DDB0B978E826", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:58:56", + "9": "1", + "10": "121.18", + "11": "60.59", + "12": "2", + "13": "60.59", + "index": 598 + }, + { + "0": "AB06E897-E5CB-408B-957A-9E77B9EBD71E", + "1": "A914801013775218", + "2": "93.62", + "3": "9.0", + "4": "2023-02-02 14:49:48", + "9": "1", + "10": "93.62", + "11": "93.62", + "12": "1", + "13": "93.62", + "index": 599 + }, + { + "0": "23FB57DD-40E6-49D4-8F47-29EC2357E548", + "1": "A564049508937862", + "2": "0.0", + "4": "2023-03-06 19:52:07", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "10": "482.68", + "11": "241.34", + "12": "2", + "13": "241.34", + "index": 600 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "9": "1", + "10": "80.92", + "11": "80.92", + "12": "1", + "13": "80.92", + "index": 601 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "5": "80.92", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "80.92", + "11": "80.92", + "12": "1", + "13": "80.92", + "index": 602 + }, + { + "0": "5E74AE55-CFA6-4337-9B6B-CA9933D5A6D8", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:06:09", + "9": "1", + "10": "29.940000000000005", + "11": "4.990000000000001", + "12": "6", + "13": "4.990000000000001", + "index": 603 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "9": "1", + "10": "99.0", + "11": "99.0", + "12": "1", + "13": "99.0", + "index": 604 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "5": "103.48965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "99.0", + "11": "99.0", + "12": "1", + "13": "99.0", + "index": 605 + }, + { + "0": "0F4F57CC-5436-4377-9B91-B6C7D0CC67E8", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:35:53", + "9": "1", + "10": "779.98", + "11": "389.99", + "12": "2", + "13": "389.99", + "index": 606 + }, + { + "0": "9D92C6BC-E560-4C32-A034-1E1F0814E46E", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:42:58", + "9": "1", + "10": "790.02", + "11": "112.86", + "12": "7", + "13": "112.86", + "index": 607 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "9": "1", + "10": "5097.0", + "11": "5097.0", + "12": "1", + "13": "5097.0", + "index": 608 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "5": "656.95233", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "5097.0", + "11": "5097.0", + "12": "1", + "13": "5097.0", + "index": 609 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "9": "1", + "10": "423.99", + "11": "423.99", + "12": "1", + "13": "423.99", + "index": 610 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "5": "423.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "423.99", + "11": "423.99", + "12": "1", + "13": "423.99", + "index": 611 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "9": "1", + "10": "63.95", + "11": "63.95", + "12": "1", + "13": "63.95", + "index": 612 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "5": "63.95", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "63.95", + "11": "63.95", + "12": "1", + "13": "63.95", + "index": 613 + }, + { + "0": "57E282C4-3F49-485B-B5B8-CACAEEF05078", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:47:32", + "9": "1", + "10": "78750.0", + "11": "78750.0", + "12": "1", + "13": "78750.0", + "index": 614 + }, + { + "0": "F6FBBB59-BFD5-4736-B635-64301B04D71C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:42:53", + "9": "1", + "10": "7508.500000000003", + "11": "147.22549019607848", + "12": "51", + "13": "147.22549019607848", + "index": 615 + }, + { + "0": "4EC3DEEC-D21B-4515-A3DE-5CC895397F21", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:59:16", + "9": "1", + "10": "4359.129999999997", + "11": "145.30433333333323", + "12": "30", + "13": "145.30433333333323", + "index": 616 + }, + { + "0": "99E39E43-B8E7-48C8-8C6E-EE09902A63E0", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:36:07", + "9": "1", + "10": "299.85", + "11": "19.990000000000002", + "12": "15", + "13": "19.990000000000002", + "index": 617 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "9": "1", + "10": "21.71", + "11": "21.71", + "12": "1", + "13": "21.71", + "index": 618 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "5": "21.71", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "21.71", + "11": "21.71", + "12": "1", + "13": "21.71", + "index": 619 + }, + { + "0": "E4BE3429-CFC8-44D0-B48F-BCD7D875D0E9", + "1": "A1759222229520370", + "2": "599.0", + "3": "23.0", + "4": "2023-01-03 14:02:57", + "9": "1", + "10": "599.0", + "11": "599.0", + "12": "1", + "13": "599.0", + "index": 620 + }, + { + "0": "E261B8E8-F241-46F3-89AA-5CC0283C8040", + "1": "A985156999024771", + "2": "92.5", + "3": "2.0", + "4": "2023-02-01 10:37:54", + "9": "1", + "10": "92.5", + "11": "92.5", + "12": "1", + "13": "92.5", + "index": 621 + }, + { + "0": "13CC7673-A59D-45CF-8287-2B4E8EE05396", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:46:49", + "9": "1", + "10": "16.200000000000003", + "11": "5.400000000000001", + "12": "3", + "13": "5.400000000000001", + "index": 622 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "9": "1", + "10": "2199.0", + "11": "2199.0", + "12": "1", + "13": "2199.0", + "index": 623 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "5": "442.12214400000005", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "2199.0", + "11": "2199.0", + "12": "1", + "13": "2199.0", + "index": 624 + }, + { + "0": "10B457AE-179C-457B-90BA-1A0E6D8F5143", + "1": "A1055521388773990", + "2": "119.06", + "3": "20.0", + "4": "2023-01-15 02:43:22", + "9": "1", + "10": "119.06", + "11": "119.06", + "12": "1", + "13": "119.06", + "index": 625 + }, + { + "0": "8B065D0D-9FBB-4815-B341-DDA432223550", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:35:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "262.28", + "11": "65.57", + "12": "4", + "13": "65.57", + "index": 626 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "9": "1", + "10": "157500.0", + "11": "78750.0", + "12": "2", + "13": "78750.0", + "index": 627 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "157500.0", + "11": "78750.0", + "12": "2", + "13": "78750.0", + "index": 628 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "9": "1", + "10": "4209.159999999997", + "11": "145.14344827586197", + "12": "29", + "13": "145.14344827586197", + "index": 629 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "4209.159999999997", + "11": "145.14344827586197", + "12": "29", + "13": "145.14344827586197", + "index": 630 + }, + { + "0": "CFE1CF54-83D2-4396-88F9-7F0E7C2ED586", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:16", + "9": "1", + "10": "490.4899999999991", + "11": "5.38999999999999", + "12": "89", + "13": "5.38999999999999", + "index": 631 + }, + { + "0": "427FDE58-CA6D-4D48-B528-AD194856D115", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:02:10", + "9": "1", + "10": "19.96", + "11": "4.99", + "12": "4", + "13": "4.99", + "index": 632 + }, + { + "0": "A5343E7D-5553-4F25-B916-E18FE75CF2AC", + "1": "A1688853516414440", + "2": "125580.0", + "3": "0.0", + "4": "2023-03-10 15:51:52", + "5": "1385.1474", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "10": "284340.0", + "11": "94780.0", + "12": "3", + "13": "94780.0", + "index": 633 + }, + { + "0": "90BAD1BA-E6EE-4EA6-B27F-7162B22CDBFA", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:39:16", + "9": "1", + "10": "562.52", + "11": "112.50399999999999", + "12": "5", + "13": "112.50399999999999", + "index": 634 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "9": "1", + "10": "196.45", + "11": "98.225", + "12": "2", + "13": "98.225", + "index": 635 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "196.45", + "11": "98.225", + "12": "2", + "13": "98.225", + "index": 636 + }, + { + "0": "1504CCD5-386C-4201-8362-D235C13D93AC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:07:35", + "9": "1", + "10": "156.30999999999992", + "11": "5.389999999999997", + "12": "27", + "13": "5.389999999999998", + "index": 637 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "9": "1", + "10": "158760.0", + "11": "79380.0", + "12": "2", + "13": "79380.0", + "index": 638 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "158760.0", + "11": "79380.0", + "12": "2", + "13": "79380.0", + "index": 639 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 640 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 641 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "9": "1", + "10": "1148.6", + "11": "1148.6", + "12": "1", + "13": "1148.6", + "index": 642 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "5": "1143.856282", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "1148.6", + "11": "1148.6", + "12": "1", + "13": "1148.6", + "index": 643 + }, + { + "0": "CA5F63D9-CA1B-41E6-8C42-7F89EA103D1D", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:31:01", + "9": "1", + "10": "59.97", + "11": "19.99", + "12": "3", + "13": "19.99", + "index": 644 + }, + { + "0": "8454CEA5-B059-4E44-8ADE-100460ED0992", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:24", + "9": "1", + "10": "274.88999999999965", + "11": "5.3899999999999935", + "12": "49", + "13": "5.3899999999999935", + "index": 645 + }, + { + "0": "CEA84E44-9194-48A0-A5F7-5BFA43E671BF", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:44:44", + "9": "1", + "10": "5.4", + "11": "5.4", + "12": "1", + "13": "5.4", + "index": 646 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "9": "1", + "10": "51.24", + "11": "51.24", + "12": "1", + "13": "51.24", + "index": 647 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "5": "51.24", + "6": "false", + "7": "1.0", + "8": "3.0", + "9": "1", + "10": "51.24", + "11": "51.24", + "12": "1", + "13": "51.24", + "index": 648 + }, + { + "0": "4BCAC6B0-3937-47E3-9AB8-6519D09321B1", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:01:57", + "9": "1", + "10": "53.99", + "11": "53.99", + "12": "1", + "13": "53.99", + "index": 649 + }, + { + "0": "3F556D13-8CCB-400E-B9BD-582162BE610B", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:36:12", + "9": "1", + "10": "7058.590000000002", + "11": "147.05395833333338", + "12": "48", + "13": "147.05395833333338", + "index": 650 + }, + { + "0": "C09DE962-3605-4A0E-B82F-A09B2B618D1F", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:54:27", + "9": "1", + "10": "233.19", + "11": "233.19", + "12": "1", + "13": "233.19", + "index": 651 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "9": "1", + "10": "185.57", + "11": "92.785", + "12": "2", + "13": "92.785", + "index": 652 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "5": "93.07", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "185.57", + "11": "92.785", + "12": "2", + "13": "92.785", + "index": 653 + }, + { + "0": "70A54CA5-D32A-4DB1-8F56-B406D827A7B7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:08:34", + "9": "1", + "10": "161.6999999999999", + "11": "5.389999999999997", + "12": "28", + "13": "5.389999999999998", + "index": 654 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "9": "1", + "10": "14.97", + "11": "4.99", + "12": "3", + "13": "4.99", + "index": 655 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "14.97", + "11": "4.99", + "12": "3", + "13": "4.99", + "index": 656 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "9": "1", + "10": "135660.0", + "11": "67830.0", + "12": "2", + "13": "67830.0", + "index": 657 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "135660.0", + "11": "67830.0", + "12": "2", + "13": "67830.0", + "index": 658 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "9": "1", + "10": "74.89", + "11": "74.89", + "12": "1", + "13": "74.89", + "index": 659 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "74.89", + "11": "74.89", + "12": "1", + "13": "74.89", + "index": 660 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 661 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 662 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "9": "1", + "10": "468.92999999999915", + "11": "5.38999999999999", + "12": "85", + "13": "5.389999999999991", + "index": 663 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "468.92999999999915", + "11": "5.38999999999999", + "12": "85", + "13": "5.389999999999991", + "index": 664 + }, + { + "0": "56BAD8D6-088E-4AD9-99E4-2C23D10C32B0", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:48:24", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 665 + }, + { + "0": "CCA3EB41-5AB7-4C77-AFD0-BC552C95E019", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:30", + "9": "1", + "10": "549.779999999999", + "11": "5.38999999999999", + "12": "100", + "13": "5.38999999999999", + "index": 666 + }, + { + "0": "2D228D45-7E38-45CF-BD23-8D4F3445FFF8", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:52:56", + "9": "1", + "10": "105.98", + "11": "52.99", + "12": "2", + "13": "52.99", + "index": 667 + }, + { + "0": "3FBAFD91-D3AC-41CB-BC17-4CAAAC0C52EA", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:36:34", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 668 + }, + { + "0": "18C1A371-128D-4C3E-BFA3-AD8A96C5A26E", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:23:32", + "9": "1", + "10": "228.79", + "11": "228.79", + "12": "1", + "13": "228.79", + "index": 669 + }, + { + "0": "61841EEB-00BE-478C-8142-677F86A55BD1", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:26:54", + "9": "1", + "10": "6608.680000000001", + "11": "146.85955555555557", + "12": "45", + "13": "146.85955555555557", + "index": 670 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "9": "1", + "10": "116.86", + "11": "116.86", + "12": "1", + "13": "116.86", + "index": 671 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "116.86", + "11": "116.86", + "12": "1", + "13": "116.86", + "index": 672 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 673 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 674 + }, + { + "0": "7B14E6C6-F218-4C61-A29A-B3157D7A0E4A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:55", + "9": "1", + "10": "274.88999999999965", + "11": "5.3899999999999935", + "12": "49", + "13": "5.3899999999999935", + "index": 675 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "9": "1", + "10": "16.02", + "11": "5.34", + "12": "3", + "13": "5.34", + "index": 676 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "16.02", + "11": "5.34", + "12": "3", + "13": "5.34", + "index": 677 + }, + { + "0": "218C5731-A37A-4CBA-8D3B-EF20FF23DEAE", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:03", + "9": "1", + "10": "54.890000000000015", + "11": "4.990000000000001", + "12": "11", + "13": "4.990000000000001", + "index": 678 + }, + { + "0": "216991DF-33A6-4090-90AA-3E09DDF390E4", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:48:52", + "9": "1", + "10": "9.98", + "11": "4.99", + "12": "2", + "13": "4.99", + "index": 679 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "9": "1", + "10": "76.19", + "11": "76.19", + "12": "1", + "13": "76.19", + "index": 680 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "76.19", + "11": "76.19", + "12": "1", + "13": "76.19", + "index": 681 + }, + { + "0": "2C8A9E18-E28E-4555-B5F9-98F0D34FCEAE", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:48:28", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 682 + }, + { + "0": "E498A57D-E5CF-4883-932E-6B39D7CFF7A0", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:38:18", + "9": "1", + "10": "296.4499999999996", + "11": "5.389999999999993", + "12": "53", + "13": "5.389999999999993", + "index": 683 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "9": "1", + "10": "480.9", + "11": "240.45", + "12": "2", + "13": "240.45", + "index": 684 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "5": "240.45", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "480.9", + "11": "240.45", + "12": "2", + "13": "240.45", + "index": 685 + }, + { + "0": "92EA085E-FD70-425B-80EB-4513BFBA8AF1", + "1": "A985157038112964", + "2": "150.14", + "3": "22.0", + "4": "2023-03-26 03:25:46", + "9": "1", + "10": "300.28", + "11": "150.14", + "12": "2", + "13": "150.14", + "index": 686 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "9": "1", + "10": "7658.470000000003", + "11": "147.2782692307693", + "12": "52", + "13": "147.2782692307693", + "index": 687 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "7658.470000000003", + "11": "147.2782692307693", + "12": "52", + "13": "147.2782692307693", + "index": 688 + }, + { + "0": "8C337F6E-E17F-4CDA-833A-CBEF20C65CF9", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:04:05", + "9": "1", + "10": "24.950000000000003", + "11": "4.99", + "12": "5", + "13": "4.99", + "index": 689 + }, + { + "0": "8C99CEBB-0BCA-4D2C-BEB7-09A627F46CDF", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:45:27", + "9": "1", + "10": "30.24", + "11": "5.04", + "12": "6", + "13": "5.04", + "index": 690 + }, + { + "0": "C077446E-640F-4769-9527-5A727F34A4B4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:38:29", + "9": "1", + "10": "319.84000000000003", + "11": "19.990000000000002", + "12": "16", + "13": "19.990000000000002", + "index": 691 + }, + { + "0": "9BC1E2D0-E438-4343-B319-212B06186B71", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:01", + "9": "1", + "10": "64.67999999999999", + "11": "5.39", + "12": "12", + "13": "5.39", + "index": 692 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "9": "1", + "10": "222.19", + "11": "222.19", + "12": "1", + "13": "222.19", + "index": 693 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "222.19", + "11": "222.19", + "12": "1", + "13": "222.19", + "index": 694 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "9": "1", + "10": "86.17", + "11": "86.17", + "12": "1", + "13": "86.17", + "index": 695 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "5": "86.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "86.17", + "11": "86.17", + "12": "1", + "13": "86.17", + "index": 696 + }, + { + "0": "EC085107-C5DF-4814-8E31-374D3D8BD5AD", + "1": "A564049508937862", + "2": "482.68", + "3": "10.0", + "4": "2023-03-06 18:31:45", + "5": "482.68", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "10": "482.68", + "11": "482.68", + "12": "1", + "13": "482.68", + "index": 697 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "9": "1", + "10": "339.5699999999995", + "11": "5.389999999999992", + "12": "61", + "13": "5.389999999999992", + "index": 698 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "339.5699999999995", + "11": "5.389999999999992", + "12": "61", + "13": "5.389999999999992", + "index": 699 + }, + { + "0": "4B54A952-E219-4AD1-8DB2-CAD464FCC43A", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:46:44", + "9": "1", + "10": "309.94", + "11": "103.31333333333333", + "12": "3", + "13": "103.31333333333333", + "index": 700 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "9": "1", + "10": "237.1599999999997", + "11": "5.3899999999999935", + "12": "42", + "13": "5.3899999999999935", + "index": 701 + }, + { + "0": "D74EFAAF-1FCC-4F41-AB01-317001E86EF1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 19:42:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "32.339999999999996", + "11": "5.39", + "12": "6", + "13": "5.39", + "index": 702 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "237.1599999999997", + "11": "5.3899999999999935", + "12": "42", + "13": "5.3899999999999935", + "index": 703 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "9": "1", + "10": "10.68", + "11": "5.34", + "12": "2", + "13": "5.34", + "index": 704 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "10.68", + "11": "5.34", + "12": "2", + "13": "5.34", + "index": 705 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "9": "1", + "10": "219.98", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 706 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.98", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 707 + }, + { + "0": "241DBB1D-3092-4FCE-A4A5-00219ECD6C99", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:35:42", + "9": "1", + "10": "278.88", + "11": "278.88", + "12": "1", + "13": "278.88", + "index": 708 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "9": "1", + "10": "54.26", + "11": "54.26", + "12": "1", + "13": "54.26", + "index": 709 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "5": "54.26", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "54.26", + "11": "54.26", + "12": "1", + "13": "54.26", + "index": 710 + }, + { + "0": "C7D4CBEF-2E68-41A2-B83A-D064795E296E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:16:55", + "9": "1", + "10": "5858.83", + "11": "146.47075", + "12": "40", + "13": "146.47075", + "index": 711 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "9": "1", + "10": "106.24", + "11": "106.24", + "12": "1", + "13": "106.24", + "index": 712 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "5": "106.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "106.24", + "11": "106.24", + "12": "1", + "13": "106.24", + "index": 713 + }, + { + "0": "2104E85A-B76B-419E-8204-3EAB76C7D122", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:11:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "16.169999999999998", + "11": "5.39", + "12": "3", + "13": "5.39", + "index": 714 + }, + { + "0": "FFCA8791-18C3-4C81-9D89-1250936E41E1", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:04:04", + "9": "1", + "10": "295.66", + "11": "147.83", + "12": "2", + "13": "147.83", + "index": 715 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 716 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "109.99", + "11": "109.99", + "12": "1", + "13": "109.99", + "index": 717 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "9": "1", + "10": "443.02000000000004", + "11": "110.75500000000001", + "12": "4", + "13": "110.75500000000001", + "index": 718 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "5": "127.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "443.02000000000004", + "11": "110.75500000000001", + "12": "4", + "13": "110.75500000000001", + "index": 719 + }, + { + "0": "A23C51AD-50BC-4719-B489-A29643BB3C74", + "1": "A1829582519835540", + "2": "59.99", + "3": "4.0", + "4": "2023-02-17 11:20:25", + "9": "1", + "10": "187.17000000000002", + "11": "62.39000000000001", + "12": "3", + "13": "62.39000000000001", + "index": 720 + }, + { + "0": "DE94FF49-79D4-417C-87B2-6682EC4AA382", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:38:47", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "458.98999999999995", + "11": "65.57", + "12": "7", + "13": "65.57", + "index": 721 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "9": "1", + "10": "143.04", + "11": "71.52", + "12": "2", + "13": "71.52", + "index": 722 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "5": "127.19", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "143.04", + "11": "71.52", + "12": "2", + "13": "71.52", + "index": 723 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 724 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "238.14", + "11": "238.14", + "12": "1", + "13": "238.14", + "index": 725 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "9": "1", + "10": "53.36", + "11": "53.36", + "12": "1", + "13": "53.36", + "index": 726 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "5": "53.36", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "53.36", + "11": "53.36", + "12": "1", + "13": "53.36", + "index": 727 + }, + { + "0": "0EB011D9-CAF2-4A02-8ACF-03895BE44128", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:53:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "10.78", + "11": "5.39", + "12": "2", + "13": "5.39", + "index": 728 + }, + { + "0": "D3507A5B-38A9-40F9-B992-DB1547B281C9", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:45:45", + "9": "1", + "10": "78750.0", + "11": "78750.0", + "12": "1", + "13": "78750.0", + "index": 729 + }, + { + "0": "E617D42C-798C-455C-8372-BC06259DE735", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:11:03", + "9": "1", + "10": "377.93", + "11": "53.99", + "12": "7", + "13": "53.99", + "index": 730 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "9": "1", + "10": "199.98", + "11": "99.99", + "12": "2", + "13": "99.99", + "index": 731 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "5": "157.474251", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "199.98", + "11": "99.99", + "12": "2", + "13": "99.99", + "index": 732 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 733 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.0", + "11": "239.0", + "12": "1", + "13": "239.0", + "index": 734 + }, + { + "0": "6645E186-2EE1-4F51-883A-7C4333C753C3", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 22:08:38", + "9": "1", + "10": "419.97", + "11": "139.99", + "12": "3", + "13": "139.99", + "index": 735 + }, + { + "0": "14B43B88-2D00-4D03-BDDA-3484C0D86769", + "1": "A1688853524321290", + "2": "24.99", + "3": "19.0", + "4": "2023-01-05 00:26:00", + "9": "1", + "10": "24.99", + "11": "24.99", + "12": "1", + "13": "24.99", + "index": 736 + }, + { + "0": "2E0F3E5F-83E2-4414-8D46-00367E4279AD", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:41:39", + "9": "1", + "10": "636.0199999999987", + "11": "5.389999999999989", + "12": "55", + "13": "5.389999999999993", + "index": 737 + }, + { + "0": "547D4C95-528D-46FC-A5A5-FA307B44A329", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:16:20", + "9": "1", + "10": "215.59999999999977", + "11": "5.389999999999994", + "12": "38", + "13": "5.389999999999994", + "index": 738 + }, + { + "0": "AED3F5DA-87AB-45C8-A0FF-426E353FB102", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:31:04", + "9": "1", + "10": "1079.8", + "11": "53.989999999999995", + "12": "20", + "13": "53.989999999999995", + "index": 739 + }, + { + "0": "AFC2F084-490B-4B4F-AF6A-05B999BC0C81", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:45:40", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "476.28", + "11": "238.14", + "12": "2", + "13": "238.14", + "index": 740 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "9": "1", + "10": "431.19999999999925", + "11": "5.389999999999991", + "12": "78", + "13": "5.389999999999991", + "index": 741 + }, + { + "0": "E8E24E34-5D81-4891-BACF-7CD208CD56D4", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:09:15", + "9": "1", + "10": "161.6999999999999", + "11": "5.389999999999997", + "12": "28", + "13": "5.389999999999998", + "index": 742 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "431.19999999999925", + "11": "5.389999999999991", + "12": "78", + "13": "5.389999999999991", + "index": 743 + }, + { + "0": "D247B57A-BE03-44A2-ABCB-E73EA6FCD843", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:29:52", + "9": "1", + "10": "2859.429999999999", + "11": "142.97149999999993", + "12": "20", + "13": "142.97149999999993", + "index": 744 + }, + { + "0": "6D96EB12-FD10-4D59-8262-C477E3B4A7FF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:18:40", + "9": "1", + "10": "6008.8", + "11": "146.55609756097562", + "12": "41", + "13": "146.55609756097562", + "index": 745 + }, + { + "0": "442116BE-E400-48F2-80E8-C15B1DECFB1E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:51:35", + "9": "1", + "10": "3759.2499999999977", + "11": "144.58653846153837", + "12": "26", + "13": "144.58653846153837", + "index": 746 + }, + { + "0": "4AD79610-DF94-40EA-AA57-0D0C4C107950", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:19", + "9": "1", + "10": "382.6899999999994", + "11": "5.389999999999991", + "12": "69", + "13": "5.389999999999992", + "index": 747 + }, + { + "0": "D8EFBBA0-BEF9-4BEA-A6F0-4A5CBE4C1287", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:09:43", + "9": "1", + "10": "5408.919999999999", + "11": "146.187027027027", + "12": "37", + "13": "146.187027027027", + "index": 748 + }, + { + "0": "770A0525-2D27-4173-B6BF-A5EA905162DC", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:47:43", + "9": "1", + "10": "16.200000000000003", + "11": "5.400000000000001", + "12": "3", + "13": "5.400000000000001", + "index": 749 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "9": "1", + "10": "107.99", + "11": "107.99", + "12": "1", + "13": "107.99", + "index": 750 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "5": "107.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "107.99", + "11": "107.99", + "12": "1", + "13": "107.99", + "index": 751 + }, + { + "0": "4186FC50-1BBE-4188-94FD-5659E850B7A3", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:45:29", + "9": "1", + "10": "3459.309999999998", + "11": "144.1379166666666", + "12": "24", + "13": "144.1379166666666", + "index": 752 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "9": "1", + "10": "335.02", + "11": "111.67333333333333", + "12": "3", + "13": "111.67333333333333", + "index": 753 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "5": "107.52", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "335.02", + "11": "111.67333333333333", + "12": "3", + "13": "111.67333333333333", + "index": 754 + }, + { + "0": "41F4234C-1659-48C5-A9D1-4C2324A0891B", + "1": "A1899946895455190", + "2": "19.99", + "3": "11.0", + "4": "2023-01-13 16:52:56", + "9": "1", + "10": "19.99", + "11": "19.99", + "12": "1", + "13": "19.99", + "index": 755 + }, + { + "0": "6A2D4479-6262-4C32-95B5-AC5BE0205E24", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:47:34", + "9": "1", + "10": "99.94999999999999", + "11": "19.99", + "12": "5", + "13": "19.99", + "index": 756 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "9": "1", + "10": "21.6", + "11": "21.6", + "12": "1", + "13": "21.6", + "index": 757 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "5": "21.6", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "21.6", + "11": "21.6", + "12": "1", + "13": "21.6", + "index": 758 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 759 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 760 + }, + { + "0": "CDD70229-CFCE-4192-829D-980CC5F0AD96", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:30:20", + "9": "1", + "10": "571.3399999999989", + "11": "5.38999999999999", + "12": "43", + "13": "5.3899999999999935", + "index": 761 + }, + { + "0": "209685D0-27D7-42CE-A3A2-24F643DD387F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:17", + "9": "1", + "10": "415.0299999999993", + "11": "5.389999999999991", + "12": "75", + "13": "5.389999999999991", + "index": 762 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "9": "1", + "10": "226.95", + "11": "226.95", + "12": "1", + "13": "226.95", + "index": 763 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "5": "226.95", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "226.95", + "11": "226.95", + "12": "1", + "13": "226.95", + "index": 764 + }, + { + "0": "5F5F30FC-7EA0-41CE-B5A4-FA459FDDBE38", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:09:49", + "9": "1", + "10": "323.94", + "11": "53.99", + "12": "6", + "13": "53.99", + "index": 765 + }, + { + "0": "552F9E0D-5395-4995-9047-D71CD17F48CB", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:19:58", + "9": "1", + "10": "40.32", + "11": "5.04", + "12": "8", + "13": "5.04", + "index": 766 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "9": "1", + "10": "147.83", + "11": "147.83", + "12": "1", + "13": "147.83", + "index": 767 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "5": "147.83", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "147.83", + "11": "147.83", + "12": "1", + "13": "147.83", + "index": 768 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "9": "1", + "10": "279.98", + "11": "279.98", + "12": "1", + "13": "279.98", + "index": 769 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "279.98", + "11": "279.98", + "12": "1", + "13": "279.98", + "index": 770 + }, + { + "0": "298F7C38-80B2-4CC3-8D84-29A2B5B7797C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:48:42", + "9": "1", + "10": "7808.440000000003", + "11": "147.32905660377364", + "12": "53", + "13": "147.32905660377364", + "index": 771 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "9": "1", + "10": "134.81", + "11": "134.81", + "12": "1", + "13": "134.81", + "index": 772 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "5": "134.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "134.81", + "11": "134.81", + "12": "1", + "13": "134.81", + "index": 773 + }, + { + "0": "FEE49FF0-87EB-402B-8EBB-8F9F4C9CB225", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:33:55", + "9": "1", + "10": "1187.78", + "11": "53.99", + "12": "22", + "13": "53.99", + "index": 774 + }, + { + "0": "4FD412FF-3716-4007-8C81-80FDA381E04A", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:37:03", + "9": "1", + "10": "106.22", + "11": "53.11", + "12": "2", + "13": "53.11", + "index": 775 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "9": "1", + "10": "361.1299999999994", + "11": "5.389999999999992", + "12": "65", + "13": "5.389999999999992", + "index": 776 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "361.1299999999994", + "11": "5.389999999999992", + "12": "65", + "13": "5.389999999999992", + "index": 777 + }, + { + "0": "903D435A-A4E4-489C-95E8-E97B11439B7C", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:19:19", + "9": "1", + "10": "444.38", + "11": "222.19", + "12": "2", + "13": "222.19", + "index": 778 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "9": "1", + "10": "1614.0", + "11": "538.0", + "12": "3", + "13": "538.0", + "index": 779 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "1614.0", + "11": "538.0", + "12": "3", + "13": "538.0", + "index": 780 + }, + { + "0": "AF64911E-A295-4337-BBAF-835F82DD77BA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:41:16", + "9": "1", + "10": "3309.3399999999983", + "11": "143.8843478260869", + "12": "23", + "13": "143.8843478260869", + "index": 781 + }, + { + "0": "422D5F57-6B6E-4803-AD06-9BF33330F102", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:48:55", + "9": "1", + "10": "459.90999999999997", + "11": "114.97749999999999", + "12": "4", + "13": "114.97749999999999", + "index": 782 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 783 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 784 + }, + { + "0": "01CE8E80-F8C6-4EA6-92A5-4D3077CE9449", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:06:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "37.73", + "11": "5.39", + "12": "7", + "13": "5.39", + "index": 785 + }, + { + "0": "7898FC86-CDBF-469B-B369-5E70B9BAC1F1", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:01:54", + "9": "1", + "10": "1509.7", + "11": "137.24545454545455", + "12": "11", + "13": "137.24545454545455", + "index": 786 + }, + { + "0": "3CFD786C-1D49-4D2D-94DA-C3A0E26ACB02", + "1": "A914801013785993", + "2": "93.94", + "3": "0.0", + "4": "2023-02-08 06:19:27", + "5": "93.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "10": "275.94", + "11": "91.98", + "12": "1", + "13": "93.94", + "index": 787 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "9": "1", + "10": "119.99", + "11": "119.99", + "12": "1", + "13": "119.99", + "index": 788 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "5": "119.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.99", + "11": "119.99", + "12": "1", + "13": "119.99", + "index": 789 + }, + { + "0": "C54EC40B-86FC-497A-A701-8FBDE5A2375D", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:08:37", + "9": "1", + "10": "598.2899999999988", + "11": "5.389999999999989", + "12": "48", + "13": "5.3899999999999935", + "index": 790 + }, + { + "0": "1D803FD7-051D-4D75-94DC-214FC9E55633", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:28:55", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "470.78", + "11": "235.39", + "12": "2", + "13": "235.39", + "index": 791 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "9": "1", + "10": "572.7", + "11": "286.35", + "12": "2", + "13": "286.35", + "index": 792 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "5": "285.167374", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "572.7", + "11": "286.35", + "12": "2", + "13": "286.35", + "index": 793 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "9": "1", + "10": "63.89", + "11": "63.89", + "12": "1", + "13": "63.89", + "index": 794 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "5": "63.89", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "63.89", + "11": "63.89", + "12": "1", + "13": "63.89", + "index": 795 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "9": "1", + "10": "439.7800000000001", + "11": "19.990000000000006", + "12": "22", + "13": "19.990000000000006", + "index": 796 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "439.7800000000001", + "11": "19.990000000000006", + "12": "22", + "13": "19.990000000000006", + "index": 797 + }, + { + "0": "0C064A95-7D41-4C84-A18E-816228CAB89E", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:56:13", + "9": "1", + "10": "479.02", + "11": "239.51", + "12": "2", + "13": "239.51", + "index": 798 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "9": "1", + "10": "26.54", + "11": "26.54", + "12": "1", + "13": "26.54", + "index": 799 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "5": "26.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "26.54", + "11": "26.54", + "12": "1", + "13": "26.54", + "index": 800 + }, + { + "0": "E9D36D5B-FDCD-440A-BC1A-C53A9110CF22", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:46:52", + "9": "1", + "10": "910.0", + "11": "113.75", + "12": "8", + "13": "113.75", + "index": 801 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "9": "1", + "10": "306.58", + "11": "153.29", + "12": "2", + "13": "153.29", + "index": 802 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "306.58", + "11": "153.29", + "12": "2", + "13": "153.29", + "index": 803 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "9": "1", + "10": "239.96", + "11": "59.99", + "12": "4", + "13": "59.99", + "index": 804 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "239.96", + "11": "59.99", + "12": "4", + "13": "59.99", + "index": 805 + }, + { + "0": "C1399C61-74D6-40B3-8289-AC99FAFF4988", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:36:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "327.84999999999997", + "11": "65.57", + "12": "5", + "13": "65.57", + "index": 806 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "9": "1", + "10": "99.98", + "11": "99.98", + "12": "1", + "13": "99.98", + "index": 807 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "5": "99.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "99.98", + "11": "99.98", + "12": "1", + "13": "99.98", + "index": 808 + }, + { + "0": "6B3337E4-83E7-49DA-97BA-D0DC2B44F42F", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:41:07", + "9": "1", + "10": "682.5", + "11": "113.75", + "12": "6", + "13": "113.75", + "index": 809 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "9": "1", + "10": "49.99", + "11": "49.99", + "12": "1", + "13": "49.99", + "index": 810 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "5": "49.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "49.99", + "11": "49.99", + "12": "1", + "13": "49.99", + "index": 811 + }, + { + "0": "B94780BA-6067-4DAD-AA2A-BACE10FA26EA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:55:42", + "9": "1", + "10": "447.3699999999992", + "11": "5.389999999999991", + "12": "81", + "13": "5.389999999999991", + "index": 812 + }, + { + "0": "897B514D-E758-4690-84B8-6549559C52EE", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:50:29", + "9": "1", + "10": "609.88", + "11": "121.976", + "12": "5", + "13": "121.976", + "index": 813 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "9": "1", + "10": "219.98", + "11": "109.99", + "12": "2", + "13": "109.99", + "index": 814 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.98", + "11": "109.99", + "12": "2", + "13": "109.99", + "index": 815 + }, + { + "0": "8D4F3115-A1D5-459A-A847-A4C3E43A74A7", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:39:35", + "9": "1", + "10": "659.89", + "11": "59.99", + "12": "11", + "13": "59.99", + "index": 816 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "9": "1", + "10": "50.49", + "11": "50.49", + "12": "1", + "13": "50.49", + "index": 817 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "5": "50.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "50.49", + "11": "50.49", + "12": "1", + "13": "50.49", + "index": 818 + }, + { + "0": "6A4D6552-8D68-49DA-8B16-D5094B3ED747", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:35:26", + "9": "1", + "10": "107.8", + "11": "5.39", + "12": "20", + "13": "5.39", + "index": 819 + }, + { + "0": "B352C087-14C9-4B8A-B239-0C4D861AF091", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:45:31", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "590.1299999999999", + "11": "65.57", + "12": "9", + "13": "65.57", + "index": 820 + }, + { + "0": "CA193A45-31F8-4EB5-A19D-BF5D2602277D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:40:11", + "9": "1", + "10": "7358.5300000000025", + "11": "147.17060000000004", + "12": "50", + "13": "147.17060000000004", + "index": 821 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 822 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "479.0", + "11": "479.0", + "12": "1", + "13": "479.0", + "index": 823 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "9": "1", + "10": "119.99", + "11": "119.99", + "12": "1", + "13": "119.99", + "index": 824 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "5": "161.722522", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.99", + "11": "119.99", + "12": "1", + "13": "119.99", + "index": 825 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 826 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "5": "346.462251", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 827 + }, + { + "0": "8B634588-BDD1-4B61-B2C0-00A24CD77D7B", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:07:01", + "9": "1", + "10": "557.76", + "11": "278.88", + "12": "2", + "13": "278.88", + "index": 828 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "9": "1", + "10": "522.829999999999", + "11": "5.38999999999999", + "12": "95", + "13": "5.38999999999999", + "index": 829 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "522.829999999999", + "11": "5.38999999999999", + "12": "95", + "13": "5.38999999999999", + "index": 830 + }, + { + "0": "7E42BCAB-5590-41AD-A18E-8964C2D9CDAA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:38", + "9": "1", + "10": "452.7599999999992", + "11": "5.389999999999991", + "12": "82", + "13": "5.389999999999991", + "index": 831 + }, + { + "0": "A161FE84-6920-43CD-9AFE-7D1A04800640", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:20:14", + "9": "1", + "10": "755.86", + "11": "53.99", + "12": "14", + "13": "53.99", + "index": 832 + }, + { + "0": "9B6410A2-B896-4E0E-9929-B3D3FF23D091", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:43:38", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "300.98", + "11": "150.49", + "12": "2", + "13": "150.49", + "index": 833 + }, + { + "0": "5CAB8F98-F87D-4FB5-8647-F83EF559A9E7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:22", + "9": "1", + "10": "409.6399999999993", + "11": "5.389999999999991", + "12": "74", + "13": "5.389999999999991", + "index": 834 + }, + { + "0": "086FDEAF-BF57-4B51-93F4-169E3609D287", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:44", + "9": "1", + "10": "495.8799999999991", + "11": "5.38999999999999", + "12": "90", + "13": "5.38999999999999", + "index": 835 + }, + { + "0": "3F889B35-49FC-47BC-9E5E-2DF06FA12290", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:01", + "9": "1", + "10": "587.5099999999989", + "11": "5.38999999999999", + "12": "46", + "13": "5.3899999999999935", + "index": 836 + }, + { + "0": "0FBA8C42-194E-4E18-85DB-D1FA1EB7C05D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:41:53", + "9": "1", + "10": "109.77999999999997", + "11": "4.989999999999998", + "12": "22", + "13": "4.989999999999998", + "index": 837 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "9": "1", + "10": "3298.0", + "11": "3298.0", + "12": "1", + "13": "3298.0", + "index": 838 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "5": "259.62185800000003", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "3298.0", + "11": "3298.0", + "12": "1", + "13": "3298.0", + "index": 839 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "9": "1", + "10": "155.68", + "11": "155.68", + "12": "1", + "13": "155.68", + "index": 840 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "5": "155.03704199999999", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "155.68", + "11": "155.68", + "12": "1", + "13": "155.68", + "index": 841 + }, + { + "0": "EAD34905-DE0B-4FC8-A4AE-C2248AF29A08", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:37:32", + "9": "1", + "10": "539.91", + "11": "59.989999999999995", + "12": "9", + "13": "59.989999999999995", + "index": 842 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 843 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 844 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "9": "1", + "10": "528.219999999999", + "11": "5.38999999999999", + "12": "96", + "13": "5.38999999999999", + "index": 845 + }, + { + "0": "C869ECF0-2A2F-4898-BC65-AD6422144BA5", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:17:22", + "9": "1", + "10": "231.76999999999973", + "11": "5.3899999999999935", + "12": "41", + "13": "5.389999999999994", + "index": 846 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "528.219999999999", + "11": "5.38999999999999", + "12": "96", + "13": "5.38999999999999", + "index": 847 + }, + { + "0": "237AD504-9222-4DAF-BBB9-5C86C4A0DF90", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:57:24", + "9": "1", + "10": "261.45", + "11": "261.45", + "12": "1", + "13": "261.45", + "index": 848 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "9": "1", + "10": "159.0", + "11": "159.0", + "12": "1", + "13": "159.0", + "index": 849 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "5": "159.0", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "159.0", + "11": "159.0", + "12": "1", + "13": "159.0", + "index": 850 + }, + { + "0": "7F6AEAAA-ED61-4163-8C5E-289FB74045B4", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:23", + "9": "1", + "10": "398.85999999999933", + "11": "5.389999999999991", + "12": "72", + "13": "5.389999999999991", + "index": 851 + }, + { + "0": "A76875A6-59E2-4D02-8FF1-48EADE6B83A7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:00:13", + "9": "1", + "10": "479.7099999999991", + "11": "5.38999999999999", + "12": "87", + "13": "5.38999999999999", + "index": 852 + }, + { + "0": "F7690559-B2FA-42E4-910F-DF65A0250586", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:29:47", + "9": "1", + "10": "179.97", + "11": "59.99", + "12": "3", + "13": "59.99", + "index": 853 + }, + { + "0": "D7BC1361-E730-4463-9DE7-2B9D92DB5A5B", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:13", + "9": "1", + "10": "39.92000000000001", + "11": "4.990000000000001", + "12": "8", + "13": "4.990000000000001", + "index": 854 + }, + { + "0": "EE72DD0F-F132-4E86-9CC5-9FB6386668A0", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:41:24", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "65.57", + "11": "65.57", + "12": "1", + "13": "65.57", + "index": 855 + }, + { + "0": "17B73DB4-D6C9-4F0D-A8CA-A1BD9334FABC", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:42:15", + "9": "1", + "10": "839.86", + "11": "59.99", + "12": "14", + "13": "59.99", + "index": 856 + }, + { + "0": "D797769A-8A65-47DF-8473-35A29AC81B24", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:15:33", + "9": "1", + "10": "215.59999999999977", + "11": "5.389999999999994", + "12": "38", + "13": "5.389999999999994", + "index": 857 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "9": "1", + "10": "589.0", + "11": "589.0", + "12": "1", + "13": "589.0", + "index": 858 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "5": "793.8542", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "589.0", + "11": "589.0", + "12": "1", + "13": "589.0", + "index": 859 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "9": "1", + "10": "291.9", + "11": "145.95", + "12": "2", + "13": "145.95", + "index": 860 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "5": "145.347227", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "291.9", + "11": "145.95", + "12": "2", + "13": "145.95", + "index": 861 + }, + { + "0": "72399945-3AC5-461E-BF85-228552DF71E1", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:35:42", + "9": "1", + "10": "239.96", + "11": "119.98", + "12": "2", + "13": "119.98", + "index": 862 + }, + { + "0": "C1040C0D-A701-4AD0-B4E3-1BC1F06AB4AA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:13:25", + "9": "1", + "10": "5708.86", + "11": "146.38102564102564", + "12": "39", + "13": "146.38102564102564", + "index": 863 + }, + { + "0": "7DDF174A-C6BF-4245-8148-650BBEC82DA8", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:36:35", + "9": "1", + "10": "539.91", + "11": "59.989999999999995", + "12": "9", + "13": "59.989999999999995", + "index": 864 + }, + { + "0": "1731D105-5F5C-4CEE-955B-AD9B4372603D", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:32:27", + "9": "1", + "10": "576.7299999999989", + "11": "5.38999999999999", + "12": "44", + "13": "5.3899999999999935", + "index": 865 + }, + { + "0": "C187B038-E19A-46AA-A9E0-5BF87BAEE2C1", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:38:51", + "9": "1", + "10": "64.87000000000002", + "11": "4.990000000000001", + "12": "13", + "13": "4.990000000000001", + "index": 866 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "9": "1", + "10": "157500.0", + "11": "78750.0", + "12": "2", + "13": "78750.0", + "index": 867 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "157500.0", + "11": "78750.0", + "12": "2", + "13": "78750.0", + "index": 868 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 869 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 870 + }, + { + "0": "14EF7AD5-A3AA-4E9E-B377-74A47CDC2785", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:58:58", + "9": "1", + "10": "1679.94", + "11": "839.97", + "12": "2", + "13": "839.97", + "index": 871 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "9": "1", + "10": "1059.79", + "11": "132.47375", + "12": "8", + "13": "132.47375", + "index": 872 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "1059.79", + "11": "132.47375", + "12": "8", + "13": "132.47375", + "index": 873 + }, + { + "0": "92C5B50A-E46E-404D-9EFB-7043D6DD7C68", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:32:00", + "9": "1", + "10": "239.96", + "11": "59.99", + "12": "4", + "13": "59.99", + "index": 874 + }, + { + "0": "FFF0CCE8-07E1-4100-9491-2853222482EF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:44:10", + "9": "1", + "10": "123.97", + "11": "5.39", + "12": "22", + "13": "5.39", + "index": 875 + }, + { + "0": "6DA73B9F-D74B-45A7-82F7-FD10B2840483", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:18", + "9": "1", + "10": "506.65999999999906", + "11": "5.38999999999999", + "12": "92", + "13": "5.38999999999999", + "index": 876 + }, + { + "0": "0DF72AD1-2DFD-404E-88A8-965334D9F227", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:38:07", + "9": "1", + "10": "630.6299999999987", + "11": "5.389999999999989", + "12": "54", + "13": "5.389999999999993", + "index": 877 + }, + { + "0": "9E41C0F4-5345-4439-B996-52841214F9FE", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:15", + "9": "1", + "10": "328.7899999999995", + "11": "5.389999999999992", + "12": "59", + "13": "5.389999999999993", + "index": 878 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "9": "1", + "10": "279.99", + "11": "279.99", + "12": "1", + "13": "279.99", + "index": 879 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "5": "279.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "279.99", + "11": "279.99", + "12": "1", + "13": "279.99", + "index": 880 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 881 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "157.07", + "11": "157.07", + "12": "1", + "13": "157.07", + "index": 882 + }, + { + "0": "1580B155-E0E0-40CB-841D-E2A5D2DB0E7E", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:57:02", + "9": "1", + "10": "129.35999999999999", + "11": "5.39", + "12": "22", + "13": "5.39", + "index": 883 + }, + { + "0": "00746053-49FB-4681-8AAA-10388C1D59E2", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:15:52", + "9": "1", + "10": "124.74999999999996", + "11": "4.989999999999998", + "12": "25", + "13": "4.989999999999998", + "index": 884 + }, + { + "0": "1AE19EA1-54DF-4E2A-889F-E47C3AFE65AF", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:11:13", + "9": "1", + "10": "1076.0", + "11": "538.0", + "12": "2", + "13": "538.0", + "index": 885 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "9": "1", + "10": "78750.0", + "11": "78750.0", + "12": "1", + "13": "78750.0", + "index": 886 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "78750.0", + "11": "78750.0", + "12": "1", + "13": "78750.0", + "index": 887 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 888 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 889 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "9": "1", + "10": "222.19", + "11": "222.19", + "12": "1", + "13": "222.19", + "index": 890 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "222.19", + "11": "222.19", + "12": "1", + "13": "222.19", + "index": 891 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "9": "1", + "10": "150.31", + "11": "150.31", + "12": "1", + "13": "150.31", + "index": 892 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "150.31", + "11": "150.31", + "12": "1", + "13": "150.31", + "index": 893 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "9": "1", + "10": "127.18", + "11": "63.59", + "12": "2", + "13": "63.59", + "index": 894 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "127.18", + "11": "63.59", + "12": "2", + "13": "63.59", + "index": 895 + }, + { + "0": "702CD93B-73B6-4F45-8FE8-7F83EC633AA0", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:12", + "9": "1", + "10": "99.79999999999998", + "11": "4.989999999999999", + "12": "20", + "13": "4.989999999999999", + "index": 896 + }, + { + "0": "6DCDA408-D527-4CC0-8ECD-BB1DD4C1B51B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:23:20", + "9": "1", + "10": "10.08", + "11": "5.04", + "12": "2", + "13": "5.04", + "index": 897 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "9": "1", + "10": "1307.65", + "11": "1307.65", + "12": "1", + "13": "1307.65", + "index": 898 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "5": "1307.65", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "1307.65", + "11": "1307.65", + "12": "1", + "13": "1307.65", + "index": 899 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 900 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 901 + }, + { + "0": "81D69AD5-E46F-46A4-8317-14C6F2908E0D", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:32:17", + "9": "1", + "10": "1133.79", + "11": "53.989999999999995", + "12": "21", + "13": "53.989999999999995", + "index": 902 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "9": "1", + "10": "8108.380000000004", + "11": "147.42509090909098", + "12": "55", + "13": "147.42509090909098", + "index": 903 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "8108.380000000004", + "11": "147.42509090909098", + "12": "55", + "13": "147.42509090909098", + "index": 904 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "9": "1", + "10": "1091.15", + "11": "1091.15", + "12": "1", + "13": "1091.15", + "index": 905 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "5": "1091.15", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "1091.15", + "11": "1091.15", + "12": "1", + "13": "1091.15", + "index": 906 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "9": "1", + "10": "619.8499999999988", + "11": "5.389999999999989", + "12": "52", + "13": "5.389999999999993", + "index": 907 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "619.8499999999988", + "11": "5.389999999999989", + "12": "52", + "13": "5.389999999999993", + "index": 908 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 909 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "59.99", + "11": "59.99", + "12": "1", + "13": "59.99", + "index": 910 + }, + { + "0": "D81F2077-E5A4-4DCC-85CB-5D37243F3386", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:53:36", + "9": "1", + "10": "425.80999999999926", + "11": "5.389999999999991", + "12": "77", + "13": "5.389999999999991", + "index": 911 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "9": "1", + "10": "149.93", + "11": "149.93", + "12": "1", + "13": "149.93", + "index": 912 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "5": "149.93", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "149.93", + "11": "149.93", + "12": "1", + "13": "149.93", + "index": 913 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 914 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "119.98", + "11": "59.99", + "12": "2", + "13": "59.99", + "index": 915 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "9": "1", + "10": "227.3", + "11": "113.65", + "12": "2", + "13": "113.65", + "index": 916 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "5": "108.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "227.3", + "11": "113.65", + "12": "2", + "13": "113.65", + "index": 917 + }, + { + "0": "DABB8679-0A5B-46D1-9421-D443A45907F8", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:48:21", + "9": "1", + "10": "99.94999999999999", + "11": "19.99", + "12": "5", + "13": "19.99", + "index": 918 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "9": "1", + "10": "258.68", + "11": "129.34", + "12": "2", + "13": "129.34", + "index": 919 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "5": "129.34", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "258.68", + "11": "129.34", + "12": "2", + "13": "129.34", + "index": 920 + }, + { + "0": "F0A25208-F9BB-401D-A840-36823FB1B0A8", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:34:16", + "9": "1", + "10": "625.2399999999988", + "11": "5.389999999999989", + "12": "53", + "13": "5.389999999999993", + "index": 921 + }, + { + "0": "051BDF69-D526-4951-A7E0-9A933A9899FF", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:16:57", + "9": "1", + "10": "614.4599999999988", + "11": "5.389999999999989", + "12": "51", + "13": "5.3899999999999935", + "index": 922 + }, + { + "0": "A53C943B-A88C-4EB6-9A34-C386E9E8879C", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:53", + "9": "1", + "10": "609.0699999999988", + "11": "5.389999999999989", + "12": "50", + "13": "5.3899999999999935", + "index": 923 + }, + { + "0": "FF63B43E-F5B7-4CFD-81FD-AFBFE1BDDFA0", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:51:59", + "9": "1", + "10": "144.70999999999998", + "11": "4.989999999999999", + "12": "29", + "13": "4.989999999999999", + "index": 924 + }, + { + "0": "4A729E60-7E0A-4080-88C8-A81656F18A24", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:49:26", + "9": "1", + "10": "239.51", + "11": "239.51", + "12": "1", + "13": "239.51", + "index": 925 + }, + { + "0": "C4F83897-54F9-4208-987E-DDE9D20F0B4B", + "1": "A1688853657869890", + "2": "52.99", + "3": "11.0", + "4": "2023-01-03 17:27:59", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "476.91", + "11": "52.99", + "12": "9", + "13": "52.99", + "index": 926 + }, + { + "0": "BD6E876C-4420-4359-B25A-35BE542F82C0", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:30:03", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "159.85", + "11": "159.85", + "12": "1", + "13": "159.85", + "index": 927 + }, + { + "0": "66F28A11-228E-4CF9-9872-0677EF57CCCD", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:50:09", + "9": "1", + "10": "100.98", + "11": "50.49", + "12": "2", + "13": "50.49", + "index": 928 + }, + { + "0": "F815E0BF-EDEA-40BF-9CA7-E529C895BA5E", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:24:44", + "9": "1", + "10": "233.72", + "11": "116.86", + "12": "2", + "13": "116.86", + "index": 929 + }, + { + "0": "0550F138-938B-4710-83ED-00EC64D186E3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:04:17", + "9": "1", + "10": "495.8799999999991", + "11": "5.38999999999999", + "12": "90", + "13": "5.38999999999999", + "index": 930 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "9": "1", + "10": "54.890000000000015", + "11": "4.990000000000001", + "12": "11", + "13": "4.990000000000001", + "index": 931 + }, + { + "0": "45775ADF-C0C1-4AB2-97A6-BEE6F012632F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:36:29", + "9": "1", + "10": "49.90000000000001", + "11": "4.990000000000001", + "12": "10", + "13": "4.990000000000001", + "index": 932 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "54.890000000000015", + "11": "4.990000000000001", + "12": "11", + "13": "4.990000000000001", + "index": 933 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 934 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 935 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "9": "1", + "10": "699.0", + "11": "699.0", + "12": "1", + "13": "699.0", + "index": 936 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "5": "112.30134", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "699.0", + "11": "699.0", + "12": "1", + "13": "699.0", + "index": 937 + }, + { + "0": "06CA7673-9504-44D4-A9B1-49EC29233AD5", + "1": "A844428040495230", + "2": "73.11", + "3": "13.0", + "4": "2023-01-19 18:43:29", + "9": "1", + "10": "148.69", + "11": "74.345", + "12": "2", + "13": "74.345", + "index": 938 + }, + { + "0": "077961F4-BD88-4A14-9607-D267E3882119", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:57:34", + "9": "1", + "10": "60.59", + "11": "60.59", + "12": "1", + "13": "60.59", + "index": 939 + }, + { + "0": "8D778823-BB51-4CA8-9CEC-84F4D48E035A", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:24:12", + "9": "1", + "10": "146160.0", + "11": "73080.0", + "12": "2", + "13": "73080.0", + "index": 940 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "9": "1", + "10": "455.0", + "11": "113.75", + "12": "4", + "13": "113.75", + "index": 941 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "455.0", + "11": "113.75", + "12": "4", + "13": "113.75", + "index": 942 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "9": "1", + "10": "62580.0", + "11": "62580.0", + "12": "1", + "13": "62580.0", + "index": 943 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "62580.0", + "11": "62580.0", + "12": "1", + "13": "62580.0", + "index": 944 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 945 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "148.74", + "11": "148.74", + "12": "1", + "13": "148.74", + "index": 946 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "9": "1", + "10": "680.89", + "11": "340.445", + "12": "2", + "13": "340.445", + "index": 947 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "5": "680.89", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "10": "680.89", + "11": "340.445", + "12": "2", + "13": "340.445", + "index": 948 + }, + { + "0": "3E6BEDBD-7B2A-40CF-87FC-AE161EA47713", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:57:49", + "9": "1", + "10": "79380.0", + "11": "79380.0", + "12": "1", + "13": "79380.0", + "index": 949 + }, + { + "0": "B3FFE8F1-6D4D-49FF-9DC6-97E3F78B18E1", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:49:50", + "9": "1", + "10": "129.34", + "11": "129.34", + "12": "1", + "13": "129.34", + "index": 950 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "9": "1", + "10": "233.74", + "11": "233.74", + "12": "1", + "13": "233.74", + "index": 951 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "5": "233.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "233.74", + "11": "233.74", + "12": "1", + "13": "233.74", + "index": 952 + }, + { + "0": "A25BC911-EAA9-47D1-B8D2-4086F6CC94CB", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:35:29", + "9": "1", + "10": "419.93", + "11": "59.99", + "12": "7", + "13": "59.99", + "index": 953 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "9": "1", + "10": "247.93999999999969", + "11": "5.3899999999999935", + "12": "44", + "13": "5.3899999999999935", + "index": 954 + }, + { + "0": "D1C8D053-633E-457E-AAE3-2CC1801EC80B", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:22:13", + "9": "1", + "10": "264.1099999999997", + "11": "5.3899999999999935", + "12": "47", + "13": "5.389999999999993", + "index": 955 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "247.93999999999969", + "11": "5.3899999999999935", + "12": "44", + "13": "5.3899999999999935", + "index": 956 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 957 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "79.99", + "11": "79.99", + "12": "1", + "13": "79.99", + "index": 958 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "9": "1", + "10": "16.02", + "11": "5.34", + "12": "3", + "13": "5.34", + "index": 959 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "16.02", + "11": "5.34", + "12": "3", + "13": "5.34", + "index": 960 + }, + { + "0": "9E012F96-E7AA-4046-8F24-0C85FBB36CF5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:07:57", + "9": "1", + "10": "1959.6100000000001", + "11": "139.97214285714287", + "12": "14", + "13": "139.97214285714287", + "index": 961 + }, + { + "0": "17DA4A53-7EDF-4FE4-A997-3C9AF9255294", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:04", + "9": "1", + "10": "312.61999999999955", + "11": "5.389999999999993", + "12": "56", + "13": "5.389999999999993", + "index": 962 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 963 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "219.99", + "11": "219.99", + "12": "1", + "13": "219.99", + "index": 964 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 965 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 966 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "9": "1", + "10": "1154.4", + "11": "1154.4", + "12": "1", + "13": "1154.4", + "index": 967 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "5": "1154.4", + "6": "false", + "7": "0.0", + "8": "3.0", + "9": "1", + "10": "1154.4", + "11": "1154.4", + "12": "1", + "13": "1154.4", + "index": 968 + }, + { + "0": "0A282803-01E1-4193-B72A-F135B850DCB5", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:32:12", + "9": "1", + "10": "86.24", + "11": "5.39", + "12": "16", + "13": "5.39", + "index": 969 + }, + { + "0": "25C5DCA0-AACA-4FF2-870E-7A08EC230EF6", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:51:23", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "21.6", + "11": "5.4", + "12": "4", + "13": "5.4", + "index": 970 + }, + { + "0": "34E50410-3939-4466-BCE5-6207661FAF5C", + "1": "A1899946865208980", + "2": "73080.0", + "3": "0.0", + "4": "2023-03-09 16:20:26", + "9": "1", + "10": "73080.0", + "11": "73080.0", + "12": "1", + "13": "73080.0", + "index": 971 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "9": "1", + "10": "698.99", + "11": "698.99", + "12": "1", + "13": "698.99", + "index": 972 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "5": "942.0987220000001", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "10": "698.99", + "11": "698.99", + "12": "1", + "13": "698.99", + "index": 973 + }, + { + "0": "985F137B-2E34-46E7-9AB6-EBF9D2C220F4", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:06:48", + "9": "1", + "10": "5108.979999999999", + "11": "145.9708571428571", + "12": "35", + "13": "145.9708571428571", + "index": 974 + }, + { + "0": "2FF854D4-3A50-4F9B-9AF9-861612051389", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:33:06", + "9": "1", + "10": "6908.620000000002", + "11": "146.99191489361706", + "12": "47", + "13": "146.99191489361706", + "index": 975 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "9": "1", + "10": "64.49", + "11": "64.49", + "12": "1", + "13": "64.49", + "index": 976 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "5": "64.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "10": "64.49", + "11": "64.49", + "12": "1", + "13": "64.49", + "index": 977 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "9": "1", + "10": "118.79", + "11": "118.79", + "12": "1", + "13": "118.79", + "index": 978 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "5": "118.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "118.79", + "11": "118.79", + "12": "1", + "13": "118.79", + "index": 979 + }, + { + "0": "A44E3875-069E-472A-B3FB-5ADC3A7CDF66", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:51:16", + "9": "1", + "10": "286.35", + "11": "286.35", + "12": "1", + "13": "286.35", + "index": 980 + }, + { + "0": "68D83F37-50D4-484B-8652-EAA245BFD48D", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:33:26", + "9": "1", + "10": "3009.3999999999987", + "11": "143.30476190476185", + "12": "21", + "13": "143.30476190476185", + "index": 981 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "9": "1", + "10": "1499.0", + "11": "1499.0", + "12": "1", + "13": "1499.0", + "index": 982 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "1499.0", + "11": "1499.0", + "12": "1", + "13": "1499.0", + "index": 983 + }, + { + "0": "13A9B365-CFF1-44F7-A1EB-19327EDE18C2", + "1": "A1688853647393240", + "2": "295.38", + "3": "8.0", + "4": "2023-01-25 16:49:33", + "9": "1", + "10": "443.07", + "11": "221.535", + "12": "2", + "13": "221.535", + "index": 984 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "9": "1", + "10": "569.97", + "11": "569.97", + "12": "1", + "13": "569.97", + "index": 985 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "10": "569.97", + "11": "569.97", + "12": "1", + "13": "569.97", + "index": 986 + }, + { + "0": "A92EA0F2-90D5-413B-A2FE-8A91F3DA1255", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:50:57", + "9": "1", + "10": "222.19", + "11": "222.19", + "12": "1", + "13": "222.19", + "index": 987 + }, + { + "0": "ABE168A6-3636-4202-9389-95E44E65881E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:14:56", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "10": "423.92", + "11": "52.99", + "12": "8", + "13": "52.99", + "index": 988 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 989 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "281.37", + "11": "281.37", + "12": "1", + "13": "281.37", + "index": 990 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "9": "1", + "10": "99.99", + "11": "99.99", + "12": "1", + "13": "99.99", + "index": 991 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "10": "99.99", + "11": "99.99", + "12": "1", + "13": "99.99", + "index": 992 + }, + { + "0": "47A9F4BA-03C8-4900-BEF0-BADCF3C21D99", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:19:14", + "9": "1", + "10": "1139.94", + "11": "569.97", + "12": "2", + "13": "569.97", + "index": 993 + }, + { + "0": "51729D46-986A-4AD6-927B-959AA1FF1749", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:35:19", + "9": "1", + "10": "1241.77", + "11": "53.99", + "12": "23", + "13": "53.99", + "index": 994 + }, + { + "0": "F15CE4DA-A189-42BF-931E-66398ED48CA6", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:21:51", + "9": "1", + "10": "2559.4899999999993", + "11": "142.19388888888886", + "12": "18", + "13": "142.19388888888886", + "index": 995 + }, + { + "0": "4C5EC030-CD2E-4097-B706-42BE9D808509", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:05:37", + "9": "1", + "10": "1809.64", + "11": "139.20307692307694", + "12": "13", + "13": "139.20307692307694", + "index": 996 + }, + { + "0": "27B1F6C4-E881-408C-A29E-CA13AD07997B", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:49:35", + "9": "1", + "10": "119.93999999999998", + "11": "19.99", + "12": "6", + "13": "19.99", + "index": 997 + }, + { + "0": "DE53E28B-69C9-4C7D-AF79-E725235C87F4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:31:56", + "9": "1", + "10": "259.87", + "11": "19.990000000000002", + "12": "13", + "13": "19.990000000000002", + "index": 998 + }, + { + "0": "1935138A-D934-4B52-B3F5-FA99C47F03AC", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:40:57", + "9": "1", + "10": "190.61", + "11": "63.53666666666667", + "12": "3", + "13": "63.53666666666667", + "index": 999 + }, + { + "0": "CDAFFE95-3687-4886-9668-96EB7645063F", + "1": "A1829582586398540", + "2": "786.79", + "3": "10.0", + "4": "2023-01-20 09:25:50", + "9": "1", + "10": "905.79", + "11": "452.895", + "12": "2", + "13": "452.895", + "index": 1000 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "double" + }, + { + "key": "3", + "name": "localHour", + "type": "double" + }, + { + "key": "4", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "5", + "name": "transactionAmountUSD", + "type": "double" + }, + { + "key": "6", + "name": "isProxyIP", + "type": "boolean" + }, + { + "key": "7", + "name": "digitalItemCount", + "type": "double" + }, + { + "key": "8", + "name": "physicalItemCount", + "type": "double" + }, + { + "key": "9", + "name": "is_fraud", + "type": "bigint" + }, + { + "key": "10", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "11", + "name": "transaction_amount_7d_avg", + "type": "double" + }, + { + "key": "12", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "13", + "name": "transaction_amount_3d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "57d057ce-19e2-495d-b592-ca230b559d16": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "5829e77a-cf37-426e-aeeb-2fffa1088f01": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "5e44b1bb-52df-4f40-a771-4c600c2cd2bc": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "65763c37-3e8e-4ed8-ae1e-2e58d36a84e8": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "4" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520427234290", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 15:24:53", + "3": "1", + "4": "559.99", + "5": "559.99", + "6": "1", + "7": "559.99", + "8": "559.99", + "index": 1 + }, + { + "0": "A1055520432197980", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 12:52:29", + "3": "1", + "4": "979.0", + "5": "979.0", + "6": "1", + "7": "979.0", + "8": "979.0", + "index": 2 + }, + { + "0": "A1055520473357430", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 15:11:26", + "3": "1", + "4": "529.99", + "5": "529.99", + "6": "1", + "7": "529.99", + "8": "529.99", + "index": 3 + }, + { + "0": "A1055520504917640", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 01:32:16", + "3": "1", + "4": "534.99", + "5": "534.99", + "6": "1", + "7": "534.99", + "8": "534.99", + "index": 4 + }, + { + "0": "A1055520508165660", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 19:15:14", + "3": "1", + "4": "564.99", + "5": "564.99", + "6": "1", + "7": "564.99", + "8": "564.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "create_timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "3", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "4", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "5", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "6", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "7", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "8", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "670eac25-d153-47f8-aa79-a091ccda814b": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "6cc7fe8a-2b11-4ffc-8eb1-4f3163d7a732": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "70f8aac9-0438-4aa8-a580-eec0c49b2de0": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "7f8ccf77-03af-4802-8f52-5ad10b30d16a": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "99d1b95b-e51b-4feb-8c6e-1a5d2cfa1f64": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "9e1af3f6-75e3-4715-9e54-961a49a27e73": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "9": "1", + "index": 1 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "5": "1143.856282", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 2 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "9": "1", + "index": 3 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 4 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "9": "1", + "index": 5 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "5": "99.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 6 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "9": "1", + "index": 7 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "9": "1", + "index": 8 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "9": "1", + "index": 9 + }, + { + "0": "DDE0B1F6-40B2-44CA-B0A7-AE46453D51A0", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:25:29", + "9": "1", + "index": 10 + }, + { + "0": "E6789403-5C39-4D44-BA7C-3A1F481E718B", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:37:59", + "9": "1", + "index": 11 + }, + { + "0": "287F81B6-06F6-4C3B-8714-401FA70EC7DA", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:29:49", + "9": "1", + "index": 12 + }, + { + "0": "5CE4020A-ABA5-4B60-9BC3-131A126670C6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:03:22", + "9": "1", + "index": 13 + }, + { + "0": "A1979FD7-32C8-4BE2-AB5F-3FFDDD7C584A", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:24:17", + "9": "1", + "index": 14 + }, + { + "0": "11FAFE8A-E9F5-4FB4-BC04-4C96AE6E852F", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:16:26", + "9": "1", + "index": 15 + }, + { + "0": "C110E452-388B-4D53-A271-DE2C06DB410A", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:17:45", + "9": "1", + "index": 16 + }, + { + "0": "667490FD-D4B7-4039-A69B-C4E70A9F5DE3", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:23:04", + "9": "1", + "index": 17 + }, + { + "0": "E617D42C-798C-455C-8372-BC06259DE735", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:11:03", + "9": "1", + "index": 18 + }, + { + "0": "ACB1088D-CB05-45F9-9B3E-4709989A7443", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:06:03", + "9": "1", + "index": 19 + }, + { + "0": "51729D46-986A-4AD6-927B-959AA1FF1749", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:35:19", + "9": "1", + "index": 20 + }, + { + "0": "81D69AD5-E46F-46A4-8317-14C6F2908E0D", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:32:17", + "9": "1", + "index": 21 + }, + { + "0": "A45B5295-84D3-47CD-AFA3-E074A9DF9EF6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:43:38", + "9": "1", + "index": 22 + }, + { + "0": "E44AA2DD-8814-4746-839A-4A3D8EE5F243", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:12:20", + "9": "1", + "index": 23 + }, + { + "0": "DE15CA12-F07E-4C7C-9C30-19EF38B2B3E6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:42:16", + "9": "1", + "index": 24 + }, + { + "0": "5F5F30FC-7EA0-41CE-B5A4-FA459FDDBE38", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:09:49", + "9": "1", + "index": 25 + }, + { + "0": "B2F718B0-6639-44C6-9E86-04BCCB6765B6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:15:03", + "9": "1", + "index": 26 + }, + { + "0": "A8E3D8C2-10C0-429E-B6E1-743A0D5C3C17", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:26:46", + "9": "1", + "index": 27 + }, + { + "0": "AC86DB3A-EEED-44C1-85CF-79DA0AF47B0F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:39:29", + "9": "1", + "index": 28 + }, + { + "0": "A161FE84-6920-43CD-9AFE-7D1A04800640", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:20:14", + "9": "1", + "index": 29 + }, + { + "0": "D0F517D0-F18C-41DE-A53F-65C3264C4C5E", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:13:40", + "9": "1", + "index": 30 + }, + { + "0": "B117C813-5EB9-4747-92B5-C52D520AC13F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:36:39", + "9": "1", + "index": 31 + }, + { + "0": "AED3F5DA-87AB-45C8-A0FF-426E353FB102", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:31:04", + "9": "1", + "index": 32 + }, + { + "0": "4BCAC6B0-3937-47E3-9AB8-6519D09321B1", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:01:57", + "9": "1", + "index": 33 + }, + { + "0": "FEE49FF0-87EB-402B-8EBB-8F9F4C9CB225", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:33:55", + "9": "1", + "index": 34 + }, + { + "0": "826E2F8E-D033-4287-A065-A26210923F90", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:40:40", + "9": "1", + "index": 35 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 36 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 37 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 38 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "9": "1", + "index": 39 + }, + { + "0": "72399945-3AC5-461E-BF85-228552DF71E1", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:35:42", + "9": "1", + "index": 40 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 41 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "9": "1", + "index": 42 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "9": "1", + "index": 43 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "9": "1", + "index": 44 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "9": "1", + "index": 45 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "9": "1", + "index": 46 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "9": "1", + "index": 47 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "9": "1", + "index": 48 + }, + { + "0": "5AF9F5B3-7386-426B-878E-3F1B7BBF48D9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:56:55", + "9": "1", + "index": 49 + }, + { + "0": "9E012F96-E7AA-4046-8F24-0C85FBB36CF5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:07:57", + "9": "1", + "index": 50 + }, + { + "0": "68D83F37-50D4-484B-8652-EAA245BFD48D", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:33:26", + "9": "1", + "index": 51 + }, + { + "0": "2DC3FDC7-C677-4479-A4C4-85C9A5E2F4FC", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:11:32", + "9": "1", + "index": 52 + }, + { + "0": "1353C004-23CE-4887-8611-0986140B9411", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:22:26", + "9": "1", + "index": 53 + }, + { + "0": "6D96EB12-FD10-4D59-8262-C477E3B4A7FF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:18:40", + "9": "1", + "index": 54 + }, + { + "0": "64A65086-D78C-4C67-994D-06DC95737FB5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:09:49", + "9": "1", + "index": 55 + }, + { + "0": "4186FC50-1BBE-4188-94FD-5659E850B7A3", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:45:29", + "9": "1", + "index": 56 + }, + { + "0": "442116BE-E400-48F2-80E8-C15B1DECFB1E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:51:35", + "9": "1", + "index": 57 + }, + { + "0": "61841EEB-00BE-478C-8142-677F86A55BD1", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:26:54", + "9": "1", + "index": 58 + }, + { + "0": "73F74DE9-9679-417D-A7A8-6D1D74769D9D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:28:23", + "9": "1", + "index": 59 + }, + { + "0": "298F7C38-80B2-4CC3-8D84-29A2B5B7797C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:48:42", + "9": "1", + "index": 60 + }, + { + "0": "4B54A952-E219-4AD1-8DB2-CAD464FCC43A", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:46:44", + "9": "1", + "index": 61 + }, + { + "0": "D02E8FB4-3170-4C47-8886-ABE470F197C3", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:03:30", + "9": "1", + "index": 62 + }, + { + "0": "3F556D13-8CCB-400E-B9BD-582162BE610B", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:36:12", + "9": "1", + "index": 63 + }, + { + "0": "897B514D-E758-4690-84B8-6549559C52EE", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:50:29", + "9": "1", + "index": 64 + }, + { + "0": "985F137B-2E34-46E7-9AB6-EBF9D2C220F4", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:06:48", + "9": "1", + "index": 65 + }, + { + "0": "D247B57A-BE03-44A2-ABCB-E73EA6FCD843", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:29:52", + "9": "1", + "index": 66 + }, + { + "0": "40F8D07E-67EF-4678-8612-FC130DC84F5E", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:00:08", + "9": "1", + "index": 67 + }, + { + "0": "F15CE4DA-A189-42BF-931E-66398ED48CA6", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:21:51", + "9": "1", + "index": 68 + }, + { + "0": "973F228D-6E34-4E2C-A8ED-86A560FFE993", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:37:33", + "9": "1", + "index": 69 + }, + { + "0": "BCBDF6C6-1D5A-42F2-A912-E295526FF9B7", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:04:05", + "9": "1", + "index": 70 + }, + { + "0": "C1040C0D-A701-4AD0-B4E3-1BC1F06AB4AA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:13:25", + "9": "1", + "index": 71 + }, + { + "0": "4C5EC030-CD2E-4097-B706-42BE9D808509", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:05:37", + "9": "1", + "index": 72 + }, + { + "0": "3CF32319-BFF3-4CFE-8792-8C4775AD619F", + "1": "A1899946873142120", + "2": "99.98", + "3": "13.0", + "4": "2023-01-03 18:45:18", + "9": "1", + "index": 73 + }, + { + "0": "F6FBBB59-BFD5-4736-B635-64301B04D71C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:42:53", + "9": "1", + "index": 74 + }, + { + "0": "AD22A063-D3FB-4623-B7A2-69A6C8E5CEE0", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:53:28", + "9": "1", + "index": 75 + }, + { + "0": "9E9BB950-7681-4213-B8D7-1E71AE232C43", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:55:40", + "9": "1", + "index": 76 + }, + { + "0": "4EC3DEEC-D21B-4515-A3DE-5CC895397F21", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:59:16", + "9": "1", + "index": 77 + }, + { + "0": "2120F51D-E109-4481-88D7-023757351EDF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:05:23", + "9": "1", + "index": 78 + }, + { + "0": "D8EFBBA0-BEF9-4BEA-A6F0-4A5CBE4C1287", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:09:43", + "9": "1", + "index": 79 + }, + { + "0": "C2440D4D-3768-4108-BCAF-E43441537783", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:38:15", + "9": "1", + "index": 80 + }, + { + "0": "19DB47CE-E027-4D8D-8439-ADCC4BBE9879", + "1": "A1899946873142120", + "2": "59.99", + "3": "13.0", + "4": "2023-01-03 18:42:51", + "9": "1", + "index": 81 + }, + { + "0": "88A8FA38-800E-459D-A11C-77477E41FC5B", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:08:13", + "9": "1", + "index": 82 + }, + { + "0": "038E2738-E619-431A-8597-5952B7710EF8", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:20:26", + "9": "1", + "index": 83 + }, + { + "0": "34DE06CA-82E2-44D3-8E83-E650A493EE27", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:50:42", + "9": "1", + "index": 84 + }, + { + "0": "DDBCD8B8-C45B-45BB-8373-E184F6776E09", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:01:13", + "9": "1", + "index": 85 + }, + { + "0": "2FF854D4-3A50-4F9B-9AF9-861612051389", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:33:06", + "9": "1", + "index": 86 + }, + { + "0": "BE25CE28-7142-4EB4-8157-77654E4816D0", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:24:35", + "9": "1", + "index": 87 + }, + { + "0": "57C6D5D6-43F4-4BD0-9FF5-67E4BB395B99", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:15:43", + "9": "1", + "index": 88 + }, + { + "0": "F5606360-D929-4903-8771-E51207DAF2C6", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:53:31", + "9": "1", + "index": 89 + }, + { + "0": "7898FC86-CDBF-469B-B369-5E70B9BAC1F1", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:01:54", + "9": "1", + "index": 90 + }, + { + "0": "AF64911E-A295-4337-BBAF-835F82DD77BA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:41:16", + "9": "1", + "index": 91 + }, + { + "0": "F825E26E-89D0-43AB-B281-D62588C4779A", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:49:42", + "9": "1", + "index": 92 + }, + { + "0": "C7D4CBEF-2E68-41A2-B83A-D064795E296E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:16:55", + "9": "1", + "index": 93 + }, + { + "0": "A75939D1-EE17-4E78-8478-6937CD08D5E9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:52:01", + "9": "1", + "index": 94 + }, + { + "0": "422D5F57-6B6E-4803-AD06-9BF33330F102", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:48:55", + "9": "1", + "index": 95 + }, + { + "0": "CA193A45-31F8-4EB5-A19D-BF5D2602277D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:40:11", + "9": "1", + "index": 96 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 97 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 98 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 99 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 100 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 101 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 102 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 103 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "9": "1", + "index": 104 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "9": "1", + "index": 105 + }, + { + "0": "90BAD1BA-E6EE-4EA6-B27F-7162B22CDBFA", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:39:16", + "9": "1", + "index": 106 + }, + { + "0": "D2CE31CE-7D5A-4E80-8D3E-F2E184DFAC98", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:27:17", + "9": "1", + "index": 107 + }, + { + "0": "8875BFC3-B41E-416A-A334-65EB49672BEC", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:29:02", + "9": "1", + "index": 108 + }, + { + "0": "6B3337E4-83E7-49DA-97BA-D0DC2B44F42F", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:41:07", + "9": "1", + "index": 109 + }, + { + "0": "9D92C6BC-E560-4C32-A034-1E1F0814E46E", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:42:58", + "9": "1", + "index": 110 + }, + { + "0": "E9D36D5B-FDCD-440A-BC1A-C53A9110CF22", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:46:52", + "9": "1", + "index": 111 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "5": "107.52", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 112 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 113 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "9": "1", + "index": 114 + }, + { + "0": "4324B9F6-5D21-4327-B80F-99057A3B541C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:33:20", + "9": "1", + "index": 115 + }, + { + "0": "EFFCEF09-9E31-4B39-AD1B-8E169D27C749", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:34:26", + "9": "1", + "index": 116 + }, + { + "0": "28C2478A-7236-40ED-A5C4-5BB8A29E561B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:43:14", + "9": "1", + "index": 117 + }, + { + "0": "EAD34905-DE0B-4FC8-A4AE-C2248AF29A08", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:37:32", + "9": "1", + "index": 118 + }, + { + "0": "7DDF174A-C6BF-4245-8148-650BBEC82DA8", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:36:35", + "9": "1", + "index": 119 + }, + { + "0": "D3F14FD5-C8C3-4401-8053-A5DCB4086473", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:30:44", + "9": "1", + "index": 120 + }, + { + "0": "92C5B50A-E46E-404D-9EFB-7043D6DD7C68", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:32:00", + "9": "1", + "index": 121 + }, + { + "0": "D1884A1A-0865-47C3-A8DC-43DC991D661C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:41:02", + "9": "1", + "index": 122 + }, + { + "0": "F7690559-B2FA-42E4-910F-DF65A0250586", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:29:47", + "9": "1", + "index": 123 + }, + { + "0": "17B73DB4-D6C9-4F0D-A8CA-A1BD9334FABC", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:42:15", + "9": "1", + "index": 124 + }, + { + "0": "A3BEE7DE-D634-4C72-A05D-77A80D7D613B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:44:48", + "9": "1", + "index": 125 + }, + { + "0": "A25BC911-EAA9-47D1-B8D2-4086F6CC94CB", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:35:29", + "9": "1", + "index": 126 + }, + { + "0": "B30F54F2-BBB5-4DFC-B4D6-F3BA03220790", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:28:43", + "9": "1", + "index": 127 + }, + { + "0": "8D4F3115-A1D5-459A-A847-A4C3E43A74A7", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:39:35", + "9": "1", + "index": 128 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 129 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "9": "1", + "index": 130 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 131 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "9": "1", + "index": 132 + }, + { + "0": "EE63EE82-8A5F-4422-8CFA-3CF0C48D05FD", + "1": "A1688853524321290", + "2": "49.98", + "3": "19.0", + "4": "2023-01-05 00:32:25", + "9": "1", + "index": 133 + }, + { + "0": "14B43B88-2D00-4D03-BDDA-3484C0D86769", + "1": "A1688853524321290", + "2": "24.99", + "3": "19.0", + "4": "2023-01-05 00:26:00", + "9": "1", + "index": 134 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "5": "74.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 135 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "9": "1", + "index": 136 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "5": "24.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 137 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "9": "1", + "index": 138 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "5": "442.12214400000005", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 139 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "9": "1", + "index": 140 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 141 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "9": "1", + "index": 142 + }, + { + "0": "53F9A1F3-DB12-474B-8E9B-E6ADF22699AF", + "1": "A914800996051170", + "2": "139.99", + "3": "17.0", + "4": "2023-01-07 22:30:40", + "9": "1", + "index": 143 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 144 + }, + { + "0": "D1A1DEF3-8373-40A4-8337-742C4BC68770", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:50:44", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 145 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "9": "1", + "index": 146 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 147 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "9": "1", + "index": 148 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 149 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "9": "1", + "index": 150 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 151 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "9": "1", + "index": 152 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "5": "279.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 153 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "9": "1", + "index": 154 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "5": "176.66415", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 155 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "9": "1", + "index": 156 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 157 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "9": "1", + "index": 158 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "5": "145.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 159 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "9": "1", + "index": 160 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "5": "86.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 161 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "9": "1", + "index": 162 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "9": "1", + "index": 163 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "9": "1", + "index": 164 + }, + { + "0": "CA5F63D9-CA1B-41E6-8C42-7F89EA103D1D", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:31:01", + "9": "1", + "index": 165 + }, + { + "0": "0A82E4ED-93EC-4386-AA16-0EA1FC946B6C", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 19:20:25", + "9": "1", + "index": 166 + }, + { + "0": "D1834580-E9C8-4D34-9433-0BA410FA0DF4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:30:31", + "9": "1", + "index": 167 + }, + { + "0": "DE53E28B-69C9-4C7D-AF79-E725235C87F4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:31:56", + "9": "1", + "index": 168 + }, + { + "0": "9E492C70-9940-4103-9414-FC8F0C741490", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:27:34", + "9": "1", + "index": 169 + }, + { + "0": "DABB8679-0A5B-46D1-9421-D443A45907F8", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:48:21", + "9": "1", + "index": 170 + }, + { + "0": "630F1681-99D1-4F3C-BCE0-69C6B28E5A98", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:43:12", + "9": "1", + "index": 171 + }, + { + "0": "961FCF4A-7930-4C04-B37B-A5FDFA414D9E", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:41:14", + "9": "1", + "index": 172 + }, + { + "0": "41F4234C-1659-48C5-A9D1-4C2324A0891B", + "1": "A1899946895455190", + "2": "19.99", + "3": "11.0", + "4": "2023-01-13 16:52:56", + "9": "1", + "index": 173 + }, + { + "0": "6A2D4479-6262-4C32-95B5-AC5BE0205E24", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:47:34", + "9": "1", + "index": 174 + }, + { + "0": "F3606B8D-3008-4781-AC9C-BA159F1BF3B5", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:24:09", + "9": "1", + "index": 175 + }, + { + "0": "99E39E43-B8E7-48C8-8C6E-EE09902A63E0", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:36:07", + "9": "1", + "index": 176 + }, + { + "0": "B375BB8C-242A-4DC6-8FC3-F35EA5ADDADD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:21:25", + "9": "1", + "index": 177 + }, + { + "0": "E112F541-98DE-420B-B009-FAA21420164B", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:00", + "9": "1", + "index": 178 + }, + { + "0": "4A7523C3-17EE-4AB6-92D9-6535A3A41331", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:22:20", + "9": "1", + "index": 179 + }, + { + "0": "2F6CE5C9-1702-4E7A-8A88-40CE991E99BB", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:34:17", + "9": "1", + "index": 180 + }, + { + "0": "E7F77A61-785B-4E7D-8C99-6A237E368BC5", + "1": "A1899946895455190", + "2": "19.99", + "3": "12.0", + "4": "2023-01-13 17:22:25", + "9": "1", + "index": 181 + }, + { + "0": "C077446E-640F-4769-9527-5A727F34A4B4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:38:29", + "9": "1", + "index": 182 + }, + { + "0": "27B1F6C4-E881-408C-A29E-CA13AD07997B", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:49:35", + "9": "1", + "index": 183 + }, + { + "0": "DF9AFB75-2D64-4A8A-8743-AA39724E34AD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:39:41", + "9": "1", + "index": 184 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 185 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 186 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 187 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "9": "1", + "index": 188 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "5": "161.722522", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 189 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "9": "1", + "index": 190 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 191 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "9": "1", + "index": 192 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 193 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "9": "1", + "index": 194 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "5": "62.39", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 195 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "9": "1", + "index": 196 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "5": "64.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 197 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "9": "1", + "index": 198 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "5": "79.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 199 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "9": "1", + "index": 200 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "5": "86.74", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 201 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "9": "1", + "index": 202 + }, + { + "0": "06CA7673-9504-44D4-A9B1-49EC29233AD5", + "1": "A844428040495230", + "2": "73.11", + "3": "13.0", + "4": "2023-01-19 18:43:29", + "9": "1", + "index": 203 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 204 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "9": "1", + "index": 205 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "5": "237.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 206 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "9": "1", + "index": 207 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 208 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "9": "1", + "index": 209 + }, + { + "0": "CFF67307-A9EF-43AC-AE45-D448E2991474", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:39:12", + "9": "1", + "index": 210 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "5": "157.474251", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 211 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "9": "1", + "index": 212 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "5": "62.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 213 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "9": "1", + "index": 214 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 215 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "9": "1", + "index": 216 + }, + { + "0": "98D7E9CF-D308-4B97-BF45-00263A93B702", + "1": "A914801004943538", + "2": "59.99", + "4": "2023-01-20 02:02:01", + "9": "1", + "index": 217 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "5": "31.94", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 218 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "9": "1", + "index": 219 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 220 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "9": "1", + "index": 221 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "5": "259.62185800000003", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 222 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "9": "1", + "index": 223 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "5": "102.48", + "6": "false", + "7": "2.0", + "8": "1.0", + "9": "1", + "index": 224 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "9": "1", + "index": 225 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "5": "149.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 226 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "9": "1", + "index": 227 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 228 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "9": "1", + "index": 229 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "5": "626.16465", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 230 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "9": "1", + "index": 231 + }, + { + "0": "C8AA8B84-1C89-4B76-B2BF-3C10C3444D89", + "1": "A914801007105746", + "2": "80.73", + "3": "9.0", + "4": "2023-01-25 18:07:59", + "9": "1", + "index": 232 + }, + { + "0": "F2CD36F5-0FC9-4DBF-9D5A-D6B043795C0C", + "1": "A914801007105746", + "2": "83.06", + "3": "8.0", + "4": "2023-01-23 16:39:58", + "9": "1", + "index": 233 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "5": "93.85", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 234 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "9": "1", + "index": 235 + }, + { + "0": "A8410FBF-9EE3-4200-A0ED-05631423E0F9", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 08:58:29", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 236 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 237 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "9": "1", + "index": 238 + }, + { + "0": "13A9B365-CFF1-44F7-A1EB-19327EDE18C2", + "1": "A1688853647393240", + "2": "295.38", + "3": "8.0", + "4": "2023-01-25 16:49:33", + "9": "1", + "index": 239 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "5": "147.69", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 240 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "9": "1", + "index": 241 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 242 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "9": "1", + "index": 243 + }, + { + "0": "CACD0238-79D3-4506-B78A-F24E494B3AAC", + "1": "A1055521395048230", + "2": "81.6", + "3": "2.0", + "4": "2023-01-25 08:02:13", + "9": "1", + "index": 244 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "5": "83.14", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 245 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "9": "1", + "index": 246 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "5": "134.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 247 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "9": "1", + "index": 248 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "5": "80.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 249 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "9": "1", + "index": 250 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 251 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "9": "1", + "index": 252 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 253 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "9": "1", + "index": 254 + }, + { + "0": "C09DE962-3605-4A0E-B82F-A09B2B618D1F", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:54:27", + "9": "1", + "index": 255 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 256 + }, + { + "0": "C61F74AD-F654-4042-9DFF-567978FA7CF7", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:57:11", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 257 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "9": "1", + "index": 258 + }, + { + "0": "A92EA0F2-90D5-413B-A2FE-8A91F3DA1255", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:50:57", + "9": "1", + "index": 259 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 260 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "9": "1", + "index": 261 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "5": "231.56", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 262 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "9": "1", + "index": 263 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "5": "102.999897", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 264 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "9": "1", + "index": 265 + }, + { + "0": "F1FE235C-84E4-4770-BA47-2F70994718C1", + "1": "A914801011218316", + "2": "330.86", + "3": "17.0", + "4": "2023-02-12 23:03:05", + "9": "1", + "index": 266 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "5": "224.11", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 267 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "9": "1", + "index": 268 + }, + { + "0": "3FBAFD91-D3AC-41CB-BC17-4CAAAC0C52EA", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:36:34", + "9": "1", + "index": 269 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 270 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "9": "1", + "index": 271 + }, + { + "0": "56BAD8D6-088E-4AD9-99E4-2C23D10C32B0", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:48:24", + "9": "1", + "index": 272 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 273 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "9": "1", + "index": 274 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "5": "65.54", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 275 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "9": "1", + "index": 276 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "5": "106.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 277 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "9": "1", + "index": 278 + }, + { + "0": "0C064A95-7D41-4C84-A18E-816228CAB89E", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:56:13", + "9": "1", + "index": 279 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 280 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "9": "1", + "index": 281 + }, + { + "0": "E261B8E8-F241-46F3-89AA-5CC0283C8040", + "1": "A985156999024771", + "2": "92.5", + "3": "2.0", + "4": "2023-02-01 10:37:54", + "9": "1", + "index": 282 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "5": "93.07", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 283 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "9": "1", + "index": 284 + }, + { + "0": "105FE6E4-4E43-4042-937C-4E6748781A3D", + "1": "A914801012822158", + "2": "92.63", + "3": "0.0", + "4": "2023-02-03 05:37:23", + "9": "1", + "index": 285 + }, + { + "0": "6BA9D314-0ECC-425F-BCA8-FE3DC74581C8", + "1": "A914801012822158", + "2": "104.25", + "3": "6.0", + "4": "2023-02-01 11:41:23", + "9": "1", + "index": 286 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 287 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "9": "1", + "index": 288 + }, + { + "0": "A5D379FD-D933-4F68-8763-0C5AF07F7834", + "1": "A914801013785993", + "2": "86.98", + "3": "4.0", + "4": "2023-02-03 09:47:07", + "9": "1", + "index": 289 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "5": "95.02", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 290 + }, + { + "0": "3CFD786C-1D49-4D2D-94DA-C3A0E26ACB02", + "1": "A914801013785993", + "2": "93.94", + "3": "0.0", + "4": "2023-02-08 06:19:27", + "5": "93.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 291 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "9": "1", + "index": 292 + }, + { + "0": "AB06E897-E5CB-408B-957A-9E77B9EBD71E", + "1": "A914801013775218", + "2": "93.62", + "3": "9.0", + "4": "2023-02-02 14:49:48", + "9": "1", + "index": 293 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 294 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "9": "1", + "index": 295 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "5": "170.67264", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 296 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "9": "1", + "index": 297 + }, + { + "0": "AF5BC5D5-9280-4F4A-860B-D8A4772823AD", + "1": "A985157000299534", + "2": "281.37", + "3": "14.0", + "4": "2023-02-03 19:43:12", + "9": "1", + "index": 298 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 299 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "9": "1", + "index": 300 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 301 + }, + { + "0": "AFC2F084-490B-4B4F-AF6A-05B999BC0C81", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:45:40", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 302 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "9": "1", + "index": 303 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "5": "346.462251", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 304 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "9": "1", + "index": 305 + }, + { + "0": "ECC38318-E094-4FAA-9638-6C664AB49DB8", + "1": "A985157000491580", + "2": "299.0", + "3": "19.0", + "4": "2023-02-05 10:03:12", + "9": "1", + "index": 306 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "5": "418.129547", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 307 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "9": "1", + "index": 308 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 309 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "9": "1", + "index": 310 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 311 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "9": "1", + "index": 312 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "9": "1", + "index": 313 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 314 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 315 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "9": "1", + "index": 316 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "5": "149.93", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 317 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "9": "1", + "index": 318 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "5": "64.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 319 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "9": "1", + "index": 320 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "5": "21.6", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 321 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "9": "1", + "index": 322 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 323 + }, + { + "0": "9B6410A2-B896-4E0E-9929-B3D3FF23D091", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:43:38", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 324 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "9": "1", + "index": 325 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "5": "99.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 326 + }, + { + "0": "23FB57DD-40E6-49D4-8F47-29EC2357E548", + "1": "A564049508937862", + "2": "0.0", + "4": "2023-03-06 19:52:07", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 327 + }, + { + "0": "EC085107-C5DF-4814-8E31-374D3D8BD5AD", + "1": "A564049508937862", + "2": "482.68", + "3": "10.0", + "4": "2023-03-06 18:31:45", + "5": "482.68", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 328 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "9": "1", + "index": 329 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "9": "1", + "index": 330 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 331 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 332 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "9": "1", + "index": 333 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "5": "118.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 334 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "9": "1", + "index": 335 + }, + { + "0": "0D385B17-41FC-4D3B-8C36-BFD0FAF6AA20", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:26:33", + "9": "1", + "index": 336 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "5": "423.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 337 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "9": "1", + "index": 338 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 339 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "9": "1", + "index": 340 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "5": "542.25145", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 341 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "9": "1", + "index": 342 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 343 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "9": "1", + "index": 344 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 345 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "9": "1", + "index": 346 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "5": "66.05", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 347 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "9": "1", + "index": 348 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "5": "149.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 349 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "9": "1", + "index": 350 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "5": "1154.4", + "6": "false", + "7": "0.0", + "8": "3.0", + "9": "1", + "index": 351 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "9": "1", + "index": 352 + }, + { + "0": "44D80959-7137-4EDB-AEEE-1B7654A9A2A2", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-23 01:16:41", + "9": "1", + "index": 353 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "5": "119.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 354 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "9": "1", + "index": 355 + }, + { + "0": "C173A9A3-90B7-4B38-8DAC-D001CDD47814", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:51:29", + "9": "1", + "index": 356 + }, + { + "0": "76824E16-8144-4C10-8769-DF9049DE4BB3", + "1": "A1899946873128090", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 03:38:31", + "9": "1", + "index": 357 + }, + { + "0": "D141370E-DD9D-4316-A2F9-A5D8244C61A2", + "1": "A1899946873128090", + "2": "119.98", + "3": "20.0", + "4": "2023-02-15 02:37:52", + "9": "1", + "index": 358 + }, + { + "0": "673A772C-71A1-4541-8468-7298A4FC0844", + "1": "A1899946873128090", + "2": "75.58", + "3": "20.0", + "4": "2023-02-15 02:34:45", + "9": "1", + "index": 359 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "5": "127.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 360 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "9": "1", + "index": 361 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 362 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "9": "1", + "index": 363 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 364 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "9": "1", + "index": 365 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "5": "105.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 366 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "9": "1", + "index": 367 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 368 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "9": "1", + "index": 369 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 370 + }, + { + "0": "BD6E876C-4420-4359-B25A-35BE542F82C0", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:30:03", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 371 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "9": "1", + "index": 372 + }, + { + "0": "66F28A11-228E-4CF9-9872-0677EF57CCCD", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:50:09", + "9": "1", + "index": 373 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "5": "50.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 374 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "9": "1", + "index": 375 + }, + { + "0": "077961F4-BD88-4A14-9607-D267E3882119", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:57:34", + "9": "1", + "index": 376 + }, + { + "0": "6083FE06-FDAB-4725-8CB2-DDB0B978E826", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:58:56", + "9": "1", + "index": 377 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "5": "60.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 378 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "9": "1", + "index": 379 + }, + { + "0": "3826E27E-AAFD-4443-A7E9-A0586D2F0729", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:26:58", + "9": "1", + "index": 380 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "5": "127.18", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 381 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "9": "1", + "index": 382 + }, + { + "0": "5BDE388B-8A30-4D45-8122-F7CA341442C8", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 13:00:25", + "9": "1", + "index": 383 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "5": "53.36", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 384 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "9": "1", + "index": 385 + }, + { + "0": "1935138A-D934-4B52-B3F5-FA99C47F03AC", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:40:57", + "9": "1", + "index": 386 + }, + { + "0": "10366C01-E5BE-4DD8-BD52-1B22971F1F4B", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:39:39", + "9": "1", + "index": 387 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 388 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "9": "1", + "index": 389 + }, + { + "0": "52961216-05ED-4183-8EF5-5237F0352C41", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:17:31", + "9": "1", + "index": 390 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 391 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "9": "1", + "index": 392 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "9": "1", + "index": 393 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "9": "1", + "index": 394 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 395 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 396 + }, + { + "0": "72B7AED1-0944-4DE8-8BEF-74680BBAC3F1", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:55:28", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 397 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 398 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "9": "1", + "index": 399 + }, + { + "0": "4FD412FF-3716-4007-8C81-80FDA381E04A", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:37:03", + "9": "1", + "index": 400 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "5": "53.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 401 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "9": "1", + "index": 402 + }, + { + "0": "E9AE2FFC-1BA4-45CC-858C-DCE5E3BA51B8", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:51:45", + "9": "1", + "index": 403 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "5": "108.38", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 404 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "9": "1", + "index": 405 + }, + { + "0": "D74E0304-9D1B-40AC-8418-33C7FD7FDBD9", + "1": "A844428056745591", + "2": "249.95", + "3": "12.0", + "4": "2023-02-16 20:40:53", + "9": "1", + "index": 406 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "5": "49.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 407 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "9": "1", + "index": 408 + }, + { + "0": "07C1A129-EF6A-4B87-BFE4-C4D4CDF7049B", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:01:39", + "9": "1", + "index": 409 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "5": "54.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 410 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "9": "1", + "index": 411 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "5": "65.16", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 412 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "9": "1", + "index": 413 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "5": "63.95", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 414 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "9": "1", + "index": 415 + }, + { + "0": "D1119E3D-720D-46A4-9772-C456EA3B0D4D", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:46:16", + "9": "1", + "index": 416 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 417 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "9": "1", + "index": 418 + }, + { + "0": "B3FFE8F1-6D4D-49FF-9DC6-97E3F78B18E1", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:49:50", + "9": "1", + "index": 419 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "5": "129.34", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 420 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "9": "1", + "index": 421 + }, + { + "0": "4B1F2669-E141-4218-8048-95E751DCF8F1", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:54:20", + "9": "1", + "index": 422 + }, + { + "0": "87FD50BB-5621-4778-9CBF-604522DDC605", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:36:43", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 423 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 424 + }, + { + "0": "7C8DB972-42E3-4C98-B13B-C338C0714D3F", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:55:32", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 425 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "9": "1", + "index": 426 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "9": "1", + "index": 427 + }, + { + "0": "A23C51AD-50BC-4719-B489-A29643BB3C74", + "1": "A1829582519835540", + "2": "59.99", + "3": "4.0", + "4": "2023-02-17 11:20:25", + "9": "1", + "index": 428 + }, + { + "0": "2589C5DD-012D-429C-A3C1-8333C3ECE2A4", + "1": "A1829582519835540", + "2": "59.99", + "3": "5.0", + "4": "2023-02-17 11:22:08", + "9": "1", + "index": 429 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 430 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 431 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "9": "1", + "index": 432 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "5": "239.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 433 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "9": "1", + "index": 434 + }, + { + "0": "56176B76-FFD4-4252-8BAD-C8F0E105EE2E", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 11:52:43", + "9": "1", + "index": 435 + }, + { + "0": "0B666A57-4CBF-411F-A855-A7B615726FED", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:11:06", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 436 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 437 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "9": "1", + "index": 438 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 439 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "9": "1", + "index": 440 + }, + { + "0": "F815E0BF-EDEA-40BF-9CA7-E529C895BA5E", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:24:44", + "9": "1", + "index": 441 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 442 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "9": "1", + "index": 443 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 444 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "9": "1", + "index": 445 + }, + { + "0": "93796897-06CD-4111-8F2D-E27D5CE46B66", + "1": "A844427218518467", + "2": "157.94", + "3": "18.0", + "4": "2023-02-17 23:30:32", + "9": "1", + "index": 446 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "5": "157.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 447 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "9": "1", + "index": 448 + }, + { + "0": "F461D35F-457F-40E7-BF42-4C116CF0D921", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:48:49", + "9": "1", + "index": 449 + }, + { + "0": "6645E186-2EE1-4F51-883A-7C4333C753C3", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 22:08:38", + "9": "1", + "index": 450 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 451 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "9": "1", + "index": 452 + }, + { + "0": "8B634588-BDD1-4B61-B2C0-00A24CD77D7B", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:07:01", + "9": "1", + "index": 453 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 454 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "9": "1", + "index": 455 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "5": "163.16", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 456 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "9": "1", + "index": 457 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 458 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "9": "1", + "index": 459 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "5": "301.26", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 460 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "9": "1", + "index": 461 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 462 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "9": "1", + "index": 463 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "5": "80.92", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 464 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "9": "1", + "index": 465 + }, + { + "0": "2C8A9E18-E28E-4555-B5F9-98F0D34FCEAE", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:48:28", + "9": "1", + "index": 466 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 467 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "9": "1", + "index": 468 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 469 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "9": "1", + "index": 470 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 471 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "9": "1", + "index": 472 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "5": "156.792046", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 473 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "9": "1", + "index": 474 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 475 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "9": "1", + "index": 476 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 477 + }, + { + "0": "EA8C66F4-8916-4822-85FA-583C2186501A", + "1": "A985156821621035", + "2": "152.03", + "3": "21.0", + "4": "2023-02-22 05:05:07", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 478 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "9": "1", + "index": 479 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "5": "233.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 480 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "9": "1", + "index": 481 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 482 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "9": "1", + "index": 483 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "5": "85.59", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 484 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "9": "1", + "index": 485 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "5": "973.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 486 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "9": "1", + "index": 487 + }, + { + "0": "35AC8DA0-24ED-4461-B732-7994EAC7AD2C", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:23:47", + "9": "1", + "index": 488 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 489 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "9": "1", + "index": 490 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "5": "656.95233", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 491 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "9": "1", + "index": 492 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "5": "1091.15", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 493 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "9": "1", + "index": 494 + }, + { + "0": "4A729E60-7E0A-4080-88C8-A81656F18A24", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:49:26", + "9": "1", + "index": 495 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 496 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "9": "1", + "index": 497 + }, + { + "0": "18C1A371-128D-4C3E-BFA3-AD8A96C5A26E", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:23:32", + "9": "1", + "index": 498 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "5": "228.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 499 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "9": "1", + "index": 500 + }, + { + "0": "A02AA3CD-C055-4B0D-93B3-5D84CFDED0D7", + "1": "A1759222251254350", + "2": "516.24", + "3": "12.0", + "4": "2023-02-21 17:46:31", + "9": "1", + "index": 501 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "5": "514.107929", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 502 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "9": "1", + "index": 503 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 504 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "9": "1", + "index": 505 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 506 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "9": "1", + "index": 507 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "5": "21.71", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 508 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "9": "1", + "index": 509 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 510 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "9": "1", + "index": 511 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 512 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "9": "1", + "index": 513 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "9": "1", + "index": 514 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "9": "1", + "index": 515 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "9": "1", + "index": 516 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "9": "1", + "index": 517 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "9": "1", + "index": 518 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "9": "1", + "index": 519 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "9": "1", + "index": 520 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "9": "1", + "index": 521 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "9": "1", + "index": 522 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "9": "1", + "index": 523 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "9": "1", + "index": 524 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "9": "1", + "index": 525 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "9": "1", + "index": 526 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "9": "1", + "index": 527 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "9": "1", + "index": 528 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "9": "1", + "index": 529 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "9": "1", + "index": 530 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "9": "1", + "index": 531 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "9": "1", + "index": 532 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "9": "1", + "index": 533 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "9": "1", + "index": 534 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "9": "1", + "index": 535 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "9": "1", + "index": 536 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "9": "1", + "index": 537 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "9": "1", + "index": 538 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "9": "1", + "index": 539 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "9": "1", + "index": 540 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "9": "1", + "index": 541 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "9": "1", + "index": 542 + }, + { + "0": "42FC2159-6C83-4CBE-A323-DE9E0546A311", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:34:38", + "9": "1", + "index": 543 + }, + { + "0": "5CAB8F98-F87D-4FB5-8647-F83EF559A9E7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:22", + "9": "1", + "index": 544 + }, + { + "0": "8FBB1DE1-60CE-4F82-A2E8-8CBAB946FED7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:19:02", + "9": "1", + "index": 545 + }, + { + "0": "6EB304F3-0D0F-4767-BFBB-2ACD515CAA42", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:37:35", + "9": "1", + "index": 546 + }, + { + "0": "33615076-74BA-414F-A51C-470C5AFD1FD7", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:37", + "9": "1", + "index": 547 + }, + { + "0": "A6FD29AF-1C86-4558-8D18-89D7F53EC691", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:54", + "9": "1", + "index": 548 + }, + { + "0": "4A4AF956-41C3-4723-8BAD-527243728FE8", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:54", + "9": "1", + "index": 549 + }, + { + "0": "FFF0CCE8-07E1-4100-9491-2853222482EF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:44:10", + "9": "1", + "index": 550 + }, + { + "0": "8DDECA4B-95EF-4FAD-8781-99F8134532FF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:51", + "9": "1", + "index": 551 + }, + { + "0": "E498A57D-E5CF-4883-932E-6B39D7CFF7A0", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:38:18", + "9": "1", + "index": 552 + }, + { + "0": "6DA73B9F-D74B-45A7-82F7-FD10B2840483", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:18", + "9": "1", + "index": 553 + }, + { + "0": "C4F7FAB1-FE05-4F4D-8E52-8C6A3EE96115", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:10", + "9": "1", + "index": 554 + }, + { + "0": "F0A25208-F9BB-401D-A840-36823FB1B0A8", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:34:16", + "9": "1", + "index": 555 + }, + { + "0": "E8CA30F7-3805-48E0-A5E6-6FD71ACF2BE2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:11:36", + "9": "1", + "index": 556 + }, + { + "0": "947519EE-C2DE-42CC-A5CA-B075AEEA05D3", + "1": "A844427390246047", + "2": "5.39", + "3": "22.0", + "4": "2023-02-26 03:30:51", + "9": "1", + "index": 557 + }, + { + "0": "0DF72AD1-2DFD-404E-88A8-965334D9F227", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:38:07", + "9": "1", + "index": 558 + }, + { + "0": "B44556BB-1C72-4B05-B89B-8B078FE110FC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:46", + "9": "1", + "index": 559 + }, + { + "0": "17DA4A53-7EDF-4FE4-A997-3C9AF9255294", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:04", + "9": "1", + "index": 560 + }, + { + "0": "4AD79610-DF94-40EA-AA57-0D0C4C107950", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:19", + "9": "1", + "index": 561 + }, + { + "0": "D2155FC9-8E47-46A6-B8F3-1395DECE7D82", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:35:07", + "9": "1", + "index": 562 + }, + { + "0": "C869ECF0-2A2F-4898-BC65-AD6422144BA5", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:17:22", + "9": "1", + "index": 563 + }, + { + "0": "D1C8D053-633E-457E-AAE3-2CC1801EC80B", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:22:13", + "9": "1", + "index": 564 + }, + { + "0": "411DF6C0-02DE-4D70-977B-EF261BF1D4A1", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:43:06", + "9": "1", + "index": 565 + }, + { + "0": "7E42BCAB-5590-41AD-A18E-8964C2D9CDAA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:38", + "9": "1", + "index": 566 + }, + { + "0": "10F2E1BB-B84B-425E-9CF4-1E9A6AB041D8", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:28:28", + "9": "1", + "index": 567 + }, + { + "0": "CCA3EB41-5AB7-4C77-AFD0-BC552C95E019", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:30", + "9": "1", + "index": 568 + }, + { + "0": "5C9ABE6A-E977-4767-BCC8-A9A0952DB43A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:19:49", + "9": "1", + "index": 569 + }, + { + "0": "1731D105-5F5C-4CEE-955B-AD9B4372603D", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:32:27", + "9": "1", + "index": 570 + }, + { + "0": "CDD70229-CFCE-4192-829D-980CC5F0AD96", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:30:20", + "9": "1", + "index": 571 + }, + { + "0": "69A8BDFE-9310-4098-B8E9-D5C0D938E851", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:43:02", + "9": "1", + "index": 572 + }, + { + "0": "1E8F78CA-543C-46F5-A429-593B1B48D8E9", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:02", + "9": "1", + "index": 573 + }, + { + "0": "06CF9747-053E-4361-8048-CD6D0F16812C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:31", + "9": "1", + "index": 574 + }, + { + "0": "9606F304-48F8-47E9-A666-2BD97690632F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:47", + "9": "1", + "index": 575 + }, + { + "0": "A7FC7EAE-BB1E-4E93-8BFE-E9C1B71792AB", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:49", + "9": "1", + "index": 576 + }, + { + "0": "086FDEAF-BF57-4B51-93F4-169E3609D287", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:44", + "9": "1", + "index": 577 + }, + { + "0": "C54EC40B-86FC-497A-A701-8FBDE5A2375D", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:08:37", + "9": "1", + "index": 578 + }, + { + "0": "D797769A-8A65-47DF-8473-35A29AC81B24", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:15:33", + "9": "1", + "index": 579 + }, + { + "0": "7B14E6C6-F218-4C61-A29A-B3157D7A0E4A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:55", + "9": "1", + "index": 580 + }, + { + "0": "9E41C0F4-5345-4439-B996-52841214F9FE", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:15", + "9": "1", + "index": 581 + }, + { + "0": "7F6AEAAA-ED61-4163-8C5E-289FB74045B4", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:23", + "9": "1", + "index": 582 + }, + { + "0": "D81F2077-E5A4-4DCC-85CB-5D37243F3386", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:53:36", + "9": "1", + "index": 583 + }, + { + "0": "47E230FD-DD71-432D-8EDA-F6F721A0611B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:09", + "9": "1", + "index": 584 + }, + { + "0": "70A54CA5-D32A-4DB1-8F56-B406D827A7B7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:08:34", + "9": "1", + "index": 585 + }, + { + "0": "A76875A6-59E2-4D02-8FF1-48EADE6B83A7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:00:13", + "9": "1", + "index": 586 + }, + { + "0": "FB41B881-4D5F-4357-9363-35FB4856F4B6", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:37", + "9": "1", + "index": 587 + }, + { + "0": "8454CEA5-B059-4E44-8ADE-100460ED0992", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:24", + "9": "1", + "index": 588 + }, + { + "0": "B94780BA-6067-4DAD-AA2A-BACE10FA26EA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:55:42", + "9": "1", + "index": 589 + }, + { + "0": "0550F138-938B-4710-83ED-00EC64D186E3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:04:17", + "9": "1", + "index": 590 + }, + { + "0": "2E0F3E5F-83E2-4414-8D46-00367E4279AD", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:41:39", + "9": "1", + "index": 591 + }, + { + "0": "910E41CD-FF30-4CFB-80F2-9799BDC60C48", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:31:33", + "9": "1", + "index": 592 + }, + { + "0": "9BC1E2D0-E438-4343-B319-212B06186B71", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:01", + "9": "1", + "index": 593 + }, + { + "0": "6A4D6552-8D68-49DA-8B16-D5094B3ED747", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:35:26", + "9": "1", + "index": 594 + }, + { + "0": "88CFD0B0-2A86-4BD2-9CED-4F37E1E9DFFE", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:21:26", + "9": "1", + "index": 595 + }, + { + "0": "3BDC3741-807B-447D-9A8D-9396CB1519BA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:16:10", + "9": "1", + "index": 596 + }, + { + "0": "6867FF41-D687-4B12-B2D2-A7B54F3728B9", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:52", + "9": "1", + "index": 597 + }, + { + "0": "21EB96F0-6C2C-4168-BEEA-A253EE75FE7B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:10", + "9": "1", + "index": 598 + }, + { + "0": "051BDF69-D526-4951-A7E0-9A933A9899FF", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:16:57", + "9": "1", + "index": 599 + }, + { + "0": "A53C943B-A88C-4EB6-9A34-C386E9E8879C", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:53", + "9": "1", + "index": 600 + }, + { + "0": "1580B155-E0E0-40CB-841D-E2A5D2DB0E7E", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:57:02", + "9": "1", + "index": 601 + }, + { + "0": "E8E24E34-5D81-4891-BACF-7CD208CD56D4", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:09:15", + "9": "1", + "index": 602 + }, + { + "0": "1ECF8464-01D3-40DC-AC34-DC665D7839C4", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:14:50", + "9": "1", + "index": 603 + }, + { + "0": "D43FE025-6D1B-4FE0-8E42-BC3E95A76823", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:52", + "9": "1", + "index": 604 + }, + { + "0": "128EAA6F-8869-498D-8ADD-990F268B7F4D", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:35:59", + "9": "1", + "index": 605 + }, + { + "0": "D024ED6A-545B-44B2-827E-D7B9D98C592D", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:23", + "9": "1", + "index": 606 + }, + { + "0": "CFE1CF54-83D2-4396-88F9-7F0E7C2ED586", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:16", + "9": "1", + "index": 607 + }, + { + "0": "A06EBEB4-92ED-4F42-8211-F28EC67E5DF5", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:18:42", + "9": "1", + "index": 608 + }, + { + "0": "2D6EB785-22EC-4879-82A2-C643810EA7C1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:18:56", + "9": "1", + "index": 609 + }, + { + "0": "9C4E2317-10BB-4BDE-AE2F-09EA29B0FD8A", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:14", + "9": "1", + "index": 610 + }, + { + "0": "0A282803-01E1-4193-B72A-F135B850DCB5", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:32:12", + "9": "1", + "index": 611 + }, + { + "0": "1504CCD5-386C-4201-8362-D235C13D93AC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:07:35", + "9": "1", + "index": 612 + }, + { + "0": "547D4C95-528D-46FC-A5A5-FA307B44A329", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:16:20", + "9": "1", + "index": 613 + }, + { + "0": "A5DA7BE5-A6BA-492B-B43E-588713661CDE", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:32", + "9": "1", + "index": 614 + }, + { + "0": "209685D0-27D7-42CE-A3A2-24F643DD387F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:17", + "9": "1", + "index": 615 + }, + { + "0": "5ABD00A4-C232-4D58-8A78-63ABE223F182", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:58", + "9": "1", + "index": 616 + }, + { + "0": "460FA98A-658B-4543-BBC0-EFBFCD7436FD", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:07", + "9": "1", + "index": 617 + }, + { + "0": "A440EC4D-B52B-4F0E-949A-EB6699D67175", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:54", + "9": "1", + "index": 618 + }, + { + "0": "03D4C75E-6EE7-421E-85F5-BD0BF2158BD4", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:33:21", + "9": "1", + "index": 619 + }, + { + "0": "29140357-C78E-4066-9BE5-CB7D5364BBD0", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:56", + "9": "1", + "index": 620 + }, + { + "0": "3F889B35-49FC-47BC-9E5E-2DF06FA12290", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:01", + "9": "1", + "index": 621 + }, + { + "0": "3C38413D-BA5E-4F68-9CE5-BAF48E13DE3C", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:21:29", + "9": "1", + "index": 622 + }, + { + "0": "4560AC71-6EB0-4590-8C1D-F39E8C2B743A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:57", + "9": "1", + "index": 623 + }, + { + "0": "1DA8653D-7E02-48A4-AECA-CF30E3784FD3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:40", + "9": "1", + "index": 624 + }, + { + "0": "566C00BC-EB37-41D8-9202-CCAC36616EB0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:43:37", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 625 + }, + { + "0": "0EB011D9-CAF2-4A02-8ACF-03895BE44128", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:53:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 626 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 627 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 628 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 629 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 630 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 631 + }, + { + "0": "2104E85A-B76B-419E-8204-3EAB76C7D122", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:11:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 632 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 633 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 634 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 635 + }, + { + "0": "D74EFAAF-1FCC-4F41-AB01-317001E86EF1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 19:42:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 636 + }, + { + "0": "01CE8E80-F8C6-4EA6-92A5-4D3077CE9449", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:06:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 637 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 638 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 639 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 640 + }, + { + "0": "5EE5C089-EEC1-40F9-B997-D8EA4BDA79C1", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:19:40", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 641 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 642 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 643 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 644 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 645 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 646 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 647 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 648 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 649 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 650 + }, + { + "0": "EA452A8D-BA16-42A9-BC9E-D2A1ECE62675", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:13:51", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 651 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 652 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 653 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 654 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 655 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 656 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 657 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 658 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 659 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 660 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 661 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "9": "1", + "index": 662 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 663 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "9": "1", + "index": 664 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "5": "1200.68", + "6": "false", + "7": "1.0", + "8": "2.0", + "9": "1", + "index": 665 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "9": "1", + "index": 666 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 667 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "9": "1", + "index": 668 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "9": "1", + "index": 669 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "9": "1", + "index": 670 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 671 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 672 + }, + { + "0": "3BBA55DF-FAE7-4F71-A7E9-2CE883BE50C2", + "1": "A985156290472668", + "2": "5.34", + "3": "8.0", + "4": "2023-02-27 15:11:10", + "5": "5.34", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 673 + }, + { + "0": "7CD9A9C3-3CE1-49B9-8299-039B7955F0F4", + "1": "A985156290472668", + "2": "5.34", + "3": "17.0", + "4": "2023-02-27 22:55:15", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 674 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 675 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "9": "1", + "index": 676 + }, + { + "0": "2E8C3C5B-4ECB-451D-8F50-BD946950FAC4", + "1": "A1899945509487400", + "2": "5.4", + "3": "20.0", + "4": "2023-02-26 02:50:39", + "9": "1", + "index": 677 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "5": "10.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 678 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "9": "1", + "index": 679 + }, + { + "0": "13CC7673-A59D-45CF-8287-2B4E8EE05396", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:46:49", + "9": "1", + "index": 680 + }, + { + "0": "770A0525-2D27-4173-B6BF-A5EA905162DC", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:47:43", + "9": "1", + "index": 681 + }, + { + "0": "CEA84E44-9194-48A0-A5F7-5BFA43E671BF", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:44:44", + "9": "1", + "index": 682 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 683 + }, + { + "0": "25C5DCA0-AACA-4FF2-870E-7A08EC230EF6", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:51:23", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 684 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "9": "1", + "index": 685 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "9": "1", + "index": 686 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "9": "1", + "index": 687 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "9": "1", + "index": 688 + }, + { + "0": "996C6CB5-D9A8-4B88-A723-6A002E6B893F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:44:00", + "9": "1", + "index": 689 + }, + { + "0": "45775ADF-C0C1-4AB2-97A6-BEE6F012632F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:36:29", + "9": "1", + "index": 690 + }, + { + "0": "427FDE58-CA6D-4D48-B528-AD194856D115", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:02:10", + "9": "1", + "index": 691 + }, + { + "0": "5E74AE55-CFA6-4337-9B6B-CA9933D5A6D8", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:06:09", + "9": "1", + "index": 692 + }, + { + "0": "3FC40238-6110-46A6-BE38-CF80320791A1", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:28:41", + "9": "1", + "index": 693 + }, + { + "0": "D7BC1361-E730-4463-9DE7-2B9D92DB5A5B", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:13", + "9": "1", + "index": 694 + }, + { + "0": "441AEEE6-AAA6-40CB-9173-FBEF1C355ACC", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:46:27", + "9": "1", + "index": 695 + }, + { + "0": "9BE72279-7902-492D-9265-744491E4F86D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:16:50", + "9": "1", + "index": 696 + }, + { + "0": "0D43D3F2-A352-4700-8FEC-8E02EF44A514", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:45", + "9": "1", + "index": 697 + }, + { + "0": "D52E262C-77C6-4C20-B9FA-F5A408BED455", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:31:12", + "9": "1", + "index": 698 + }, + { + "0": "8C337F6E-E17F-4CDA-833A-CBEF20C65CF9", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:04:05", + "9": "1", + "index": 699 + }, + { + "0": "218C5731-A37A-4CBA-8D3B-EF20FF23DEAE", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:03", + "9": "1", + "index": 700 + }, + { + "0": "0FBA8C42-194E-4E18-85DB-D1FA1EB7C05D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:41:53", + "9": "1", + "index": 701 + }, + { + "0": "702CD93B-73B6-4F45-8FE8-7F83EC633AA0", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:12", + "9": "1", + "index": 702 + }, + { + "0": "216991DF-33A6-4090-90AA-3E09DDF390E4", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:48:52", + "9": "1", + "index": 703 + }, + { + "0": "B3B0727B-ADF3-4621-9DFC-D0C8CB6E6F26", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:41", + "9": "1", + "index": 704 + }, + { + "0": "66709ABD-6D12-456B-82D6-CBD25CFBE285", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:39:19", + "9": "1", + "index": 705 + }, + { + "0": "C187B038-E19A-46AA-A9E0-5BF87BAEE2C1", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:38:51", + "9": "1", + "index": 706 + }, + { + "0": "43BF9531-63BE-46A1-AA90-CFD08FEB3BBB", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:41:50", + "9": "1", + "index": 707 + }, + { + "0": "00746053-49FB-4681-8AAA-10388C1D59E2", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:15:52", + "9": "1", + "index": 708 + }, + { + "0": "A66793DD-03E4-4E15-9CDB-79EC4733C3CA", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:39:54", + "9": "1", + "index": 709 + }, + { + "0": "B49DBC29-4D81-4FEE-8B9F-44415FD7BC80", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:42:26", + "9": "1", + "index": 710 + }, + { + "0": "9E151E5A-C4BE-4AE6-A0F2-62320FD3FD14", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:49:39", + "9": "1", + "index": 711 + }, + { + "0": "96007AC1-F260-4648-97B6-3D3527611B1B", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:29:39", + "9": "1", + "index": 712 + }, + { + "0": "FF63B43E-F5B7-4CFD-81FD-AFBFE1BDDFA0", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:51:59", + "9": "1", + "index": 713 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 714 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 715 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 716 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 717 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "9": "1", + "index": 718 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 719 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "9": "1", + "index": 720 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "5": "104.7", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 721 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "9": "1", + "index": 722 + }, + { + "0": "903D435A-A4E4-489C-95E8-E97B11439B7C", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:19:19", + "9": "1", + "index": 723 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 724 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "9": "1", + "index": 725 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 726 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "9": "1", + "index": 727 + }, + { + "0": "6DCDA408-D527-4CC0-8ECD-BB1DD4C1B51B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:23:20", + "9": "1", + "index": 728 + }, + { + "0": "6DC4F5F7-598E-4782-9981-5466DF994D2B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:34:02", + "9": "1", + "index": 729 + }, + { + "0": "552F9E0D-5395-4995-9047-D71CD17F48CB", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:19:58", + "9": "1", + "index": 730 + }, + { + "0": "8C99CEBB-0BCA-4D2C-BEB7-09A627F46CDF", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:45:27", + "9": "1", + "index": 731 + }, + { + "0": "389398A4-D295-416A-91AE-E890749EFC58", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:30:28", + "9": "1", + "index": 732 + }, + { + "0": "FE374A34-0463-4D17-926A-7F697581AA35", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:24:44", + "9": "1", + "index": 733 + }, + { + "0": "E08DDC49-612E-4227-90CA-79EBCF477113", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-27 10:37:29", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 734 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 735 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "9": "1", + "index": 736 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "5": "793.8542", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 737 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "9": "1", + "index": 738 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 739 + }, + { + "0": "1D803FD7-051D-4D75-94DC-214FC9E55633", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:28:55", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 740 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "9": "1", + "index": 741 + }, + { + "0": "964F4854-0D2F-4852-BA0E-2FF1CAC93990", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:50:02", + "9": "1", + "index": 742 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "5": "240.45", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 743 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "9": "1", + "index": 744 + }, + { + "0": "69A49BAA-59B0-4AEC-AD40-EEE900AE308A", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 05:01:08", + "9": "1", + "index": 745 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "5": "424.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 746 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "9": "1", + "index": 747 + }, + { + "0": "36AD5A93-8DB0-4134-93EA-26D0A7EE8C3B", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:41:19", + "9": "1", + "index": 748 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 749 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "9": "1", + "index": 750 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "9": "1", + "index": 751 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 752 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 753 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "9": "1", + "index": 754 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 755 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "9": "1", + "index": 756 + }, + { + "0": "94BEE01F-8FA2-4685-9870-0172A53F3981", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:25:14", + "9": "1", + "index": 757 + }, + { + "0": "8F080C35-BA5C-41A5-8169-0EDBF1F27219", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:24:02", + "9": "1", + "index": 758 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 759 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "9": "1", + "index": 760 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 761 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "9": "1", + "index": 762 + }, + { + "0": "C365FB49-1531-4219-977D-CBA8CBEF8389", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:37:08", + "9": "1", + "index": 763 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 764 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "9": "1", + "index": 765 + }, + { + "0": "1CE81EB0-7399-41B6-8E55-79A52BBFE9AC", + "1": "A362221882887902", + "2": "0.0", + "4": "2023-03-06 18:07:51", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 766 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "5": "680.89", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 767 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "9": "1", + "index": 768 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 769 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "9": "1", + "index": 770 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 771 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "9": "1", + "index": 772 + }, + { + "0": "8D778823-BB51-4CA8-9CEC-84F4D48E035A", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:24:12", + "9": "1", + "index": 773 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 774 + }, + { + "0": "2193EA41-7C0E-442B-9A2A-A7E6F6CF6D0F", + "1": "A1899947010059410", + "2": "156450.0", + "3": "23.0", + "4": "2023-03-07 14:26:10", + "5": "1725.6435", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "0", + "index": 775 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "9": "1", + "index": 776 + }, + { + "0": "4BE98D88-C717-4C24-809B-1A92A1FFCEBC", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 15:02:16", + "9": "1", + "index": 777 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 778 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "9": "1", + "index": 779 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "5": "1307.65", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 780 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "9": "1", + "index": 781 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "5": "660.422", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 782 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "9": "1", + "index": 783 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 784 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "9": "1", + "index": 785 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 786 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "9": "1", + "index": 787 + }, + { + "0": "34E50410-3939-4466-BCE5-6207661FAF5C", + "1": "A1899946865208980", + "2": "73080.0", + "3": "0.0", + "4": "2023-03-09 16:20:26", + "9": "1", + "index": 788 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 789 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "9": "1", + "index": 790 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "5": "51.24", + "6": "false", + "7": "1.0", + "8": "3.0", + "9": "1", + "index": 791 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "9": "1", + "index": 792 + }, + { + "0": "9F442404-8F9E-45E0-8A10-D5B4C0B3A36A", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:47:03", + "9": "1", + "index": 793 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 794 + }, + { + "0": "A5343E7D-5553-4F25-B916-E18FE75CF2AC", + "1": "A1688853516414440", + "2": "125580.0", + "3": "0.0", + "4": "2023-03-10 15:51:52", + "5": "1385.1474", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 795 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "9": "1", + "index": 796 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "5": "519.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 797 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "9": "1", + "index": 798 + }, + { + "0": "3E6BEDBD-7B2A-40CF-87FC-AE161EA47713", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:57:49", + "9": "1", + "index": 799 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 800 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "9": "1", + "index": 801 + }, + { + "0": "0B787893-9340-4DE8-9CEF-AFFCD6BB8AB0", + "1": "A914800689334401", + "2": "109.99", + "3": "10.0", + "4": "2023-03-04 18:46:15", + "9": "1", + "index": 802 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 803 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "9": "1", + "index": 804 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "5": "103.48965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 805 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "9": "1", + "index": 806 + }, + { + "0": "D3507A5B-38A9-40F9-B992-DB1547B281C9", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:45:45", + "9": "1", + "index": 807 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 808 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "9": "1", + "index": 809 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "9": "1", + "index": 810 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 811 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 812 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "9": "1", + "index": 813 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 814 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "9": "1", + "index": 815 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "5": "403.0362", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 816 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "9": "1", + "index": 817 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "5": "752.68", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 818 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "9": "1", + "index": 819 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "5": "226.95", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 820 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "9": "1", + "index": 821 + }, + { + "0": "E87F43AB-36CC-481F-A7CB-E5F9C1B08F57", + "1": "A1899947009495620", + "2": "62580.0", + "3": "10.0", + "4": "2023-03-13 02:18:34", + "9": "1", + "index": 822 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 823 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "9": "1", + "index": 824 + }, + { + "0": "C2AE42D7-53F6-424F-8470-4B2EF42612EB", + "1": "A1688853662168790", + "2": "62580.0", + "3": "12.0", + "4": "2023-03-13 04:19:44", + "9": "1", + "index": 825 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 826 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "9": "1", + "index": 827 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "5": "152.94", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 828 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "9": "1", + "index": 829 + }, + { + "0": "14EF7AD5-A3AA-4E9E-B377-74A47CDC2785", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:58:58", + "9": "1", + "index": 830 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "5": "839.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 831 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "9": "1", + "index": 832 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "5": "593.58", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 833 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "9": "1", + "index": 834 + }, + { + "0": "1AE19EA1-54DF-4E2A-889F-E47C3AFE65AF", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:11:13", + "9": "1", + "index": 835 + }, + { + "0": "8717C0FD-51C1-4457-BABB-D356176DDF24", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:09:53", + "9": "1", + "index": 836 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 837 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "9": "1", + "index": 838 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 839 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "9": "1", + "index": 840 + }, + { + "0": "57E282C4-3F49-485B-B5B8-CACAEEF05078", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:47:32", + "9": "1", + "index": 841 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 842 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "9": "1", + "index": 843 + }, + { + "0": "A541504B-98D3-492E-89A4-994617EFA9CA", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:58:56", + "9": "1", + "index": 844 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 845 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "9": "1", + "index": 846 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 847 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "9": "1", + "index": 848 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "5": "210.99", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 849 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "9": "1", + "index": 850 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 851 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "9": "1", + "index": 852 + }, + { + "0": "0F4F57CC-5436-4377-9B91-B6C7D0CC67E8", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:35:53", + "9": "1", + "index": 853 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "5": "614.195251", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 854 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "9": "1", + "index": 855 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "5": "112.30134", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 856 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "9": "1", + "index": 857 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 858 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "9": "1", + "index": 859 + }, + { + "0": "47A9F4BA-03C8-4900-BEF0-BADCF3C21D99", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:19:14", + "9": "1", + "index": 860 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 861 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "9": "1", + "index": 862 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 863 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "9": "1", + "index": 864 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "5": "211.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 865 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "9": "1", + "index": 866 + }, + { + "0": "16346EB5-B1D7-438D-8F50-E46ADB6AEE9A", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:31:16", + "9": "1", + "index": 867 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 868 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "9": "1", + "index": 869 + }, + { + "0": "FFCA8791-18C3-4C81-9D89-1250936E41E1", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:04:04", + "9": "1", + "index": 870 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "5": "147.83", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 871 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "9": "1", + "index": 872 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 873 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "9": "1", + "index": 874 + }, + { + "0": "241DBB1D-3092-4FCE-A4A5-00219ECD6C99", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:35:42", + "9": "1", + "index": 875 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 876 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "9": "1", + "index": 877 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "5": "75.76", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 878 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "9": "1", + "index": 879 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 880 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "9": "1", + "index": 881 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 882 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "9": "1", + "index": 883 + }, + { + "0": "92EA085E-FD70-425B-80EB-4513BFBA8AF1", + "1": "A985157038112964", + "2": "150.14", + "3": "22.0", + "4": "2023-03-26 03:25:46", + "9": "1", + "index": 884 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "5": "150.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 885 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "9": "1", + "index": 886 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 887 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "9": "1", + "index": 888 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "5": "1132.3531", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 889 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "9": "1", + "index": 890 + }, + { + "0": "138D8A92-4C50-4A5F-BA5B-7E6517F3B0B9", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:48:08", + "9": "1", + "index": 891 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 892 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "9": "1", + "index": 893 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "5": "2264.7062", + "6": "true", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 894 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "9": "1", + "index": 895 + }, + { + "0": "237AD504-9222-4DAF-BBB9-5C86C4A0DF90", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:57:24", + "9": "1", + "index": 896 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "5": "260.370211", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 897 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "9": "1", + "index": 898 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "5": "159.0", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 899 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "9": "1", + "index": 900 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "9": "1", + "index": 901 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 902 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 903 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "9": "1", + "index": 904 + }, + { + "0": "A44E3875-069E-472A-B3FB-5ADC3A7CDF66", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:51:16", + "9": "1", + "index": 905 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "5": "285.167374", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 906 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "9": "1", + "index": 907 + }, + { + "0": "D6AE2567-ECC7-46FF-8389-BCF43C8A81D4", + "1": "A1055521435373420", + "2": "278.88", + "3": "0.0", + "4": "2023-03-30 06:20:02", + "9": "1", + "index": 908 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 909 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "9": "1", + "index": 910 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "5": "155.03704199999999", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 911 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "9": "1", + "index": 912 + }, + { + "0": "87726A9D-DF55-4685-82A1-5D4F9E022F5A", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:30:46", + "9": "1", + "index": 913 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "5": "145.347227", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 914 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "9": "1", + "index": 915 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "5": "405.099999", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 916 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "9": "1", + "index": 917 + }, + { + "0": "E4BE3429-CFC8-44D0-B48F-BCD7D875D0E9", + "1": "A1759222229520370", + "2": "599.0", + "3": "23.0", + "4": "2023-01-03 14:02:57", + "9": "1", + "index": 918 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "5": "176.66415", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 919 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "9": "1", + "index": 920 + }, + { + "0": "979DF1CE-FE47-47FE-A8ED-ED1119F41065", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:03:58", + "9": "1", + "index": 921 + }, + { + "0": "E9D60DF2-0E4B-4396-A84B-A0B9E88B3B63", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:02:50", + "9": "1", + "index": 922 + }, + { + "0": "F178386E-86A3-4F08-B9B0-6778898CAD4E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:56:06", + "9": "1", + "index": 923 + }, + { + "0": "2D228D45-7E38-45CF-BD23-8D4F3445FFF8", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:52:56", + "9": "1", + "index": 924 + }, + { + "0": "3FB022CD-5FEE-43CE-A742-F25EFC9F48DF", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:06:11", + "9": "1", + "index": 925 + }, + { + "0": "ABE168A6-3636-4202-9389-95E44E65881E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:14:56", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 926 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 927 + }, + { + "0": "169212AC-3DBA-4EA6-A5AE-031C407DC3AA", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:00:28", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 928 + }, + { + "0": "C4F83897-54F9-4208-987E-DDE9D20F0B4B", + "1": "A1688853657869890", + "2": "52.99", + "3": "11.0", + "4": "2023-01-03 17:27:59", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 929 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "9": "1", + "index": 930 + }, + { + "0": "783D965E-660F-4591-8AB5-3F3327E0B8AB", + "1": "A1759222095873190", + "2": "160.47", + "3": "11.0", + "4": "2023-01-03 17:41:15", + "9": "1", + "index": 931 + }, + { + "0": "DD2D73FD-7DAF-49A5-AC4A-47117E6DE03C", + "1": "A1759222095873190", + "2": "53.49", + "3": "11.0", + "4": "2023-01-03 17:37:53", + "9": "1", + "index": 932 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "5": "106.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 933 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "9": "1", + "index": 934 + }, + { + "0": "ADB8EB04-9D65-43A5-9CF1-5F86D904FC18", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:59:06", + "9": "1", + "index": 935 + }, + { + "0": "636DA8EE-8D04-49D9-9BFE-21FAE9991FE6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:57:29", + "9": "1", + "index": 936 + }, + { + "0": "FE12EF10-2C8B-4F97-8D72-8CA106A2FDB6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:56:12", + "9": "1", + "index": 937 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "5": "64.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 938 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "9": "1", + "index": 939 + }, + { + "0": "EE72DD0F-F132-4E86-9CC5-9FB6386668A0", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:41:24", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 940 + }, + { + "0": "DE94FF49-79D4-417C-87B2-6682EC4AA382", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:38:47", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 941 + }, + { + "0": "415F4169-0DE1-4D1D-B056-823D02BFEDF6", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:51:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 942 + }, + { + "0": "9B5ACCF3-D278-48E9-867E-6027988CEA01", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:24:33", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 943 + }, + { + "0": "B352C087-14C9-4B8A-B239-0C4D861AF091", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:45:31", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 944 + }, + { + "0": "CB9D1331-694E-46E6-8A0A-0C16404FD315", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:46:26", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 945 + }, + { + "0": "8B065D0D-9FBB-4815-B341-DDA432223550", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:35:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 946 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 947 + }, + { + "0": "C1399C61-74D6-40B3-8289-AC99FAFF4988", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:36:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 948 + }, + { + "0": "76770317-5FD5-4C96-B77B-43BE377FDC6D", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:48:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 949 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "9": "1", + "index": 950 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "5": "54.26", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 951 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "9": "1", + "index": 952 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 953 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "9": "1", + "index": 954 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 955 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "9": "1", + "index": 956 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "5": "26.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 957 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "9": "1", + "index": 958 + }, + { + "0": "84633227-12F0-4157-AEA8-4F844146BC47", + "1": "A985156984009293", + "2": "15.85", + "3": "9.0", + "4": "2023-01-06 17:45:55", + "9": "1", + "index": 959 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "5": "127.19", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 960 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "9": "1", + "index": 961 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "5": "63.89", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 962 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "9": "1", + "index": 963 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 964 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "9": "1", + "index": 965 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 966 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "9": "1", + "index": 967 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "5": "107.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 968 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "9": "1", + "index": 969 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 970 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "9": "1", + "index": 971 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "5": "137.3", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "1", + "index": 972 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "9": "1", + "index": 973 + }, + { + "0": "10B457AE-179C-457B-90BA-1A0E6D8F5143", + "1": "A1055521388773990", + "2": "119.06", + "3": "20.0", + "4": "2023-01-15 02:43:22", + "9": "1", + "index": 974 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "5": "108.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 975 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "9": "1", + "index": 976 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "5": "942.0987220000001", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 977 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "9": "1", + "index": 978 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "5": "299.21525099999997", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 979 + }, + { + "0": "50C46472-B928-49BF-82E2-D1BE1C9DBCF4", + "1": "A1899946943634320", + "2": "149.99", + "3": "12.0", + "4": "2023-01-15 12:57:30", + "5": "236.21925099999999", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 980 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "9": "1", + "index": 981 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 982 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "9": "1", + "index": 983 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "9": "1", + "index": 984 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 985 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 986 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "9": "1", + "index": 987 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 988 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "9": "1", + "index": 989 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "5": "210.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 990 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "9": "1", + "index": 991 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "5": "786.607837", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 992 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "9": "1", + "index": 993 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "5": "212.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 994 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "9": "1", + "index": 995 + }, + { + "0": "CDAFFE95-3687-4886-9668-96EB7645063F", + "1": "A1829582586398540", + "2": "786.79", + "3": "10.0", + "4": "2023-01-20 09:25:50", + "9": "1", + "index": 996 + }, + { + "0": "F70F7BCA-6F5F-4C6C-BEE4-6C92B53E5816", + "1": "A1829582586398540", + "2": "587.0", + "3": "21.0", + "4": "2023-02-03 21:10:03", + "9": "1", + "index": 997 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "5": "160.3882", + "6": "false", + "7": "1.0", + "8": "4.0", + "9": "1", + "index": 998 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "9": "1", + "index": 999 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 1000 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "double" + }, + { + "key": "3", + "name": "localHour", + "type": "double" + }, + { + "key": "4", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "5", + "name": "transactionAmountUSD", + "type": "double" + }, + { + "key": "6", + "name": "isProxyIP", + "type": "boolean" + }, + { + "key": "7", + "name": "digitalItemCount", + "type": "double" + }, + { + "key": "8", + "name": "physicalItemCount", + "type": "double" + }, + { + "key": "9", + "name": "is_fraud", + "type": "bigint" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "9fda5059-6690-4824-b046-65b0bc5200f7": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "b0d8adc2-6afe-4885-b7b7-16b848b1963d": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "c0a11e0c-a519-42e8-97ba-b6e93158618f": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "c61ce34d-056f-4888-8503-adab9ddd80e5": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "ce937247-4296-470e-abc4-d6657a6805a1": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "d52ede7f-b284-4e8b-bf53-cce6cd9fba61": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "count", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "B1E2828A-4A9A-43EF-BFCB-1BF8FEA572A3", + "1": "A1055520426549020", + "2": "299.0", + "3": "AUD", + "4": "21.0", + "6": "119.17", + "7": "312.55965", + "9": "A", + "10": "P", + "13": "victoria", + "14": "3000", + "15": "au", + "16": "false", + "18": "en-AU", + "19": "CREDITCARD", + "20": "VISA", + "24": "2000", + "25": "New South Wales", + "26": "AU", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=5,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=3,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=44,SECOND=2,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 1 + }, + { + "0": "D57798E0-22FC-420B-9E77-6A5D29A44D2C", + "1": "A1055520427215940", + "2": "139.09", + "3": "USD", + "4": "14.0", + "6": "67.19", + "7": "139.09", + "9": "A", + "10": "P", + "13": "florida", + "14": "32204", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "MC", + "24": "31411", + "25": "GA", + "26": "US", + "33": "M", + "35": "0.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=11,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=7,HOUR_OF_DAY=19,MINUTE=54,SECOND=55,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 2 + }, + { + "0": "E5C8E826-C06A-4C21-B2EF-654C558E3525", + "1": "A1055520427375210", + "2": "14.99", + "3": "USD", + "4": "9.0", + "6": "135.245", + "7": "14.99", + "9": "A", + "10": "P", + "13": "georgia", + "14": "30309", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "60532", + "25": "IL", + "26": "US", + "33": "M", + "35": "1.0", + "36": "0.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=1,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=27,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=2,HOUR_OF_DAY=14,MINUTE=45,SECOND=5,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 3 + }, + { + "0": "6F951FE2-1EA9-4E52-87CF-E0395107B3DA", + "1": "A1055520427377310", + "2": "381.8", + "3": "USD", + "4": "21.0", + "6": "99.33", + "7": "381.8", + "9": "A", + "10": "P", + "13": "connecticut", + "14": "6854", + "15": "us", + "16": "false", + "18": "en-US", + "19": "CREDITCARD", + "20": "VISA", + "24": "6850", + "25": "CT", + "26": "US", + "33": "M", + "35": "1.0", + "36": "1.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=10,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=2,HOUR_OF_DAY=2,MINUTE=19,SECOND=49,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 4 + }, + { + "0": "936E2FF7-2171-44CC-9E43-3C4FF3B06519", + "1": "A1055520427478840", + "2": "699.47", + "3": "SEK", + "6": "217.12400000000002", + "7": "109.606949", + "9": "A", + "10": "P", + "13": "madrid", + "14": "28001", + "15": "es", + "16": "false", + "18": "sv-SE", + "19": "CREDITCARD", + "20": "VISA", + "24": "192 71", + "26": "SE", + "33": "M", + "35": "0.0", + "36": "2.0", + "38": "0", + "39": "java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id=\"Etc/UTC\",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2023,MONTH=2,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=49,SECOND=36,MILLISECOND=0,ZONE_OFFSET=?,DST_OFFSET=?]", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "string" + }, + { + "key": "3", + "name": "transactionCurrencyCode", + "type": "string" + }, + { + "key": "4", + "name": "localHour", + "type": "string" + }, + { + "key": "5", + "name": "transactionDeviceId", + "type": "string" + }, + { + "key": "6", + "name": "transactionIPaddress", + "type": "string" + }, + { + "key": "7", + "name": "transactionAmountUSD", + "type": "string" + }, + { + "key": "8", + "name": "transactionCurrencyConversionRate", + "type": "string" + }, + { + "key": "9", + "name": "transactionScenario", + "type": "string" + }, + { + "key": "10", + "name": "transactionType", + "type": "string" + }, + { + "key": "11", + "name": "transactionMethod", + "type": "string" + }, + { + "key": "12", + "name": "transactionDeviceType", + "type": "string" + }, + { + "key": "13", + "name": "ipState", + "type": "string" + }, + { + "key": "14", + "name": "ipPostcode", + "type": "string" + }, + { + "key": "15", + "name": "ipCountryCode", + "type": "string" + }, + { + "key": "16", + "name": "isProxyIP", + "type": "string" + }, + { + "key": "17", + "name": "browserType", + "type": "string" + }, + { + "key": "18", + "name": "browserLanguage", + "type": "string" + }, + { + "key": "19", + "name": "paymentInstrumentType", + "type": "string" + }, + { + "key": "20", + "name": "cardType", + "type": "string" + }, + { + "key": "21", + "name": "cardNumberInputMethod", + "type": "string" + }, + { + "key": "22", + "name": "paymentInstrumentID", + "type": "string" + }, + { + "key": "23", + "name": "paymentBillingAddress", + "type": "string" + }, + { + "key": "24", + "name": "paymentBillingPostalCode", + "type": "string" + }, + { + "key": "25", + "name": "paymentBillingState", + "type": "string" + }, + { + "key": "26", + "name": "paymentBillingCountryCode", + "type": "string" + }, + { + "key": "27", + "name": "paymentBillingName", + "type": "string" + }, + { + "key": "28", + "name": "shippingAddress", + "type": "string" + }, + { + "key": "29", + "name": "shippingPostalCode", + "type": "string" + }, + { + "key": "30", + "name": "shippingCity", + "type": "string" + }, + { + "key": "31", + "name": "shippingState", + "type": "string" + }, + { + "key": "32", + "name": "shippingCountry", + "type": "string" + }, + { + "key": "33", + "name": "cvvVerifyResult", + "type": "string" + }, + { + "key": "34", + "name": "responseCode", + "type": "string" + }, + { + "key": "35", + "name": "digitalItemCount", + "type": "string" + }, + { + "key": "36", + "name": "physicalItemCount", + "type": "string" + }, + { + "key": "37", + "name": "purchaseProductType", + "type": "string" + }, + { + "key": "38", + "name": "is_fraud", + "type": "string" + }, + { + "key": "39", + "name": "timestamp", + "type": "string" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "df270f90-5cdc-4b9e-840f-a83c07a504dc": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "e4a6b6a5-0652-49fc-8312-2aa0f243f890": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "4" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520427234290", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 15:24:53", + "3": "1", + "4": "559.99", + "5": "559.99", + "6": "1", + "7": "559.99", + "8": "559.99", + "index": 1 + }, + { + "0": "A1055520432197980", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 12:52:29", + "3": "1", + "4": "979.0", + "5": "979.0", + "6": "1", + "7": "979.0", + "8": "979.0", + "index": 2 + }, + { + "0": "A1055520473357430", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 15:11:26", + "3": "1", + "4": "529.99", + "5": "529.99", + "6": "1", + "7": "529.99", + "8": "529.99", + "index": 3 + }, + { + "0": "A1055520504917640", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 01:32:16", + "3": "1", + "4": "534.99", + "5": "534.99", + "6": "1", + "7": "534.99", + "8": "534.99", + "index": 4 + }, + { + "0": "A1055520508165660", + "1": "2023-06-21 18:58:08.739", + "2": "2023-03-11 19:15:14", + "3": "1", + "4": "564.99", + "5": "564.99", + "6": "1", + "7": "564.99", + "8": "564.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "create_timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "3", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "4", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "5", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "6", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "7", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "8", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "f5410ad6-c146-439b-8c77-13f686c3695b": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "3" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "A1055520426191820", + "1": "2023-01-01 19:15:53", + "2": "1", + "3": "133.28", + "4": "133.28", + "5": "1", + "6": "133.28", + "7": "133.28", + "index": 1 + }, + { + "0": "A1055520426191820", + "1": "2023-01-12 00:04:10", + "2": "1", + "3": "543.66", + "4": "543.66", + "5": "1", + "6": "543.66", + "7": "543.66", + "index": 2 + }, + { + "0": "A1055520426719380", + "1": "2023-04-17 21:42:09", + "2": "1", + "3": "217.09", + "4": "217.09", + "5": "1", + "6": "217.09", + "7": "217.09", + "index": 3 + }, + { + "0": "A1055520426806680", + "1": "2023-04-08 14:43:09", + "2": "1", + "3": "923.98", + "4": "923.98", + "5": "1", + "6": "923.98", + "7": "923.98", + "index": 4 + }, + { + "0": "A1055520426936410", + "1": "2023-03-27 03:40:54", + "2": "1", + "3": "139.99", + "4": "139.99", + "5": "1", + "6": "139.99", + "7": "139.99", + "index": 5 + } + ], + "schema": [ + { + "key": "0", + "name": "accountID", + "type": "string" + }, + { + "key": "1", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "2", + "name": "transaction_3d_count", + "type": "bigint" + }, + { + "key": "3", + "name": "transaction_amount_3d_sum", + "type": "double" + }, + { + "key": "4", + "name": "transaction_amount_3d_avg", + "type": "double" + }, + { + "key": "5", + "name": "transaction_7d_count", + "type": "bigint" + }, + { + "key": "6", + "name": "transaction_amount_7d_sum", + "type": "double" + }, + { + "key": "7", + "name": "transaction_amount_7d_avg", + "type": "double" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + }, + "fd5386fa-3c75-4b36-be71-1d50dca54796": { + "persist_state": { + "view": { + "chartOptions": { + "aggregationType": "sum", + "categoryFieldKeys": [ + "0" + ], + "chartType": "bar", + "isStacked": false, + "seriesFieldKeys": [ + "2" + ] + }, + "tableOptions": {}, + "type": "details" + } + }, + "sync_state": { + "isSummary": false, + "language": "scala", + "table": { + "rows": [ + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "9": "1", + "index": 1 + }, + { + "0": "65020E58-781D-4FFC-BEF2-0FDF87BE671D", + "1": "A985156981092344", + "2": "1148.6", + "3": "20.0", + "4": "2023-01-02 02:05:50", + "5": "1143.856282", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 2 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "9": "1", + "index": 3 + }, + { + "0": "8EC10EBC-F4BB-4148-9073-4B2BA93C9B34", + "1": "A985156981066925", + "2": "150.31", + "3": "8.0", + "4": "2023-01-03 14:11:15", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 4 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "9": "1", + "index": 5 + }, + { + "0": "CD624353-E473-4EE0-8BDF-A818627AA1D1", + "1": "A985156970845915", + "2": "99.98", + "3": "11.0", + "4": "2023-01-03 16:40:50", + "5": "99.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 6 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "9": "1", + "index": 7 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "9": "1", + "index": 8 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "9": "1", + "index": 9 + }, + { + "0": "DDE0B1F6-40B2-44CA-B0A7-AE46453D51A0", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:25:29", + "9": "1", + "index": 10 + }, + { + "0": "E6789403-5C39-4D44-BA7C-3A1F481E718B", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:37:59", + "9": "1", + "index": 11 + }, + { + "0": "287F81B6-06F6-4C3B-8714-401FA70EC7DA", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:29:49", + "9": "1", + "index": 12 + }, + { + "0": "5CE4020A-ABA5-4B60-9BC3-131A126670C6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:03:22", + "9": "1", + "index": 13 + }, + { + "0": "A1979FD7-32C8-4BE2-AB5F-3FFDDD7C584A", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:24:17", + "9": "1", + "index": 14 + }, + { + "0": "11FAFE8A-E9F5-4FB4-BC04-4C96AE6E852F", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:16:26", + "9": "1", + "index": 15 + }, + { + "0": "C110E452-388B-4D53-A271-DE2C06DB410A", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:17:45", + "9": "1", + "index": 16 + }, + { + "0": "667490FD-D4B7-4039-A69B-C4E70A9F5DE3", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:23:04", + "9": "1", + "index": 17 + }, + { + "0": "E617D42C-798C-455C-8372-BC06259DE735", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:11:03", + "9": "1", + "index": 18 + }, + { + "0": "ACB1088D-CB05-45F9-9B3E-4709989A7443", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:06:03", + "9": "1", + "index": 19 + }, + { + "0": "51729D46-986A-4AD6-927B-959AA1FF1749", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:35:19", + "9": "1", + "index": 20 + }, + { + "0": "81D69AD5-E46F-46A4-8317-14C6F2908E0D", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:32:17", + "9": "1", + "index": 21 + }, + { + "0": "A45B5295-84D3-47CD-AFA3-E074A9DF9EF6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:43:38", + "9": "1", + "index": 22 + }, + { + "0": "E44AA2DD-8814-4746-839A-4A3D8EE5F243", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:12:20", + "9": "1", + "index": 23 + }, + { + "0": "DE15CA12-F07E-4C7C-9C30-19EF38B2B3E6", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:42:16", + "9": "1", + "index": 24 + }, + { + "0": "5F5F30FC-7EA0-41CE-B5A4-FA459FDDBE38", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:09:49", + "9": "1", + "index": 25 + }, + { + "0": "B2F718B0-6639-44C6-9E86-04BCCB6765B6", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:15:03", + "9": "1", + "index": 26 + }, + { + "0": "A8E3D8C2-10C0-429E-B6E1-743A0D5C3C17", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:26:46", + "9": "1", + "index": 27 + }, + { + "0": "AC86DB3A-EEED-44C1-85CF-79DA0AF47B0F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:39:29", + "9": "1", + "index": 28 + }, + { + "0": "A161FE84-6920-43CD-9AFE-7D1A04800640", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:20:14", + "9": "1", + "index": 29 + }, + { + "0": "D0F517D0-F18C-41DE-A53F-65C3264C4C5E", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:13:40", + "9": "1", + "index": 30 + }, + { + "0": "B117C813-5EB9-4747-92B5-C52D520AC13F", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:36:39", + "9": "1", + "index": 31 + }, + { + "0": "AED3F5DA-87AB-45C8-A0FF-426E353FB102", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:31:04", + "9": "1", + "index": 32 + }, + { + "0": "4BCAC6B0-3937-47E3-9AB8-6519D09321B1", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:01:57", + "9": "1", + "index": 33 + }, + { + "0": "FEE49FF0-87EB-402B-8EBB-8F9F4C9CB225", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:33:55", + "9": "1", + "index": 34 + }, + { + "0": "826E2F8E-D033-4287-A065-A26210923F90", + "1": "A1688853657886190", + "2": "53.99", + "3": "13.0", + "4": "2023-01-03 18:40:40", + "9": "1", + "index": 35 + }, + { + "0": "C125DD40-6BE3-40E2-8604-5B9540751467", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:18:59", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 36 + }, + { + "0": "8D7BE688-4CD9-4703-B03B-5ECC7BBD11E7", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:04:48", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 37 + }, + { + "0": "F4B5B955-8DD8-4BB5-9281-66E87013C42D", + "1": "A1688853657886190", + "2": "53.99", + "3": "12.0", + "4": "2023-01-03 18:07:16", + "5": "53.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 38 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "9": "1", + "index": 39 + }, + { + "0": "72399945-3AC5-461E-BF85-228552DF71E1", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:35:42", + "9": "1", + "index": 40 + }, + { + "0": "FF74DFD9-5015-440B-97A1-BDAB4A95B272", + "1": "A985156971082067", + "2": "119.98", + "3": "13.0", + "4": "2023-01-03 18:33:56", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 41 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "9": "1", + "index": 42 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "9": "1", + "index": 43 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "9": "1", + "index": 44 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "9": "1", + "index": 45 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "9": "1", + "index": 46 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "9": "1", + "index": 47 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "9": "1", + "index": 48 + }, + { + "0": "5AF9F5B3-7386-426B-878E-3F1B7BBF48D9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:56:55", + "9": "1", + "index": 49 + }, + { + "0": "9E012F96-E7AA-4046-8F24-0C85FBB36CF5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:07:57", + "9": "1", + "index": 50 + }, + { + "0": "68D83F37-50D4-484B-8652-EAA245BFD48D", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:33:26", + "9": "1", + "index": 51 + }, + { + "0": "2DC3FDC7-C677-4479-A4C4-85C9A5E2F4FC", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:11:32", + "9": "1", + "index": 52 + }, + { + "0": "1353C004-23CE-4887-8611-0986140B9411", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:22:26", + "9": "1", + "index": 53 + }, + { + "0": "6D96EB12-FD10-4D59-8262-C477E3B4A7FF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:18:40", + "9": "1", + "index": 54 + }, + { + "0": "64A65086-D78C-4C67-994D-06DC95737FB5", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:09:49", + "9": "1", + "index": 55 + }, + { + "0": "4186FC50-1BBE-4188-94FD-5659E850B7A3", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:45:29", + "9": "1", + "index": 56 + }, + { + "0": "442116BE-E400-48F2-80E8-C15B1DECFB1E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:51:35", + "9": "1", + "index": 57 + }, + { + "0": "61841EEB-00BE-478C-8142-677F86A55BD1", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:26:54", + "9": "1", + "index": 58 + }, + { + "0": "73F74DE9-9679-417D-A7A8-6D1D74769D9D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:28:23", + "9": "1", + "index": 59 + }, + { + "0": "298F7C38-80B2-4CC3-8D84-29A2B5B7797C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:48:42", + "9": "1", + "index": 60 + }, + { + "0": "4B54A952-E219-4AD1-8DB2-CAD464FCC43A", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:46:44", + "9": "1", + "index": 61 + }, + { + "0": "D02E8FB4-3170-4C47-8886-ABE470F197C3", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:03:30", + "9": "1", + "index": 62 + }, + { + "0": "3F556D13-8CCB-400E-B9BD-582162BE610B", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:36:12", + "9": "1", + "index": 63 + }, + { + "0": "897B514D-E758-4690-84B8-6549559C52EE", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:50:29", + "9": "1", + "index": 64 + }, + { + "0": "985F137B-2E34-46E7-9AB6-EBF9D2C220F4", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:06:48", + "9": "1", + "index": 65 + }, + { + "0": "D247B57A-BE03-44A2-ABCB-E73EA6FCD843", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:29:52", + "9": "1", + "index": 66 + }, + { + "0": "40F8D07E-67EF-4678-8612-FC130DC84F5E", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:00:08", + "9": "1", + "index": 67 + }, + { + "0": "F15CE4DA-A189-42BF-931E-66398ED48CA6", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:21:51", + "9": "1", + "index": 68 + }, + { + "0": "973F228D-6E34-4E2C-A8ED-86A560FFE993", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:37:33", + "9": "1", + "index": 69 + }, + { + "0": "BCBDF6C6-1D5A-42F2-A912-E295526FF9B7", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:04:05", + "9": "1", + "index": 70 + }, + { + "0": "C1040C0D-A701-4AD0-B4E3-1BC1F06AB4AA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:13:25", + "9": "1", + "index": 71 + }, + { + "0": "4C5EC030-CD2E-4097-B706-42BE9D808509", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:05:37", + "9": "1", + "index": 72 + }, + { + "0": "3CF32319-BFF3-4CFE-8792-8C4775AD619F", + "1": "A1899946873142120", + "2": "99.98", + "3": "13.0", + "4": "2023-01-03 18:45:18", + "9": "1", + "index": 73 + }, + { + "0": "F6FBBB59-BFD5-4736-B635-64301B04D71C", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:42:53", + "9": "1", + "index": 74 + }, + { + "0": "AD22A063-D3FB-4623-B7A2-69A6C8E5CEE0", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:53:28", + "9": "1", + "index": 75 + }, + { + "0": "9E9BB950-7681-4213-B8D7-1E71AE232C43", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:55:40", + "9": "1", + "index": 76 + }, + { + "0": "4EC3DEEC-D21B-4515-A3DE-5CC895397F21", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:59:16", + "9": "1", + "index": 77 + }, + { + "0": "2120F51D-E109-4481-88D7-023757351EDF", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:05:23", + "9": "1", + "index": 78 + }, + { + "0": "D8EFBBA0-BEF9-4BEA-A6F0-4A5CBE4C1287", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:09:43", + "9": "1", + "index": 79 + }, + { + "0": "C2440D4D-3768-4108-BCAF-E43441537783", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:38:15", + "9": "1", + "index": 80 + }, + { + "0": "19DB47CE-E027-4D8D-8439-ADCC4BBE9879", + "1": "A1899946873142120", + "2": "59.99", + "3": "13.0", + "4": "2023-01-03 18:42:51", + "9": "1", + "index": 81 + }, + { + "0": "88A8FA38-800E-459D-A11C-77477E41FC5B", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:08:13", + "9": "1", + "index": 82 + }, + { + "0": "038E2738-E619-431A-8597-5952B7710EF8", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:20:26", + "9": "1", + "index": 83 + }, + { + "0": "34DE06CA-82E2-44D3-8E83-E650A493EE27", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:50:42", + "9": "1", + "index": 84 + }, + { + "0": "DDBCD8B8-C45B-45BB-8373-E184F6776E09", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:01:13", + "9": "1", + "index": 85 + }, + { + "0": "2FF854D4-3A50-4F9B-9AF9-861612051389", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:33:06", + "9": "1", + "index": 86 + }, + { + "0": "BE25CE28-7142-4EB4-8157-77654E4816D0", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:24:35", + "9": "1", + "index": 87 + }, + { + "0": "57C6D5D6-43F4-4BD0-9FF5-67E4BB395B99", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:15:43", + "9": "1", + "index": 88 + }, + { + "0": "F5606360-D929-4903-8771-E51207DAF2C6", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:53:31", + "9": "1", + "index": 89 + }, + { + "0": "7898FC86-CDBF-469B-B369-5E70B9BAC1F1", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:01:54", + "9": "1", + "index": 90 + }, + { + "0": "AF64911E-A295-4337-BBAF-835F82DD77BA", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:41:16", + "9": "1", + "index": 91 + }, + { + "0": "F825E26E-89D0-43AB-B281-D62588C4779A", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:49:42", + "9": "1", + "index": 92 + }, + { + "0": "C7D4CBEF-2E68-41A2-B83A-D064795E296E", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:16:55", + "9": "1", + "index": 93 + }, + { + "0": "A75939D1-EE17-4E78-8478-6937CD08D5E9", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:52:01", + "9": "1", + "index": 94 + }, + { + "0": "422D5F57-6B6E-4803-AD06-9BF33330F102", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:48:55", + "9": "1", + "index": 95 + }, + { + "0": "CA193A45-31F8-4EB5-A19D-BF5D2602277D", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:40:11", + "9": "1", + "index": 96 + }, + { + "0": "EB09177A-B225-47E7-B177-E8610B3E618F", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 18:55:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 97 + }, + { + "0": "F70513F4-FCD6-4FB3-9BDA-E1339E4DD86F", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:24:53", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 98 + }, + { + "0": "F06A587E-F353-481B-9BBA-FFAC28C60777", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:46:21", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 99 + }, + { + "0": "B634C814-3ADD-41B5-BBA6-34BD46A8EA65", + "1": "A1899946873142120", + "2": "149.97", + "3": "13.0", + "4": "2023-01-03 19:18:13", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 100 + }, + { + "0": "5AFF55FE-4D1D-4FFA-892D-AB911971CFFE", + "1": "A1899946873142120", + "2": "149.97", + "3": "15.0", + "4": "2023-01-03 20:52:47", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 101 + }, + { + "0": "92CDB9E5-D34B-415C-B5D5-F4BA4C221855", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 19:57:07", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 102 + }, + { + "0": "F1476029-DD3C-4695-924A-0D951E1540CE", + "1": "A1899946873142120", + "2": "149.97", + "3": "14.0", + "4": "2023-01-03 20:02:36", + "5": "149.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 103 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "9": "1", + "index": 104 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "9": "1", + "index": 105 + }, + { + "0": "90BAD1BA-E6EE-4EA6-B27F-7162B22CDBFA", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:39:16", + "9": "1", + "index": 106 + }, + { + "0": "D2CE31CE-7D5A-4E80-8D3E-F2E184DFAC98", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:27:17", + "9": "1", + "index": 107 + }, + { + "0": "8875BFC3-B41E-416A-A334-65EB49672BEC", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:29:02", + "9": "1", + "index": 108 + }, + { + "0": "6B3337E4-83E7-49DA-97BA-D0DC2B44F42F", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:41:07", + "9": "1", + "index": 109 + }, + { + "0": "9D92C6BC-E560-4C32-A034-1E1F0814E46E", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:42:58", + "9": "1", + "index": 110 + }, + { + "0": "E9D36D5B-FDCD-440A-BC1A-C53A9110CF22", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:46:52", + "9": "1", + "index": 111 + }, + { + "0": "2132335C-082B-4B7E-9B63-DA007878168D", + "1": "A844428017843376", + "2": "107.52", + "3": "15.0", + "4": "2023-01-03 20:32:18", + "5": "107.52", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 112 + }, + { + "0": "5977650F-EE3E-450F-AD0B-7C103B35B4F5", + "1": "A844428017843376", + "2": "119.98", + "3": "15.0", + "4": "2023-01-03 20:36:42", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 113 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "9": "1", + "index": 114 + }, + { + "0": "4324B9F6-5D21-4327-B80F-99057A3B541C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:33:20", + "9": "1", + "index": 115 + }, + { + "0": "EFFCEF09-9E31-4B39-AD1B-8E169D27C749", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:34:26", + "9": "1", + "index": 116 + }, + { + "0": "28C2478A-7236-40ED-A5C4-5BB8A29E561B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:43:14", + "9": "1", + "index": 117 + }, + { + "0": "EAD34905-DE0B-4FC8-A4AE-C2248AF29A08", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:37:32", + "9": "1", + "index": 118 + }, + { + "0": "7DDF174A-C6BF-4245-8148-650BBEC82DA8", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:36:35", + "9": "1", + "index": 119 + }, + { + "0": "D3F14FD5-C8C3-4401-8053-A5DCB4086473", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:30:44", + "9": "1", + "index": 120 + }, + { + "0": "92C5B50A-E46E-404D-9EFB-7043D6DD7C68", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:32:00", + "9": "1", + "index": 121 + }, + { + "0": "D1884A1A-0865-47C3-A8DC-43DC991D661C", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:41:02", + "9": "1", + "index": 122 + }, + { + "0": "F7690559-B2FA-42E4-910F-DF65A0250586", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:29:47", + "9": "1", + "index": 123 + }, + { + "0": "17B73DB4-D6C9-4F0D-A8CA-A1BD9334FABC", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:42:15", + "9": "1", + "index": 124 + }, + { + "0": "A3BEE7DE-D634-4C72-A05D-77A80D7D613B", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:44:48", + "9": "1", + "index": 125 + }, + { + "0": "A25BC911-EAA9-47D1-B8D2-4086F6CC94CB", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:35:29", + "9": "1", + "index": 126 + }, + { + "0": "B30F54F2-BBB5-4DFC-B4D6-F3BA03220790", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:28:43", + "9": "1", + "index": 127 + }, + { + "0": "8D4F3115-A1D5-459A-A847-A4C3E43A74A7", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:39:35", + "9": "1", + "index": 128 + }, + { + "0": "36F5A50E-CBF2-4D33-87C5-1F8F7736F562", + "1": "A1829582580801010", + "2": "59.99", + "3": "15.0", + "4": "2023-01-03 20:38:37", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 129 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "9": "1", + "index": 130 + }, + { + "0": "41C41A19-2063-47C1-BAFB-B1BF50578374", + "1": "A844428029243587", + "2": "148.74", + "3": "19.0", + "4": "2023-01-04 01:23:14", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 131 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "9": "1", + "index": 132 + }, + { + "0": "EE63EE82-8A5F-4422-8CFA-3CF0C48D05FD", + "1": "A1688853524321290", + "2": "49.98", + "3": "19.0", + "4": "2023-01-05 00:32:25", + "9": "1", + "index": 133 + }, + { + "0": "14B43B88-2D00-4D03-BDDA-3484C0D86769", + "1": "A1688853524321290", + "2": "24.99", + "3": "19.0", + "4": "2023-01-05 00:26:00", + "9": "1", + "index": 134 + }, + { + "0": "B0F016BB-D6B1-4812-91DD-41C1FE9C91BA", + "1": "A1688853524321290", + "2": "74.97", + "3": "19.0", + "4": "2023-01-05 00:42:34", + "5": "74.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 135 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "9": "1", + "index": 136 + }, + { + "0": "4F5BE866-AC36-4BD4-8DE5-40B48B2AFD9F", + "1": "A914800364713675", + "2": "24.99", + "3": "20.0", + "4": "2023-01-06 02:18:37", + "5": "24.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 137 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "9": "1", + "index": 138 + }, + { + "0": "E52016D2-8898-4D8F-94EE-9D3357692C21", + "1": "A844428031214472", + "2": "2199.0", + "3": "9.0", + "4": "2023-01-06 13:14:20", + "5": "442.12214400000005", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 139 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "9": "1", + "index": 140 + }, + { + "0": "833FA1C1-EC94-4F61-AE86-EAF339165BD2", + "1": "A1688852068178080", + "2": "109.99", + "3": "20.0", + "4": "2023-01-07 05:19:25", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 141 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "9": "1", + "index": 142 + }, + { + "0": "53F9A1F3-DB12-474B-8E9B-E6ADF22699AF", + "1": "A914800996051170", + "2": "139.99", + "3": "17.0", + "4": "2023-01-07 22:30:40", + "9": "1", + "index": 143 + }, + { + "0": "74E7FBFA-551A-4324-89BA-6CD22AA7B832", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:36:31", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 144 + }, + { + "0": "D1A1DEF3-8373-40A4-8337-742C4BC68770", + "1": "A914800996051170", + "2": "215.64", + "3": "17.0", + "4": "2023-01-07 22:50:44", + "5": "215.64", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 145 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "9": "1", + "index": 146 + }, + { + "0": "C5A162B3-E2A9-451F-8A02-FE6A939B43A4", + "1": "A985156979906180", + "2": "99.99", + "3": "14.0", + "4": "2023-01-07 22:49:51", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 147 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "9": "1", + "index": 148 + }, + { + "0": "DE2E99AB-BCA3-4E62-9774-17E62E4C50E0", + "1": "A985156985071493", + "2": "74.89", + "3": "16.0", + "4": "2023-01-08 15:39:26", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 149 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "9": "1", + "index": 150 + }, + { + "0": "ECADF883-D7AA-4373-99FB-358A35302900", + "1": "A1688853652289450", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-08 21:20:27", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 151 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "9": "1", + "index": 152 + }, + { + "0": "EC2B7C43-96E8-4BD7-AE1B-1E4F5B513D29", + "1": "A306107899458824", + "2": "279.99", + "3": "8.0", + "4": "2023-01-09 12:15:52", + "5": "279.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 153 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "9": "1", + "index": 154 + }, + { + "0": "78CF721D-0FC0-4CE6-B458-D1DF03C16C16", + "1": "A985156986195261", + "2": "169.0", + "3": "20.0", + "4": "2023-01-10 10:28:38", + "5": "176.66415", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 155 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "9": "1", + "index": 156 + }, + { + "0": "5B14DBAD-62C5-4144-B131-E1C358C623E7", + "1": "A985156723649620", + "2": "139.99", + "3": "21.0", + "4": "2023-01-11 02:28:26", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 157 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "9": "1", + "index": 158 + }, + { + "0": "BA22D839-F441-414B-8062-5BA7B6875708", + "1": "A1759222192247110", + "2": "145.59", + "3": "3.0", + "4": "2023-01-11 08:27:26", + "5": "145.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 159 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "9": "1", + "index": 160 + }, + { + "0": "990FAC29-0BAC-4D26-A896-27E71BA5144A", + "1": "A844428035915015", + "2": "86.17", + "3": "23.0", + "4": "2023-01-12 04:22:36", + "5": "86.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 161 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "9": "1", + "index": 162 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "9": "1", + "index": 163 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "9": "1", + "index": 164 + }, + { + "0": "CA5F63D9-CA1B-41E6-8C42-7F89EA103D1D", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:31:01", + "9": "1", + "index": 165 + }, + { + "0": "0A82E4ED-93EC-4386-AA16-0EA1FC946B6C", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 19:20:25", + "9": "1", + "index": 166 + }, + { + "0": "D1834580-E9C8-4D34-9433-0BA410FA0DF4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:30:31", + "9": "1", + "index": 167 + }, + { + "0": "DE53E28B-69C9-4C7D-AF79-E725235C87F4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:31:56", + "9": "1", + "index": 168 + }, + { + "0": "9E492C70-9940-4103-9414-FC8F0C741490", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:27:34", + "9": "1", + "index": 169 + }, + { + "0": "DABB8679-0A5B-46D1-9421-D443A45907F8", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:48:21", + "9": "1", + "index": 170 + }, + { + "0": "630F1681-99D1-4F3C-BCE0-69C6B28E5A98", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:43:12", + "9": "1", + "index": 171 + }, + { + "0": "961FCF4A-7930-4C04-B37B-A5FDFA414D9E", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:41:14", + "9": "1", + "index": 172 + }, + { + "0": "41F4234C-1659-48C5-A9D1-4C2324A0891B", + "1": "A1899946895455190", + "2": "19.99", + "3": "11.0", + "4": "2023-01-13 16:52:56", + "9": "1", + "index": 173 + }, + { + "0": "6A2D4479-6262-4C32-95B5-AC5BE0205E24", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:47:34", + "9": "1", + "index": 174 + }, + { + "0": "F3606B8D-3008-4781-AC9C-BA159F1BF3B5", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:24:09", + "9": "1", + "index": 175 + }, + { + "0": "99E39E43-B8E7-48C8-8C6E-EE09902A63E0", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:36:07", + "9": "1", + "index": 176 + }, + { + "0": "B375BB8C-242A-4DC6-8FC3-F35EA5ADDADD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:21:25", + "9": "1", + "index": 177 + }, + { + "0": "E112F541-98DE-420B-B009-FAA21420164B", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:00", + "9": "1", + "index": 178 + }, + { + "0": "4A7523C3-17EE-4AB6-92D9-6535A3A41331", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:22:20", + "9": "1", + "index": 179 + }, + { + "0": "2F6CE5C9-1702-4E7A-8A88-40CE991E99BB", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:34:17", + "9": "1", + "index": 180 + }, + { + "0": "E7F77A61-785B-4E7D-8C99-6A237E368BC5", + "1": "A1899946895455190", + "2": "19.99", + "3": "12.0", + "4": "2023-01-13 17:22:25", + "9": "1", + "index": 181 + }, + { + "0": "C077446E-640F-4769-9527-5A727F34A4B4", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:38:29", + "9": "1", + "index": 182 + }, + { + "0": "27B1F6C4-E881-408C-A29E-CA13AD07997B", + "1": "A1899946895455190", + "2": "19.99", + "3": "13.0", + "4": "2023-01-13 18:49:35", + "9": "1", + "index": 183 + }, + { + "0": "DF9AFB75-2D64-4A8A-8743-AA39724E34AD", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:39:41", + "9": "1", + "index": 184 + }, + { + "0": "B544758B-8F40-45DE-94EB-BC3B8B7B1401", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:42:16", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 185 + }, + { + "0": "7DCB85C6-1524-4E97-8638-7324B5A49568", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:45:54", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 186 + }, + { + "0": "F53D4B5F-01AB-48A8-A833-F1CBA086B76D", + "1": "A1899946895455190", + "2": "19.99", + "3": "14.0", + "4": "2023-01-13 19:44:03", + "5": "19.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 187 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "9": "1", + "index": 188 + }, + { + "0": "C4FDAA41-391E-4449-93C8-0C7E984921E8", + "1": "A1759221221524030", + "2": "119.99", + "3": "11.0", + "4": "2023-01-14 11:13:14", + "5": "161.722522", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 189 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "9": "1", + "index": 190 + }, + { + "0": "3E6FEB4B-BCD3-4FFE-BBB3-1CB0BFA39C82", + "1": "A914800340295166", + "2": "79.99", + "3": "18.0", + "4": "2023-01-15 01:17:44", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 191 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "9": "1", + "index": 192 + }, + { + "0": "7F739A3C-DA4E-4B79-BF65-7D33BFD1BC39", + "1": "A844428039942859", + "2": "479.0", + "3": "22.0", + "4": "2023-01-16 23:06:38", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 193 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "9": "1", + "index": 194 + }, + { + "0": "6D7890A5-DA17-43B5-AA06-79189795DEF8", + "1": "A1688853613564590", + "2": "62.39", + "3": "2.0", + "4": "2023-01-17 08:17:25", + "5": "62.39", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 195 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "9": "1", + "index": 196 + }, + { + "0": "1570C1F3-15CF-473D-A630-24D1151F7D94", + "1": "A1759222185240050", + "2": "64.19", + "3": "3.0", + "4": "2023-01-17 08:57:19", + "5": "64.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 197 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "9": "1", + "index": 198 + }, + { + "0": "EDE9E934-451A-491D-84E1-090D1A22D191", + "1": "A1759222185351430", + "2": "79.99", + "3": "7.0", + "4": "2023-01-17 13:14:40", + "5": "79.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 199 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "9": "1", + "index": 200 + }, + { + "0": "C49AA590-F545-4A2A-B096-FA1626918587", + "1": "A1759222185358430", + "2": "86.74", + "3": "9.0", + "4": "2023-01-17 14:44:35", + "5": "86.74", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 201 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "9": "1", + "index": 202 + }, + { + "0": "06CA7673-9504-44D4-A9B1-49EC29233AD5", + "1": "A844428040495230", + "2": "73.11", + "3": "13.0", + "4": "2023-01-19 18:43:29", + "9": "1", + "index": 203 + }, + { + "0": "2ED99F79-890A-42CD-81C5-0813D241BD01", + "1": "A844428040495230", + "2": "75.58", + "3": "13.0", + "4": "2023-01-17 18:24:03", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 204 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "9": "1", + "index": 205 + }, + { + "0": "86EB854A-E34C-444F-92F2-3567FEEA91A3", + "1": "A1759222219152450", + "2": "237.04", + "3": "10.0", + "4": "2023-01-18 17:19:48", + "5": "237.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 206 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "9": "1", + "index": 207 + }, + { + "0": "F7C5B3E6-5372-474E-B4A0-60912B726639", + "1": "A309681307561823", + "2": "149.44", + "3": "18.0", + "4": "2023-01-18 23:25:19", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 208 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "9": "1", + "index": 209 + }, + { + "0": "CFF67307-A9EF-43AC-AE45-D448E2991474", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:39:12", + "9": "1", + "index": 210 + }, + { + "0": "C0C109CA-5ECF-40E1-8D9E-55025AB4FBCF", + "1": "A844428041547410", + "2": "99.99", + "4": "2023-01-19 10:44:26", + "5": "157.474251", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 211 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "9": "1", + "index": 212 + }, + { + "0": "CD77E40B-B5DF-4C24-9A41-6E55793A90BD", + "1": "A1899946963731140", + "2": "62.49", + "3": "5.0", + "4": "2023-01-19 12:12:26", + "5": "62.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 213 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "9": "1", + "index": 214 + }, + { + "0": "D12B9922-D2E5-4BD2-BC6C-7486816F0AD7", + "1": "A985156993509507", + "2": "75.58", + "3": "9.0", + "4": "2023-01-19 17:28:50", + "5": "75.58", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 215 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "9": "1", + "index": 216 + }, + { + "0": "98D7E9CF-D308-4B97-BF45-00263A93B702", + "1": "A914801004943538", + "2": "59.99", + "4": "2023-01-20 02:02:01", + "9": "1", + "index": 217 + }, + { + "0": "B6F5ED72-DC16-47A4-9921-3824C780A815", + "1": "A914801004943538", + "2": "31.94", + "3": "19.0", + "4": "2023-01-20 02:01:58", + "5": "31.94", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 218 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "9": "1", + "index": 219 + }, + { + "0": "499056C6-A358-4E98-8685-9EC28E333CF7", + "1": "A1759222094070230", + "2": "281.37", + "3": "14.0", + "4": "2023-01-20 19:36:53", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 220 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "9": "1", + "index": 221 + }, + { + "0": "D0A2E6EF-037B-4A22-816B-35DCC965C228", + "1": "A985156995541712", + "2": "3298.0", + "3": "20.0", + "4": "2023-01-23 02:23:53", + "5": "259.62185800000003", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 222 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "9": "1", + "index": 223 + }, + { + "0": "44E0A6A4-06F8-40B7-9CAA-7E421AB8FD69", + "1": "A844427703526719", + "2": "102.48", + "4": "2023-01-23 03:36:00", + "5": "102.48", + "6": "false", + "7": "2.0", + "8": "1.0", + "9": "1", + "index": 224 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "9": "1", + "index": 225 + }, + { + "0": "22F1F04E-3F22-4BA6-AE81-6329C97E613F", + "1": "A2181420350587670", + "2": "149.99", + "3": "9.0", + "4": "2023-01-23 17:58:49", + "5": "149.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 226 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "9": "1", + "index": 227 + }, + { + "0": "B9F2630D-2677-44EF-9DAF-CAACE7EF989E", + "1": "A1759222164863410", + "2": "109.99", + "3": "0.0", + "4": "2023-01-24 08:59:40", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 228 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "9": "1", + "index": 229 + }, + { + "0": "0E2AB375-BA94-41B4-A0A5-9C173653D5F7", + "1": "A844428044533734", + "2": "599.0", + "3": "22.0", + "4": "2023-01-24 12:38:32", + "5": "626.16465", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 230 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "9": "1", + "index": 231 + }, + { + "0": "C8AA8B84-1C89-4B76-B2BF-3C10C3444D89", + "1": "A914801007105746", + "2": "80.73", + "3": "9.0", + "4": "2023-01-25 18:07:59", + "9": "1", + "index": 232 + }, + { + "0": "F2CD36F5-0FC9-4DBF-9D5A-D6B043795C0C", + "1": "A914801007105746", + "2": "83.06", + "3": "8.0", + "4": "2023-01-23 16:39:58", + "9": "1", + "index": 233 + }, + { + "0": "B76E185F-504D-437A-9865-ECDA737870F3", + "1": "A914801007105746", + "2": "93.85", + "3": "9.0", + "4": "2023-01-24 17:53:21", + "5": "93.85", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 234 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "9": "1", + "index": 235 + }, + { + "0": "A8410FBF-9EE3-4200-A0ED-05631423E0F9", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 08:58:29", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 236 + }, + { + "0": "1BFE4527-0634-4541-AE5B-36B56B92F78B", + "1": "A985156996696141", + "2": "1199.0", + "3": "9.0", + "4": "2023-01-25 09:00:09", + "5": "187.8833", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 237 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "9": "1", + "index": 238 + }, + { + "0": "13A9B365-CFF1-44F7-A1EB-19327EDE18C2", + "1": "A1688853647393240", + "2": "295.38", + "3": "8.0", + "4": "2023-01-25 16:49:33", + "9": "1", + "index": 239 + }, + { + "0": "F325312B-1722-414B-8969-07E1BADC9D75", + "1": "A1688853647393240", + "2": "147.69", + "3": "8.0", + "4": "2023-01-25 16:45:52", + "5": "147.69", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 240 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "9": "1", + "index": 241 + }, + { + "0": "F6C39AEA-B9AC-4718-9690-A47F81A7C38D", + "1": "A844427754541367", + "2": "116.86", + "3": "15.0", + "4": "2023-01-25 21:33:42", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 242 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "9": "1", + "index": 243 + }, + { + "0": "CACD0238-79D3-4506-B78A-F24E494B3AAC", + "1": "A1055521395048230", + "2": "81.6", + "3": "2.0", + "4": "2023-01-25 08:02:13", + "9": "1", + "index": 244 + }, + { + "0": "A6447B92-1029-48D5-9B03-086284B006CB", + "1": "A1055521395048230", + "2": "83.14", + "3": "12.0", + "4": "2023-01-26 18:16:50", + "5": "83.14", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 245 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "9": "1", + "index": 246 + }, + { + "0": "A6420C3F-3816-4043-B8F2-73B7C384475E", + "1": "A1688852501978320", + "2": "134.81", + "3": "14.0", + "4": "2023-01-27 19:30:57", + "5": "134.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 247 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "9": "1", + "index": 248 + }, + { + "0": "8FD67A34-3815-4050-AD67-DF29BC551351", + "1": "A844428045623555", + "2": "80.79", + "3": "18.0", + "4": "2023-01-27 23:59:04", + "5": "80.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 249 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "9": "1", + "index": 250 + }, + { + "0": "81BCECDA-79F8-470D-9407-44198BD3EC06", + "1": "A1055520964660610", + "2": "219.99", + "3": "19.0", + "4": "2023-01-28 00:31:21", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 251 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "9": "1", + "index": 252 + }, + { + "0": "618987FF-BE7A-451C-B8C3-62E31CC9444E", + "1": "A985156287053363", + "2": "151.54", + "3": "18.0", + "4": "2023-01-28 00:37:51", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 253 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "9": "1", + "index": 254 + }, + { + "0": "C09DE962-3605-4A0E-B82F-A09B2B618D1F", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:54:27", + "9": "1", + "index": 255 + }, + { + "0": "C70F7DCA-97F0-4486-83DC-B06483D9CFF5", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:55:53", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 256 + }, + { + "0": "C61F74AD-F654-4042-9DFF-567978FA7CF7", + "1": "A1829582571089880", + "2": "233.19", + "3": "21.0", + "4": "2023-01-28 05:57:11", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 257 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "9": "1", + "index": 258 + }, + { + "0": "A92EA0F2-90D5-413B-A2FE-8A91F3DA1255", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:50:57", + "9": "1", + "index": 259 + }, + { + "0": "DBC4622E-A4BD-478C-A958-D67E1C11A000", + "1": "A1759222219189020", + "2": "222.19", + "3": "3.0", + "4": "2023-01-28 08:54:40", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 260 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "9": "1", + "index": 261 + }, + { + "0": "69CEC859-4F1A-4837-8898-BAE6DBC4E1BD", + "1": "A985156998227558", + "2": "231.56", + "3": "16.0", + "4": "2023-01-28 23:47:41", + "5": "231.56", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 262 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "9": "1", + "index": 263 + }, + { + "0": "2CBAE444-87AF-4760-9B86-846E0F5A8DBF", + "1": "A1759221413220100", + "2": "999999.0", + "3": "19.0", + "4": "2023-01-29 12:43:18", + "5": "102.999897", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 264 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "9": "1", + "index": 265 + }, + { + "0": "F1FE235C-84E4-4770-BA47-2F70994718C1", + "1": "A914801011218316", + "2": "330.86", + "3": "17.0", + "4": "2023-02-12 23:03:05", + "9": "1", + "index": 266 + }, + { + "0": "B887357A-871E-425D-B17D-B1E7DF59A7EC", + "1": "A914801011218316", + "2": "224.11", + "3": "7.0", + "4": "2023-01-29 13:19:28", + "5": "224.11", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 267 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "9": "1", + "index": 268 + }, + { + "0": "3FBAFD91-D3AC-41CB-BC17-4CAAAC0C52EA", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:36:34", + "9": "1", + "index": 269 + }, + { + "0": "2CABEE6F-6606-48AA-87C9-D96C328A8C5A", + "1": "A844428046730497", + "2": "278.88", + "3": "11.0", + "4": "2023-01-29 16:24:29", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 270 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "9": "1", + "index": 271 + }, + { + "0": "56BAD8D6-088E-4AD9-99E4-2C23D10C32B0", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:48:24", + "9": "1", + "index": 272 + }, + { + "0": "494D137C-73F9-4388-B775-A97A4F2EF725", + "1": "A985156345961425", + "2": "109.99", + "3": "23.0", + "4": "2023-01-30 06:54:18", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 273 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "9": "1", + "index": 274 + }, + { + "0": "E2D03B65-3D85-4453-902F-6AED9194A7AD", + "1": "A1899946969878610", + "2": "65.54", + "3": "13.0", + "4": "2023-01-30 18:38:24", + "5": "65.54", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 275 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "9": "1", + "index": 276 + }, + { + "0": "C4286407-3D76-4187-8FD8-EEF5CE3E26A2", + "1": "A844428047343854", + "2": "106.24", + "3": "19.0", + "4": "2023-02-01 01:23:58", + "5": "106.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 277 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "9": "1", + "index": 278 + }, + { + "0": "0C064A95-7D41-4C84-A18E-816228CAB89E", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:56:13", + "9": "1", + "index": 279 + }, + { + "0": "8C0CDFD5-0A74-405D-9360-B99DC5F5A658", + "1": "A1829582571100710", + "2": "239.51", + "3": "16.0", + "4": "2023-02-01 21:54:42", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 280 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "9": "1", + "index": 281 + }, + { + "0": "E261B8E8-F241-46F3-89AA-5CC0283C8040", + "1": "A985156999024771", + "2": "92.5", + "3": "2.0", + "4": "2023-02-01 10:37:54", + "9": "1", + "index": 282 + }, + { + "0": "D4C38B0B-DFEF-4F21-A66B-AC87B626BBFA", + "1": "A985156999024771", + "2": "93.07", + "3": "6.0", + "4": "2023-02-02 14:35:38", + "5": "93.07", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 283 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "9": "1", + "index": 284 + }, + { + "0": "105FE6E4-4E43-4042-937C-4E6748781A3D", + "1": "A914801012822158", + "2": "92.63", + "3": "0.0", + "4": "2023-02-03 05:37:23", + "9": "1", + "index": 285 + }, + { + "0": "6BA9D314-0ECC-425F-BCA8-FE3DC74581C8", + "1": "A914801012822158", + "2": "104.25", + "3": "6.0", + "4": "2023-02-01 11:41:23", + "9": "1", + "index": 286 + }, + { + "0": "F69ECCC1-8BF7-48B4-80D8-75CF064D6017", + "1": "A914801012822158", + "2": "92.2", + "3": "9.0", + "4": "2023-02-02 14:42:25", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 287 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "9": "1", + "index": 288 + }, + { + "0": "A5D379FD-D933-4F68-8763-0C5AF07F7834", + "1": "A914801013785993", + "2": "86.98", + "3": "4.0", + "4": "2023-02-03 09:47:07", + "9": "1", + "index": 289 + }, + { + "0": "E904965B-8DFE-4819-80DF-FE6E0F50F4E4", + "1": "A914801013785993", + "2": "95.02", + "3": "9.0", + "4": "2023-02-02 15:05:15", + "5": "95.02", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 290 + }, + { + "0": "3CFD786C-1D49-4D2D-94DA-C3A0E26ACB02", + "1": "A914801013785993", + "2": "93.94", + "3": "0.0", + "4": "2023-02-08 06:19:27", + "5": "93.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 291 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "9": "1", + "index": 292 + }, + { + "0": "AB06E897-E5CB-408B-957A-9E77B9EBD71E", + "1": "A914801013775218", + "2": "93.62", + "3": "9.0", + "4": "2023-02-02 14:49:48", + "9": "1", + "index": 293 + }, + { + "0": "C1BB5DA1-3DB9-47B3-BF4E-25C402A14AE8", + "1": "A914801013775218", + "2": "92.2", + "3": "4.0", + "4": "2023-02-03 09:41:23", + "5": "92.2", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 294 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "9": "1", + "index": 295 + }, + { + "0": "C92FFA51-901D-4F5E-AF5A-A0F05FD9EE49", + "1": "A1899946263303050", + "2": "939.0", + "3": "19.0", + "4": "2023-02-03 18:26:23", + "5": "170.67264", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 296 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "9": "1", + "index": 297 + }, + { + "0": "AF5BC5D5-9280-4F4A-860B-D8A4772823AD", + "1": "A985157000299534", + "2": "281.37", + "3": "14.0", + "4": "2023-02-03 19:43:12", + "9": "1", + "index": 298 + }, + { + "0": "3A13F395-6C81-4DD9-ABEB-FE7089DD21E2", + "1": "A985157000299534", + "2": "157.07", + "3": "14.0", + "4": "2023-02-03 19:29:54", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 299 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "9": "1", + "index": 300 + }, + { + "0": "F5F315E9-DA90-463E-B981-7D7EB8FFB197", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:37:59", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 301 + }, + { + "0": "AFC2F084-490B-4B4F-AF6A-05B999BC0C81", + "1": "A914801014875116", + "2": "238.14", + "3": "15.0", + "4": "2023-02-03 20:45:40", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 302 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "9": "1", + "index": 303 + }, + { + "0": "0EE3572D-7311-4F07-B930-0A89C79983EF", + "1": "A985156712327404", + "2": "219.99", + "3": "17.0", + "4": "2023-02-04 18:18:08", + "5": "346.462251", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 304 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "9": "1", + "index": 305 + }, + { + "0": "ECC38318-E094-4FAA-9638-6C664AB49DB8", + "1": "A985157000491580", + "2": "299.0", + "3": "19.0", + "4": "2023-02-05 10:03:12", + "9": "1", + "index": 306 + }, + { + "0": "EE5AF4F5-3678-4552-90BF-C178A1073A13", + "1": "A985157000491580", + "2": "399.99", + "3": "19.0", + "4": "2023-02-05 09:42:29", + "5": "418.129547", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 307 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "9": "1", + "index": 308 + }, + { + "0": "A0F3B9E3-5B99-4E62-99BC-3159F5F3C5D0", + "1": "A914800550439914", + "2": "157.07", + "3": "11.0", + "4": "2023-02-05 16:23:11", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 309 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "9": "1", + "index": 310 + }, + { + "0": "E23AEB7C-E6E5-45AC-BF52-15318F230F7C", + "1": "A1688852408331370", + "2": "159.85", + "3": "17.0", + "4": "2023-02-05 21:21:44", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 311 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "9": "1", + "index": 312 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "9": "1", + "index": 313 + }, + { + "0": "DE6C7FAE-FE3C-4316-8585-6C5942D43B19", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:24:03", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 314 + }, + { + "0": "AC844DF5-52D9-4A71-A6B8-690139185C7B", + "1": "A1055521395382470", + "2": "153.29", + "3": "20.0", + "4": "2023-02-06 04:27:22", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 315 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "9": "1", + "index": 316 + }, + { + "0": "1ACA02AF-1E19-429B-9C7E-B62584B5F770", + "1": "A914801018475755", + "2": "149.93", + "3": "18.0", + "4": "2023-02-07 01:48:31", + "5": "149.93", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 317 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "9": "1", + "index": 318 + }, + { + "0": "8F4A2E5B-152F-45DB-B0E1-77EB964422F4", + "1": "A844428050423122", + "2": "64.49", + "3": "7.0", + "4": "2023-02-07 12:22:26", + "5": "64.49", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 319 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "9": "1", + "index": 320 + }, + { + "0": "6F7F79E1-1A74-4AF6-9706-830302FC7942", + "1": "A844428029043738", + "2": "21.6", + "3": "10.0", + "4": "2023-02-07 17:01:22", + "5": "21.6", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 321 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "9": "1", + "index": 322 + }, + { + "0": "5403C73E-98E5-47B4-B3A8-82335C48C6C0", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:38:33", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 323 + }, + { + "0": "9B6410A2-B896-4E0E-9929-B3D3FF23D091", + "1": "A1055521396853140", + "2": "150.49", + "3": "18.0", + "4": "2023-02-09 00:43:38", + "5": "150.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 324 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "9": "1", + "index": 325 + }, + { + "0": "04A6E453-2077-4703-BA51-A0803BBC7F94", + "1": "A564049508937862", + "2": "99.0", + "4": "2023-02-09 07:53:48", + "5": "99.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 326 + }, + { + "0": "23FB57DD-40E6-49D4-8F47-29EC2357E548", + "1": "A564049508937862", + "2": "0.0", + "4": "2023-03-06 19:52:07", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 327 + }, + { + "0": "EC085107-C5DF-4814-8E31-374D3D8BD5AD", + "1": "A564049508937862", + "2": "482.68", + "3": "10.0", + "4": "2023-03-06 18:31:45", + "5": "482.68", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 328 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "9": "1", + "index": 329 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "9": "1", + "index": 330 + }, + { + "0": "A6C7101E-7794-4149-A00C-86F43AC4AF08", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 13:59:50", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 331 + }, + { + "0": "14284612-9202-42B8-B994-098182BD9553", + "1": "A1055521397087470", + "2": "299.0", + "3": "23.0", + "4": "2023-02-09 14:07:44", + "5": "312.55965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 332 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "9": "1", + "index": 333 + }, + { + "0": "4D150B63-9F3D-4A5E-A899-FECAF11AA4FE", + "1": "A985156107272519", + "2": "118.79", + "3": "11.0", + "4": "2023-02-09 17:02:14", + "5": "118.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 334 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "9": "1", + "index": 335 + }, + { + "0": "0D385B17-41FC-4D3B-8C36-BFD0FAF6AA20", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:26:33", + "9": "1", + "index": 336 + }, + { + "0": "F8226068-961C-4004-9061-B71F6C1665A2", + "1": "A1688853647452210", + "2": "423.99", + "3": "13.0", + "4": "2023-02-09 18:23:44", + "5": "423.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 337 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "9": "1", + "index": 338 + }, + { + "0": "EC41414F-5244-47AC-9F4F-DC7EAF66FA86", + "1": "A985156344741724", + "2": "239.0", + "3": "22.0", + "4": "2023-02-10 01:50:17", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 339 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "9": "1", + "index": 340 + }, + { + "0": "F6D8E9B1-CC74-48F9-B46C-F74DE6E82491", + "1": "A1759220976223180", + "2": "1079.0", + "3": "12.0", + "4": "2023-02-12 16:12:13", + "5": "542.25145", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 341 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "9": "1", + "index": 342 + }, + { + "0": "704EA48E-FAA1-485B-88C9-6F3E21CAC2E7", + "1": "A914800134032375", + "2": "109.99", + "3": "17.0", + "4": "2023-02-12 22:52:26", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 343 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "9": "1", + "index": 344 + }, + { + "0": "DA660AD0-C47C-4012-9B2A-A74B9867F517", + "1": "A1829581642988470", + "2": "239.0", + "3": "17.0", + "4": "2023-02-13 20:58:33", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 345 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "9": "1", + "index": 346 + }, + { + "0": "B5550A72-81D1-4F96-8294-690A060C0071", + "1": "A1688853605359930", + "2": "66.05", + "3": "19.0", + "4": "2023-02-14 01:09:37", + "5": "66.05", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 347 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "9": "1", + "index": 348 + }, + { + "0": "8B6010EB-EB1A-4AFE-9E41-0EB3FFF81CC7", + "1": "A844428024841325", + "2": "149.79", + "3": "6.0", + "4": "2023-02-14 12:06:06", + "5": "149.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 349 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "9": "1", + "index": 350 + }, + { + "0": "2EA5AE02-F407-41D5-98D6-EBC2C4BF9DD2", + "1": "A1055521007937570", + "2": "1154.4", + "3": "10.0", + "4": "2023-02-14 18:35:02", + "5": "1154.4", + "6": "false", + "7": "0.0", + "8": "3.0", + "9": "1", + "index": 351 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "9": "1", + "index": 352 + }, + { + "0": "44D80959-7137-4EDB-AEEE-1B7654A9A2A2", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-23 01:16:41", + "9": "1", + "index": 353 + }, + { + "0": "209C8814-08A3-4199-99FE-B7E3C99EB101", + "1": "A1055521400546730", + "2": "119.99", + "4": "2023-02-14 20:25:30", + "5": "119.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 354 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "9": "1", + "index": 355 + }, + { + "0": "C173A9A3-90B7-4B38-8DAC-D001CDD47814", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:51:29", + "9": "1", + "index": 356 + }, + { + "0": "76824E16-8144-4C10-8769-DF9049DE4BB3", + "1": "A1899946873128090", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 03:38:31", + "9": "1", + "index": 357 + }, + { + "0": "D141370E-DD9D-4316-A2F9-A5D8244C61A2", + "1": "A1899946873128090", + "2": "119.98", + "3": "20.0", + "4": "2023-02-15 02:37:52", + "9": "1", + "index": 358 + }, + { + "0": "673A772C-71A1-4541-8468-7298A4FC0844", + "1": "A1899946873128090", + "2": "75.58", + "3": "20.0", + "4": "2023-02-15 02:34:45", + "9": "1", + "index": 359 + }, + { + "0": "64C56D07-3CE5-42DD-8ACD-86FCEC01CC7A", + "1": "A1899946873128090", + "2": "127.48", + "3": "22.0", + "4": "2023-02-15 03:48:42", + "5": "127.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 360 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "9": "1", + "index": 361 + }, + { + "0": "0C8F4CEC-54F7-44BE-A57B-CC2382BA5B2B", + "1": "A1688853524309620", + "2": "119.98", + "3": "22.0", + "4": "2023-02-15 04:46:23", + "5": "119.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 362 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "9": "1", + "index": 363 + }, + { + "0": "2616D25E-605D-4D13-A747-8056ACC9FECC", + "1": "A1759221088015650", + "2": "239.0", + "3": "14.0", + "4": "2023-02-15 18:07:30", + "5": "120.10945", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 364 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "9": "1", + "index": 365 + }, + { + "0": "976B65D5-19C3-48A1-A57A-E67899D3E4DE", + "1": "A1688853660541850", + "2": "105.98", + "3": "14.0", + "4": "2023-02-15 20:12:39", + "5": "105.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 366 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "9": "1", + "index": 367 + }, + { + "0": "7C52F75A-B38D-4E3A-8C91-83F9FC04A0FB", + "1": "A1829582583894660", + "2": "59.99", + "3": "15.0", + "4": "2023-02-15 20:21:36", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 368 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "9": "1", + "index": 369 + }, + { + "0": "E1DF3460-24B4-43A6-9E8C-8432ED03D018", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:36:32", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 370 + }, + { + "0": "BD6E876C-4420-4359-B25A-35BE542F82C0", + "1": "A362840681200346", + "2": "159.85", + "3": "16.0", + "4": "2023-02-15 20:30:03", + "5": "159.189819", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 371 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "9": "1", + "index": 372 + }, + { + "0": "66F28A11-228E-4CF9-9872-0677EF57CCCD", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:50:09", + "9": "1", + "index": 373 + }, + { + "0": "DC52C196-52BA-45B3-9C3A-50EEAAF9A12E", + "1": "A985156921982186", + "2": "50.49", + "3": "15.0", + "4": "2023-02-15 20:36:44", + "5": "50.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 374 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "9": "1", + "index": 375 + }, + { + "0": "077961F4-BD88-4A14-9607-D267E3882119", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:57:34", + "9": "1", + "index": 376 + }, + { + "0": "6083FE06-FDAB-4725-8CB2-DDB0B978E826", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 11:58:56", + "9": "1", + "index": 377 + }, + { + "0": "0D20ED93-B1A8-4C3D-A492-FB63C8C2D3D6", + "1": "A1688853596363060", + "2": "60.59", + "3": "6.0", + "4": "2023-02-16 12:00:13", + "5": "60.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 378 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "9": "1", + "index": 379 + }, + { + "0": "3826E27E-AAFD-4443-A7E9-A0586D2F0729", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:26:58", + "9": "1", + "index": 380 + }, + { + "0": "1517BB82-21EB-40EF-AF3D-65614C90297C", + "1": "A1829582583896790", + "2": "127.18", + "3": "7.0", + "4": "2023-02-16 12:25:13", + "5": "127.18", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 381 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "9": "1", + "index": 382 + }, + { + "0": "5BDE388B-8A30-4D45-8122-F7CA341442C8", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 13:00:25", + "9": "1", + "index": 383 + }, + { + "0": "CF2FC7F2-2924-4EC3-8951-1F5785BE3003", + "1": "A914800889932462", + "2": "53.36", + "3": "6.0", + "4": "2023-02-16 12:58:46", + "5": "53.36", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 384 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "9": "1", + "index": 385 + }, + { + "0": "1935138A-D934-4B52-B3F5-FA99C47F03AC", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:40:57", + "9": "1", + "index": 386 + }, + { + "0": "10366C01-E5BE-4DD8-BD52-1B22971F1F4B", + "1": "A1688853596241210", + "2": "65.31", + "3": "22.0", + "4": "2023-02-17 03:39:39", + "9": "1", + "index": 387 + }, + { + "0": "CBCE65DD-1D82-4C65-91BD-683020CF1D6E", + "1": "A1688853596241210", + "2": "59.99", + "3": "6.0", + "4": "2023-02-16 12:54:17", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 388 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "9": "1", + "index": 389 + }, + { + "0": "52961216-05ED-4183-8EF5-5237F0352C41", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:17:31", + "9": "1", + "index": 390 + }, + { + "0": "1E0E93F8-6B15-40BA-ACE4-77CF9B527E0C", + "1": "A1899946944829860", + "2": "59.99", + "3": "7.0", + "4": "2023-02-16 13:16:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 391 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "9": "1", + "index": 392 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "9": "1", + "index": 393 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "9": "1", + "index": 394 + }, + { + "0": "294A76D1-B583-432B-AA49-F32AA4974B94", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:50:47", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 395 + }, + { + "0": "0C044F40-9685-4113-882F-D605AAD744BE", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:52:42", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 396 + }, + { + "0": "72B7AED1-0944-4DE8-8BEF-74680BBAC3F1", + "1": "A1829582519832190", + "2": "59.99", + "3": "8.0", + "4": "2023-02-16 13:55:28", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 397 + }, + { + "0": "1901E38A-A427-4BA3-8C82-C9DB2B8C2735", + "1": "A1829582519832190", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 08:15:30", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 398 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "9": "1", + "index": 399 + }, + { + "0": "4FD412FF-3716-4007-8C81-80FDA381E04A", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:37:03", + "9": "1", + "index": 400 + }, + { + "0": "17D5B8ED-6683-4647-B551-D2BBE8C798E5", + "1": "A914800889937190", + "2": "53.11", + "3": "13.0", + "4": "2023-02-16 18:28:59", + "5": "53.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 401 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "9": "1", + "index": 402 + }, + { + "0": "E9AE2FFC-1BA4-45CC-858C-DCE5E3BA51B8", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:51:45", + "9": "1", + "index": 403 + }, + { + "0": "3A0ABDCD-6F28-4C1F-BE5A-F341A4084E50", + "1": "A1759222105153830", + "2": "108.38", + "3": "10.0", + "4": "2023-02-16 18:54:15", + "5": "108.38", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 404 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "9": "1", + "index": 405 + }, + { + "0": "D74E0304-9D1B-40AC-8418-33C7FD7FDBD9", + "1": "A844428056745591", + "2": "249.95", + "3": "12.0", + "4": "2023-02-16 20:40:53", + "9": "1", + "index": 406 + }, + { + "0": "DCCC41EB-D464-4684-B53D-C89C70D194B3", + "1": "A844428056745591", + "2": "49.99", + "3": "12.0", + "4": "2023-02-16 20:29:30", + "5": "49.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 407 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "9": "1", + "index": 408 + }, + { + "0": "07C1A129-EF6A-4B87-BFE4-C4D4CDF7049B", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:01:39", + "9": "1", + "index": 409 + }, + { + "0": "AAC80D62-E482-4488-801A-941B8B43E034", + "1": "A844427926468579", + "2": "54.11", + "3": "0.0", + "4": "2023-02-17 06:06:01", + "5": "54.11", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 410 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "9": "1", + "index": 411 + }, + { + "0": "88869C17-D26A-476A-95C9-A6E93170CA62", + "1": "A1688853596360510", + "2": "65.16", + "3": "0.0", + "4": "2023-02-17 06:07:08", + "5": "65.16", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 412 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "9": "1", + "index": 413 + }, + { + "0": "2DD082E0-85FA-4967-91C7-FB34908A1D89", + "1": "A1759222168021270", + "2": "63.95", + "3": "0.0", + "4": "2023-02-17 06:35:22", + "5": "63.95", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 414 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "9": "1", + "index": 415 + }, + { + "0": "D1119E3D-720D-46A4-9772-C456EA3B0D4D", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:46:16", + "9": "1", + "index": 416 + }, + { + "0": "ABA4D27A-EDFF-47E7-9F92-DE6F02753299", + "1": "A1688853596356500", + "2": "59.99", + "3": "1.0", + "4": "2023-02-17 06:50:03", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 417 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "9": "1", + "index": 418 + }, + { + "0": "B3FFE8F1-6D4D-49FF-9DC6-97E3F78B18E1", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:49:50", + "9": "1", + "index": 419 + }, + { + "0": "A6A32094-B81A-4B70-B184-7B74C5B694CB", + "1": "A1829582189343980", + "2": "129.34", + "3": "2.0", + "4": "2023-02-17 07:51:54", + "5": "129.34", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 420 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "9": "1", + "index": 421 + }, + { + "0": "4B1F2669-E141-4218-8048-95E751DCF8F1", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:54:20", + "9": "1", + "index": 422 + }, + { + "0": "87FD50BB-5621-4778-9CBF-604522DDC605", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:36:43", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 423 + }, + { + "0": "FBB33185-B7C4-47B3-9118-11693E3BE83C", + "1": "A1759222167950540", + "2": "59.99", + "3": "23.0", + "4": "2023-02-17 07:35:34", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 424 + }, + { + "0": "7C8DB972-42E3-4C98-B13B-C338C0714D3F", + "1": "A1759222167950540", + "2": "59.99", + "3": "2.0", + "4": "2023-02-17 07:55:32", + "5": "59.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 425 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "9": "1", + "index": 426 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "9": "1", + "index": 427 + }, + { + "0": "A23C51AD-50BC-4719-B489-A29643BB3C74", + "1": "A1829582519835540", + "2": "59.99", + "3": "4.0", + "4": "2023-02-17 11:20:25", + "9": "1", + "index": 428 + }, + { + "0": "2589C5DD-012D-429C-A3C1-8333C3ECE2A4", + "1": "A1829582519835540", + "2": "59.99", + "3": "5.0", + "4": "2023-02-17 11:22:08", + "9": "1", + "index": 429 + }, + { + "0": "8CF41C6B-5E7A-44FD-B4F4-975432C25086", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:15:04", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 430 + }, + { + "0": "DF029819-0B5D-4201-8195-325BE6202E50", + "1": "A1829582519835540", + "2": "63.59", + "3": "23.0", + "4": "2023-02-17 08:12:30", + "5": "63.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 431 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "9": "1", + "index": 432 + }, + { + "0": "11EDBDC9-2F68-4E09-8DB8-FB0D9B70B121", + "1": "A1899947003739520", + "2": "239.24", + "3": "5.0", + "4": "2023-02-17 12:13:53", + "5": "239.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 433 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "9": "1", + "index": 434 + }, + { + "0": "56176B76-FFD4-4252-8BAD-C8F0E105EE2E", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 11:52:43", + "9": "1", + "index": 435 + }, + { + "0": "0B666A57-4CBF-411F-A855-A7B615726FED", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:11:06", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 436 + }, + { + "0": "9D2F95B4-73B9-4427-88FF-B82EB58087BB", + "1": "A985157008993462", + "2": "105.48", + "3": "5.0", + "4": "2023-02-17 12:03:05", + "5": "105.48", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 437 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "9": "1", + "index": 438 + }, + { + "0": "DE2C2A1F-DE62-4A91-8FB1-D40C46B96DF6", + "1": "A985157009164620", + "2": "151.54", + "3": "10.0", + "4": "2023-02-17 17:00:01", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 439 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "9": "1", + "index": 440 + }, + { + "0": "F815E0BF-EDEA-40BF-9CA7-E529C895BA5E", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:24:44", + "9": "1", + "index": 441 + }, + { + "0": "FC750F5F-8402-4006-AFAC-4DD63C61F2F2", + "1": "A985156554634689", + "2": "116.86", + "3": "14.0", + "4": "2023-02-17 19:22:51", + "5": "116.86", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 442 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "9": "1", + "index": 443 + }, + { + "0": "53FB03E4-3872-4E94-B597-12F0C1C8E38D", + "1": "A360434769010983", + "2": "149.44", + "3": "15.0", + "4": "2023-02-17 21:06:39", + "5": "149.44", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 444 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "9": "1", + "index": 445 + }, + { + "0": "93796897-06CD-4111-8F2D-E27D5CE46B66", + "1": "A844427218518467", + "2": "157.94", + "3": "18.0", + "4": "2023-02-17 23:30:32", + "9": "1", + "index": 446 + }, + { + "0": "EA959383-BCF0-465E-AF30-DC2E5938E855", + "1": "A844427218518467", + "2": "157.94", + "3": "15.0", + "4": "2023-02-17 21:13:23", + "5": "157.94", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 447 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "9": "1", + "index": 448 + }, + { + "0": "F461D35F-457F-40E7-BF42-4C116CF0D921", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:48:49", + "9": "1", + "index": 449 + }, + { + "0": "6645E186-2EE1-4F51-883A-7C4333C753C3", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 22:08:38", + "9": "1", + "index": 450 + }, + { + "0": "51D66EFC-6211-4DF0-BB4C-1BCE5F248330", + "1": "A296624604869030", + "2": "139.99", + "3": "13.0", + "4": "2023-02-17 21:59:16", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 451 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "9": "1", + "index": 452 + }, + { + "0": "8B634588-BDD1-4B61-B2C0-00A24CD77D7B", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:07:01", + "9": "1", + "index": 453 + }, + { + "0": "7F5B344A-6274-4032-94D2-A21461F977A2", + "1": "A914801025693987", + "2": "278.88", + "3": "19.0", + "4": "2023-02-18 02:01:07", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 454 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "9": "1", + "index": 455 + }, + { + "0": "5F25E7A1-C8CF-4262-9365-D8D8BBADBD2A", + "1": "A1055520529067390", + "2": "163.16", + "3": "21.0", + "4": "2023-02-18 06:00:32", + "5": "163.16", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 456 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "9": "1", + "index": 457 + }, + { + "0": "C37B550B-F3BB-4C9A-9A7F-5133D4C9496C", + "1": "A1829582514718140", + "2": "238.14", + "3": "0.0", + "4": "2023-02-18 07:08:45", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 458 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "9": "1", + "index": 459 + }, + { + "0": "A891E91F-34EB-47BE-87EC-EF06767A0E5E", + "1": "A914801026387229", + "2": "301.26", + "3": "19.0", + "4": "2023-02-19 04:03:58", + "5": "301.26", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 460 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "9": "1", + "index": 461 + }, + { + "0": "29111CE5-5A24-49BB-A358-0793FC585801", + "1": "A985157010264242", + "2": "73080.0", + "3": "15.0", + "4": "2023-02-19 07:09:04", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 462 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "9": "1", + "index": 463 + }, + { + "0": "DBECA025-8715-4299-B743-F2DC5C5D32FA", + "1": "A985157010653462", + "2": "80.92", + "3": "9.0", + "4": "2023-02-19 18:10:09", + "5": "80.92", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 464 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "9": "1", + "index": 465 + }, + { + "0": "2C8A9E18-E28E-4555-B5F9-98F0D34FCEAE", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:48:28", + "9": "1", + "index": 466 + }, + { + "0": "624230B8-10F5-4BA5-A45B-BFF259872D75", + "1": "A985157010652653", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-19 18:58:36", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 467 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "9": "1", + "index": 468 + }, + { + "0": "F558D2DF-78BC-4A0E-A230-4B7291A94F78", + "1": "A1899946887996110", + "2": "235.39", + "3": "18.0", + "4": "2023-02-19 23:48:56", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 469 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "9": "1", + "index": 470 + }, + { + "0": "A9A9B9C3-90F1-4BD3-9217-0EA2828D65B2", + "1": "A914800654351337", + "2": "148.74", + "3": "9.0", + "4": "2023-02-20 15:56:57", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 471 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "9": "1", + "index": 472 + }, + { + "0": "104D3F8D-6772-4535-AC30-D78279A10F53", + "1": "A914801027937767", + "2": "149.99", + "3": "14.0", + "4": "2023-02-21 05:05:44", + "5": "156.792046", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 473 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "9": "1", + "index": 474 + }, + { + "0": "AA345197-EC08-4848-9F43-97862C99593E", + "1": "A914801028323265", + "2": "150.31", + "3": "12.0", + "4": "2023-02-21 19:00:49", + "5": "150.31", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 475 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "9": "1", + "index": 476 + }, + { + "0": "2389B79E-4A88-416B-BF63-86DDD4CE0095", + "1": "A985156821621035", + "2": "152.03", + "3": "22.0", + "4": "2023-02-22 05:28:18", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 477 + }, + { + "0": "EA8C66F4-8916-4822-85FA-583C2186501A", + "1": "A985156821621035", + "2": "152.03", + "3": "21.0", + "4": "2023-02-22 05:05:07", + "5": "152.03", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 478 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "9": "1", + "index": 479 + }, + { + "0": "0E1A2979-7A26-4C95-AFDE-E391961B3467", + "1": "A1899946781631740", + "2": "233.74", + "3": "6.0", + "4": "2023-02-22 12:26:38", + "5": "233.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 480 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "9": "1", + "index": 481 + }, + { + "0": "EC8BF756-2E01-4485-9B7E-12363CAAE435", + "1": "A1688853432603810", + "2": "238.14", + "3": "5.0", + "4": "2023-02-22 12:12:28", + "5": "238.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 482 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "9": "1", + "index": 483 + }, + { + "0": "E70D13AE-274C-404F-B2C2-F1AF18F702B3", + "1": "A1055521405851730", + "2": "85.59", + "4": "2023-02-22 14:29:05", + "5": "85.59", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 484 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "9": "1", + "index": 485 + }, + { + "0": "6FEBCE16-D75E-4426-92B8-7F7A9CE058BB", + "1": "A1055521406108610", + "2": "973.17", + "3": "11.0", + "4": "2023-02-22 17:39:23", + "5": "973.17", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 486 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "9": "1", + "index": 487 + }, + { + "0": "35AC8DA0-24ED-4461-B732-7994EAC7AD2C", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:23:47", + "9": "1", + "index": 488 + }, + { + "0": "5D333262-9627-4E42-84EA-615E7031CD48", + "1": "A1055521406038580", + "2": "73080.0", + "3": "3.0", + "4": "2023-02-22 18:29:43", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 489 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "9": "1", + "index": 490 + }, + { + "0": "12E12CAD-EC37-4E94-8D22-38BBE241C040", + "1": "A1899947010057920", + "2": "5097.0", + "3": "14.0", + "4": "2023-02-23 05:22:36", + "5": "656.95233", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 491 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "9": "1", + "index": 492 + }, + { + "0": "BF43B590-100C-49DE-8DE2-F4F0462CC9CC", + "1": "A844428061406186", + "2": "1091.15", + "3": "8.0", + "4": "2023-02-23 14:56:14", + "5": "1091.15", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 493 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "9": "1", + "index": 494 + }, + { + "0": "4A729E60-7E0A-4080-88C8-A81656F18A24", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:49:26", + "9": "1", + "index": 495 + }, + { + "0": "4845B1D4-5FDF-49EA-B755-594CBEF3B4E6", + "1": "A1829582358242680", + "2": "239.51", + "3": "9.0", + "4": "2023-02-23 14:52:47", + "5": "239.51", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 496 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "9": "1", + "index": 497 + }, + { + "0": "18C1A371-128D-4C3E-BFA3-AD8A96C5A26E", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:23:32", + "9": "1", + "index": 498 + }, + { + "0": "32E64963-58DD-4FBC-9125-ED1ACBFE62EF", + "1": "A1899946781648580", + "2": "228.79", + "3": "9.0", + "4": "2023-02-23 15:26:52", + "5": "228.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 499 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "9": "1", + "index": 500 + }, + { + "0": "A02AA3CD-C055-4B0D-93B3-5D84CFDED0D7", + "1": "A1759222251254350", + "2": "516.24", + "3": "12.0", + "4": "2023-02-21 17:46:31", + "9": "1", + "index": 501 + }, + { + "0": "6BC0D760-19D3-41AB-B24A-87509876A25B", + "1": "A1759222251254350", + "2": "516.24", + "3": "10.0", + "4": "2023-02-23 18:27:57", + "5": "514.107929", + "6": "true", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 502 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "9": "1", + "index": 503 + }, + { + "0": "8A753C7E-56CE-4D4C-8910-767868183DD5", + "1": "A914801029782303", + "2": "148.74", + "3": "18.0", + "4": "2023-02-24 00:19:09", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 504 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "9": "1", + "index": 505 + }, + { + "0": "021535A3-03BA-43FF-9ADF-9EB8ED0DCCD2", + "1": "A844427388621092", + "2": "85.59", + "3": "19.0", + "4": "2023-02-24 00:35:20", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 506 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "9": "1", + "index": 507 + }, + { + "0": "C6FD141A-3BE6-49A4-84BE-421F35CA31B2", + "1": "A914800247987042", + "2": "21.71", + "3": "19.0", + "4": "2023-02-24 00:50:43", + "5": "21.71", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 508 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "9": "1", + "index": 509 + }, + { + "0": "D7E5266B-1C45-4BAA-AAEC-15D771DDF4D9", + "1": "A1055521406380930", + "2": "139.99", + "3": "19.0", + "4": "2023-02-24 01:12:56", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 510 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "9": "1", + "index": 511 + }, + { + "0": "761ADA43-FAD5-44FC-877C-82B8FD06CA58", + "1": "A311880327984872", + "2": "109.99", + "3": "11.0", + "4": "2023-02-24 17:06:07", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 512 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "9": "1", + "index": 513 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "9": "1", + "index": 514 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "9": "1", + "index": 515 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "9": "1", + "index": 516 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "9": "1", + "index": 517 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "9": "1", + "index": 518 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "9": "1", + "index": 519 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "9": "1", + "index": 520 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "9": "1", + "index": 521 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "9": "1", + "index": 522 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "9": "1", + "index": 523 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "9": "1", + "index": 524 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "9": "1", + "index": 525 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "9": "1", + "index": 526 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "9": "1", + "index": 527 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "9": "1", + "index": 528 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "9": "1", + "index": 529 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "9": "1", + "index": 530 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "9": "1", + "index": 531 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "9": "1", + "index": 532 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "9": "1", + "index": 533 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "9": "1", + "index": 534 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "9": "1", + "index": 535 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "9": "1", + "index": 536 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "9": "1", + "index": 537 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "9": "1", + "index": 538 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "9": "1", + "index": 539 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "9": "1", + "index": 540 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "9": "1", + "index": 541 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "9": "1", + "index": 542 + }, + { + "0": "42FC2159-6C83-4CBE-A323-DE9E0546A311", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:34:38", + "9": "1", + "index": 543 + }, + { + "0": "5CAB8F98-F87D-4FB5-8647-F83EF559A9E7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:22", + "9": "1", + "index": 544 + }, + { + "0": "8FBB1DE1-60CE-4F82-A2E8-8CBAB946FED7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:19:02", + "9": "1", + "index": 545 + }, + { + "0": "6EB304F3-0D0F-4767-BFBB-2ACD515CAA42", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:37:35", + "9": "1", + "index": 546 + }, + { + "0": "33615076-74BA-414F-A51C-470C5AFD1FD7", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:37", + "9": "1", + "index": 547 + }, + { + "0": "A6FD29AF-1C86-4558-8D18-89D7F53EC691", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:54", + "9": "1", + "index": 548 + }, + { + "0": "4A4AF956-41C3-4723-8BAD-527243728FE8", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:54", + "9": "1", + "index": 549 + }, + { + "0": "FFF0CCE8-07E1-4100-9491-2853222482EF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:44:10", + "9": "1", + "index": 550 + }, + { + "0": "8DDECA4B-95EF-4FAD-8781-99F8134532FF", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:51", + "9": "1", + "index": 551 + }, + { + "0": "E498A57D-E5CF-4883-932E-6B39D7CFF7A0", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:38:18", + "9": "1", + "index": 552 + }, + { + "0": "6DA73B9F-D74B-45A7-82F7-FD10B2840483", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:18", + "9": "1", + "index": 553 + }, + { + "0": "C4F7FAB1-FE05-4F4D-8E52-8C6A3EE96115", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:10", + "9": "1", + "index": 554 + }, + { + "0": "F0A25208-F9BB-401D-A840-36823FB1B0A8", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:34:16", + "9": "1", + "index": 555 + }, + { + "0": "E8CA30F7-3805-48E0-A5E6-6FD71ACF2BE2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:11:36", + "9": "1", + "index": 556 + }, + { + "0": "947519EE-C2DE-42CC-A5CA-B075AEEA05D3", + "1": "A844427390246047", + "2": "5.39", + "3": "22.0", + "4": "2023-02-26 03:30:51", + "9": "1", + "index": 557 + }, + { + "0": "0DF72AD1-2DFD-404E-88A8-965334D9F227", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:38:07", + "9": "1", + "index": 558 + }, + { + "0": "B44556BB-1C72-4B05-B89B-8B078FE110FC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:46", + "9": "1", + "index": 559 + }, + { + "0": "17DA4A53-7EDF-4FE4-A997-3C9AF9255294", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:42:04", + "9": "1", + "index": 560 + }, + { + "0": "4AD79610-DF94-40EA-AA57-0D0C4C107950", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:19", + "9": "1", + "index": 561 + }, + { + "0": "D2155FC9-8E47-46A6-B8F3-1395DECE7D82", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:35:07", + "9": "1", + "index": 562 + }, + { + "0": "C869ECF0-2A2F-4898-BC65-AD6422144BA5", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:17:22", + "9": "1", + "index": 563 + }, + { + "0": "D1C8D053-633E-457E-AAE3-2CC1801EC80B", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:22:13", + "9": "1", + "index": 564 + }, + { + "0": "411DF6C0-02DE-4D70-977B-EF261BF1D4A1", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:43:06", + "9": "1", + "index": 565 + }, + { + "0": "7E42BCAB-5590-41AD-A18E-8964C2D9CDAA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:38", + "9": "1", + "index": 566 + }, + { + "0": "10F2E1BB-B84B-425E-9CF4-1E9A6AB041D8", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:28:28", + "9": "1", + "index": 567 + }, + { + "0": "CCA3EB41-5AB7-4C77-AFD0-BC552C95E019", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:30", + "9": "1", + "index": 568 + }, + { + "0": "5C9ABE6A-E977-4767-BCC8-A9A0952DB43A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:19:49", + "9": "1", + "index": 569 + }, + { + "0": "1731D105-5F5C-4CEE-955B-AD9B4372603D", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:32:27", + "9": "1", + "index": 570 + }, + { + "0": "CDD70229-CFCE-4192-829D-980CC5F0AD96", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:30:20", + "9": "1", + "index": 571 + }, + { + "0": "69A8BDFE-9310-4098-B8E9-D5C0D938E851", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:43:02", + "9": "1", + "index": 572 + }, + { + "0": "1E8F78CA-543C-46F5-A429-593B1B48D8E9", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:33:02", + "9": "1", + "index": 573 + }, + { + "0": "06CF9747-053E-4361-8048-CD6D0F16812C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:31", + "9": "1", + "index": 574 + }, + { + "0": "9606F304-48F8-47E9-A666-2BD97690632F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:51:47", + "9": "1", + "index": 575 + }, + { + "0": "A7FC7EAE-BB1E-4E93-8BFE-E9C1B71792AB", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:49", + "9": "1", + "index": 576 + }, + { + "0": "086FDEAF-BF57-4B51-93F4-169E3609D287", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:44", + "9": "1", + "index": 577 + }, + { + "0": "C54EC40B-86FC-497A-A701-8FBDE5A2375D", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:08:37", + "9": "1", + "index": 578 + }, + { + "0": "D797769A-8A65-47DF-8473-35A29AC81B24", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:15:33", + "9": "1", + "index": 579 + }, + { + "0": "7B14E6C6-F218-4C61-A29A-B3157D7A0E4A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:55", + "9": "1", + "index": 580 + }, + { + "0": "9E41C0F4-5345-4439-B996-52841214F9FE", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:15", + "9": "1", + "index": 581 + }, + { + "0": "7F6AEAAA-ED61-4163-8C5E-289FB74045B4", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:23", + "9": "1", + "index": 582 + }, + { + "0": "D81F2077-E5A4-4DCC-85CB-5D37243F3386", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:53:36", + "9": "1", + "index": 583 + }, + { + "0": "47E230FD-DD71-432D-8EDA-F6F721A0611B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:56:09", + "9": "1", + "index": 584 + }, + { + "0": "70A54CA5-D32A-4DB1-8F56-B406D827A7B7", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:08:34", + "9": "1", + "index": 585 + }, + { + "0": "A76875A6-59E2-4D02-8FF1-48EADE6B83A7", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:00:13", + "9": "1", + "index": 586 + }, + { + "0": "FB41B881-4D5F-4357-9363-35FB4856F4B6", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:37", + "9": "1", + "index": 587 + }, + { + "0": "8454CEA5-B059-4E44-8ADE-100460ED0992", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:26:24", + "9": "1", + "index": 588 + }, + { + "0": "B94780BA-6067-4DAD-AA2A-BACE10FA26EA", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:55:42", + "9": "1", + "index": 589 + }, + { + "0": "0550F138-938B-4710-83ED-00EC64D186E3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:04:17", + "9": "1", + "index": 590 + }, + { + "0": "2E0F3E5F-83E2-4414-8D46-00367E4279AD", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:41:39", + "9": "1", + "index": 591 + }, + { + "0": "910E41CD-FF30-4CFB-80F2-9799BDC60C48", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:31:33", + "9": "1", + "index": 592 + }, + { + "0": "9BC1E2D0-E438-4343-B319-212B06186B71", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:29:01", + "9": "1", + "index": 593 + }, + { + "0": "6A4D6552-8D68-49DA-8B16-D5094B3ED747", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:35:26", + "9": "1", + "index": 594 + }, + { + "0": "88CFD0B0-2A86-4BD2-9CED-4F37E1E9DFFE", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:21:26", + "9": "1", + "index": 595 + }, + { + "0": "3BDC3741-807B-447D-9A8D-9396CB1519BA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:16:10", + "9": "1", + "index": 596 + }, + { + "0": "6867FF41-D687-4B12-B2D2-A7B54F3728B9", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:52", + "9": "1", + "index": 597 + }, + { + "0": "21EB96F0-6C2C-4168-BEEA-A253EE75FE7B", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:10", + "9": "1", + "index": 598 + }, + { + "0": "051BDF69-D526-4951-A7E0-9A933A9899FF", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:16:57", + "9": "1", + "index": 599 + }, + { + "0": "A53C943B-A88C-4EB6-9A34-C386E9E8879C", + "1": "A844427390246047", + "2": "5.39", + "3": "11.0", + "4": "2023-02-28 17:14:53", + "9": "1", + "index": 600 + }, + { + "0": "1580B155-E0E0-40CB-841D-E2A5D2DB0E7E", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:57:02", + "9": "1", + "index": 601 + }, + { + "0": "E8E24E34-5D81-4891-BACF-7CD208CD56D4", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:09:15", + "9": "1", + "index": 602 + }, + { + "0": "1ECF8464-01D3-40DC-AC34-DC665D7839C4", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:14:50", + "9": "1", + "index": 603 + }, + { + "0": "D43FE025-6D1B-4FE0-8E42-BC3E95A76823", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:47:52", + "9": "1", + "index": 604 + }, + { + "0": "128EAA6F-8869-498D-8ADD-990F268B7F4D", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:35:59", + "9": "1", + "index": 605 + }, + { + "0": "D024ED6A-545B-44B2-827E-D7B9D98C592D", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:23", + "9": "1", + "index": 606 + }, + { + "0": "CFE1CF54-83D2-4396-88F9-7F0E7C2ED586", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:03:16", + "9": "1", + "index": 607 + }, + { + "0": "A06EBEB4-92ED-4F42-8211-F28EC67E5DF5", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:18:42", + "9": "1", + "index": 608 + }, + { + "0": "2D6EB785-22EC-4879-82A2-C643810EA7C1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:18:56", + "9": "1", + "index": 609 + }, + { + "0": "9C4E2317-10BB-4BDE-AE2F-09EA29B0FD8A", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:14", + "9": "1", + "index": 610 + }, + { + "0": "0A282803-01E1-4193-B72A-F135B850DCB5", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:32:12", + "9": "1", + "index": 611 + }, + { + "0": "1504CCD5-386C-4201-8362-D235C13D93AC", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:07:35", + "9": "1", + "index": 612 + }, + { + "0": "547D4C95-528D-46FC-A5A5-FA307B44A329", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:16:20", + "9": "1", + "index": 613 + }, + { + "0": "A5DA7BE5-A6BA-492B-B43E-588713661CDE", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:32", + "9": "1", + "index": 614 + }, + { + "0": "209685D0-27D7-42CE-A3A2-24F643DD387F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:52:17", + "9": "1", + "index": 615 + }, + { + "0": "5ABD00A4-C232-4D58-8A78-63ABE223F182", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:36:58", + "9": "1", + "index": 616 + }, + { + "0": "460FA98A-658B-4543-BBC0-EFBFCD7436FD", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:58:07", + "9": "1", + "index": 617 + }, + { + "0": "A440EC4D-B52B-4F0E-949A-EB6699D67175", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:54", + "9": "1", + "index": 618 + }, + { + "0": "03D4C75E-6EE7-421E-85F5-BD0BF2158BD4", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:33:21", + "9": "1", + "index": 619 + }, + { + "0": "29140357-C78E-4066-9BE5-CB7D5364BBD0", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:49:56", + "9": "1", + "index": 620 + }, + { + "0": "3F889B35-49FC-47BC-9E5E-2DF06FA12290", + "1": "A844427390246047", + "2": "5.39", + "3": "9.0", + "4": "2023-02-28 14:34:01", + "9": "1", + "index": 621 + }, + { + "0": "3C38413D-BA5E-4F68-9CE5-BAF48E13DE3C", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:21:29", + "9": "1", + "index": 622 + }, + { + "0": "4560AC71-6EB0-4590-8C1D-F39E8C2B743A", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:57", + "9": "1", + "index": 623 + }, + { + "0": "1DA8653D-7E02-48A4-AECA-CF30E3784FD3", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:40", + "9": "1", + "index": 624 + }, + { + "0": "566C00BC-EB37-41D8-9202-CCAC36616EB0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:43:37", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 625 + }, + { + "0": "0EB011D9-CAF2-4A02-8ACF-03895BE44128", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-21 20:53:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 626 + }, + { + "0": "043408BB-F09D-4E53-B3BB-A24E0AD4BDF6", + "1": "A844427390246047", + "2": "5.39", + "3": "5.0", + "4": "2023-02-25 11:17:46", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 627 + }, + { + "0": "9824B652-A52C-42EA-8BF0-A23D678B9527", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:49", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 628 + }, + { + "0": "2FAF5C96-CEE4-4D17-BEE6-EB27DF5351E7", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:20:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 629 + }, + { + "0": "E720050B-91AD-4ECE-8F88-CA91D6A18E39", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:41:10", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 630 + }, + { + "0": "0C9B4BE7-CEDB-4B19-9061-855CEC55B0FF", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-25 12:48:25", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 631 + }, + { + "0": "2104E85A-B76B-419E-8204-3EAB76C7D122", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:11:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 632 + }, + { + "0": "ABA1D7A5-99A8-4416-B120-BD5E39AF612A", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:45:00", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 633 + }, + { + "0": "46C30D4B-09B0-432A-AC46-DDD857CBD1FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:07:38", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 634 + }, + { + "0": "2B17E512-6E72-4890-87BD-3C122AA8604E", + "1": "A844427390246047", + "2": "5.39", + "3": "12.0", + "4": "2023-02-28 17:32:02", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 635 + }, + { + "0": "D74EFAAF-1FCC-4F41-AB01-317001E86EF1", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 19:42:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 636 + }, + { + "0": "01CE8E80-F8C6-4EA6-92A5-4D3077CE9449", + "1": "A844427390246047", + "2": "5.39", + "3": "14.0", + "4": "2023-02-24 20:06:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 637 + }, + { + "0": "C00398AE-B078-415C-BB5D-1F29152F4B00", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:26:26", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 638 + }, + { + "0": "63C571C9-4D3A-4A6F-84AF-7339ABF5FDDA", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:15:21", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 639 + }, + { + "0": "96AEA45B-C521-487A-890A-A5EFD5109973", + "1": "A844427390246047", + "2": "5.39", + "3": "7.0", + "4": "2023-02-28 13:16:17", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 640 + }, + { + "0": "5EE5C089-EEC1-40F9-B997-D8EA4BDA79C1", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:19:40", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 641 + }, + { + "0": "156194EC-C71A-4807-B417-BE00180D9FC0", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:38:28", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 642 + }, + { + "0": "938457F3-FCC6-463A-A037-89D33413C348", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:20:56", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 643 + }, + { + "0": "0C27D583-960D-4757-B7A9-E207BB91FF38", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:17:03", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 644 + }, + { + "0": "B6B66DCD-8211-47F8-A921-AED2FD47536F", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:18:16", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 645 + }, + { + "0": "834A0619-7166-452A-9D31-1224EBB54505", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:50:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 646 + }, + { + "0": "3A27F1D6-6B38-461C-ACAE-DCF4F171948C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:48:53", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 647 + }, + { + "0": "B4FA5FE0-EBF4-48B9-BDD1-A1D85984E9ED", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:57:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 648 + }, + { + "0": "5BCD2DBE-8524-4445-87E0-910F21C71046", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:58:13", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 649 + }, + { + "0": "7833DDCC-84C1-4818-8D57-D635B858475C", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-26 11:27:57", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 650 + }, + { + "0": "EA452A8D-BA16-42A9-BC9E-D2A1ECE62675", + "1": "A844427390246047", + "2": "5.39", + "3": "13.0", + "4": "2023-02-24 19:13:51", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 651 + }, + { + "0": "640D2C62-1A20-47FC-9443-79F93E1896C2", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 20:30:42", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 652 + }, + { + "0": "DF0ECDA4-9184-4A60-A227-C9193CD08C63", + "1": "A844427390246047", + "2": "5.39", + "3": "15.0", + "4": "2023-02-24 21:03:15", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 653 + }, + { + "0": "59ACE4B3-BD23-4241-B303-4D37EA2DFEE1", + "1": "A844427390246047", + "2": "5.39", + "3": "6.0", + "4": "2023-02-25 12:19:19", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 654 + }, + { + "0": "4D988189-A1DB-41FE-80CA-E338285D302F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:46:05", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 655 + }, + { + "0": "3319C4C1-94A7-45C7-AFC3-D1FD19FDEA8E", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:54:06", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 656 + }, + { + "0": "A6B5B02E-3974-4BD3-9F9F-98FF549E114F", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:22", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 657 + }, + { + "0": "A2709A9F-1697-4CB3-B0A2-8DDF7237D6FF", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:06:48", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 658 + }, + { + "0": "9E498776-6998-4308-B28B-93AF92DE4924", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:08:07", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 659 + }, + { + "0": "AA8F1576-451B-4B38-927D-2AB406CC8E8C", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 02:59:41", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 660 + }, + { + "0": "3743BB47-3637-40B7-A462-2548CFB7C663", + "1": "A844427390246047", + "2": "5.39", + "3": "21.0", + "4": "2023-02-26 03:05:54", + "5": "5.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 661 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "9": "1", + "index": 662 + }, + { + "0": "5F4BFC0E-B20F-4310-8971-6D3B8E7C7EF8", + "1": "A914801030385624", + "2": "79.99", + "3": "15.0", + "4": "2023-02-24 21:24:27", + "5": "79.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 663 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "9": "1", + "index": 664 + }, + { + "0": "ECB14CCC-D8F9-43C1-8EC2-D94AA69A2ECA", + "1": "A1055520437302600", + "2": "1200.68", + "3": "16.0", + "4": "2023-02-24 21:55:26", + "5": "1200.68", + "6": "false", + "7": "1.0", + "8": "2.0", + "9": "1", + "index": 665 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "9": "1", + "index": 666 + }, + { + "0": "62C66790-989B-43C0-8FCD-12C5829A6D77", + "1": "A914800278864743", + "2": "151.54", + "3": "15.0", + "4": "2023-02-25 21:28:57", + "5": "151.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 667 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "9": "1", + "index": 668 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "9": "1", + "index": 669 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "9": "1", + "index": 670 + }, + { + "0": "976C63FB-B108-4C8E-B190-C37F1FF602B4", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:09:47", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 671 + }, + { + "0": "F6E6F205-C915-4FBF-837A-38163126A25A", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:10:31", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 672 + }, + { + "0": "3BBA55DF-FAE7-4F71-A7E9-2CE883BE50C2", + "1": "A985156290472668", + "2": "5.34", + "3": "8.0", + "4": "2023-02-27 15:11:10", + "5": "5.34", + "6": "true", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 673 + }, + { + "0": "7CD9A9C3-3CE1-49B9-8299-039B7955F0F4", + "1": "A985156290472668", + "2": "5.34", + "3": "17.0", + "4": "2023-02-27 22:55:15", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 674 + }, + { + "0": "630E3459-B5AA-4D4C-A2E4-31E4D86BDD5B", + "1": "A985156290472668", + "2": "5.34", + "3": "20.0", + "4": "2023-02-26 02:11:24", + "5": "5.34", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 675 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "9": "1", + "index": 676 + }, + { + "0": "2E8C3C5B-4ECB-451D-8F50-BD946950FAC4", + "1": "A1899945509487400", + "2": "5.4", + "3": "20.0", + "4": "2023-02-26 02:50:39", + "9": "1", + "index": 677 + }, + { + "0": "8BD69B6D-0367-4EED-AE01-5A28B815C999", + "1": "A1899945509487400", + "2": "10.81", + "3": "20.0", + "4": "2023-02-26 03:01:05", + "5": "10.81", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 678 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "9": "1", + "index": 679 + }, + { + "0": "13CC7673-A59D-45CF-8287-2B4E8EE05396", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:46:49", + "9": "1", + "index": 680 + }, + { + "0": "770A0525-2D27-4173-B6BF-A5EA905162DC", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:47:43", + "9": "1", + "index": 681 + }, + { + "0": "CEA84E44-9194-48A0-A5F7-5BFA43E671BF", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:44:44", + "9": "1", + "index": 682 + }, + { + "0": "A012EE4D-7688-4A68-BAA1-6E372A040ADA", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:55:35", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 683 + }, + { + "0": "25C5DCA0-AACA-4FF2-870E-7A08EC230EF6", + "1": "A1055521399136000", + "2": "5.4", + "3": "23.0", + "4": "2023-02-27 04:51:23", + "5": "5.4", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 684 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "9": "1", + "index": 685 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "9": "1", + "index": 686 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "9": "1", + "index": 687 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "9": "1", + "index": 688 + }, + { + "0": "996C6CB5-D9A8-4B88-A723-6A002E6B893F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:44:00", + "9": "1", + "index": 689 + }, + { + "0": "45775ADF-C0C1-4AB2-97A6-BEE6F012632F", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:36:29", + "9": "1", + "index": 690 + }, + { + "0": "427FDE58-CA6D-4D48-B528-AD194856D115", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:02:10", + "9": "1", + "index": 691 + }, + { + "0": "5E74AE55-CFA6-4337-9B6B-CA9933D5A6D8", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:06:09", + "9": "1", + "index": 692 + }, + { + "0": "3FC40238-6110-46A6-BE38-CF80320791A1", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:28:41", + "9": "1", + "index": 693 + }, + { + "0": "D7BC1361-E730-4463-9DE7-2B9D92DB5A5B", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:13", + "9": "1", + "index": 694 + }, + { + "0": "441AEEE6-AAA6-40CB-9173-FBEF1C355ACC", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:46:27", + "9": "1", + "index": 695 + }, + { + "0": "9BE72279-7902-492D-9265-744491E4F86D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:16:50", + "9": "1", + "index": 696 + }, + { + "0": "0D43D3F2-A352-4700-8FEC-8E02EF44A514", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:34:45", + "9": "1", + "index": 697 + }, + { + "0": "D52E262C-77C6-4C20-B9FA-F5A408BED455", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:31:12", + "9": "1", + "index": 698 + }, + { + "0": "8C337F6E-E17F-4CDA-833A-CBEF20C65CF9", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 17:04:05", + "9": "1", + "index": 699 + }, + { + "0": "218C5731-A37A-4CBA-8D3B-EF20FF23DEAE", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:03", + "9": "1", + "index": 700 + }, + { + "0": "0FBA8C42-194E-4E18-85DB-D1FA1EB7C05D", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:41:53", + "9": "1", + "index": 701 + }, + { + "0": "702CD93B-73B6-4F45-8FE8-7F83EC633AA0", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:12", + "9": "1", + "index": 702 + }, + { + "0": "216991DF-33A6-4090-90AA-3E09DDF390E4", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:48:52", + "9": "1", + "index": 703 + }, + { + "0": "B3B0727B-ADF3-4621-9DFC-D0C8CB6E6F26", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:30:41", + "9": "1", + "index": 704 + }, + { + "0": "66709ABD-6D12-456B-82D6-CBD25CFBE285", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:39:19", + "9": "1", + "index": 705 + }, + { + "0": "C187B038-E19A-46AA-A9E0-5BF87BAEE2C1", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:38:51", + "9": "1", + "index": 706 + }, + { + "0": "43BF9531-63BE-46A1-AA90-CFD08FEB3BBB", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:41:50", + "9": "1", + "index": 707 + }, + { + "0": "00746053-49FB-4681-8AAA-10388C1D59E2", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 20:15:52", + "9": "1", + "index": 708 + }, + { + "0": "A66793DD-03E4-4E15-9CDB-79EC4733C3CA", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:39:54", + "9": "1", + "index": 709 + }, + { + "0": "B49DBC29-4D81-4FEE-8B9F-44415FD7BC80", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:42:26", + "9": "1", + "index": 710 + }, + { + "0": "9E151E5A-C4BE-4AE6-A0F2-62320FD3FD14", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:49:39", + "9": "1", + "index": 711 + }, + { + "0": "96007AC1-F260-4648-97B6-3D3527611B1B", + "1": "A985157015268058", + "2": "4.99", + "3": "14.0", + "4": "2023-02-27 19:29:39", + "9": "1", + "index": 712 + }, + { + "0": "FF63B43E-F5B7-4CFD-81FD-AFBFE1BDDFA0", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:51:59", + "9": "1", + "index": 713 + }, + { + "0": "3FBDA277-FA1B-4355-856A-91A8D9CB828C", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:34:32", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 714 + }, + { + "0": "7CD47312-9A89-4118-A977-62919D932541", + "1": "A985157015268058", + "2": "4.99", + "3": "10.0", + "4": "2023-02-27 15:37:33", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 715 + }, + { + "0": "CEDBDEF3-E681-4CCF-81AC-8EA4433E3DB2", + "1": "A985157015268058", + "2": "4.99", + "3": "15.0", + "4": "2023-02-27 20:36:09", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 716 + }, + { + "0": "8C92EAEE-3E47-4410-89C9-F95000EC0707", + "1": "A985157015268058", + "2": "4.99", + "3": "11.0", + "4": "2023-02-26 16:57:54", + "5": "4.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 717 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "9": "1", + "index": 718 + }, + { + "0": "473551AD-AFD4-49DE-B182-623E23AE5E46", + "1": "A1055521108927870", + "2": "219.99", + "3": "13.0", + "4": "2023-02-27 20:23:30", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 719 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "9": "1", + "index": 720 + }, + { + "0": "50EA1C3A-CE63-435C-BA22-4846C2024425", + "1": "A844427328211634", + "2": "104.7", + "3": "14.0", + "4": "2023-02-28 00:47:16", + "5": "104.7", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 721 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "9": "1", + "index": 722 + }, + { + "0": "903D435A-A4E4-489C-95E8-E97B11439B7C", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:19:19", + "9": "1", + "index": 723 + }, + { + "0": "1FB77AC2-B16B-468E-B8AD-D83F82586D10", + "1": "A1829582571084310", + "2": "222.19", + "3": "22.0", + "4": "2023-02-28 04:17:41", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 724 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "9": "1", + "index": 725 + }, + { + "0": "A45AA627-25B8-40C5-BA84-8581AEA31D28", + "1": "A1829582571162030", + "2": "219.99", + "3": "22.0", + "4": "2023-02-28 06:34:01", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 726 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "9": "1", + "index": 727 + }, + { + "0": "6DCDA408-D527-4CC0-8ECD-BB1DD4C1B51B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:23:20", + "9": "1", + "index": 728 + }, + { + "0": "6DC4F5F7-598E-4782-9981-5466DF994D2B", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:34:02", + "9": "1", + "index": 729 + }, + { + "0": "552F9E0D-5395-4995-9047-D71CD17F48CB", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:19:58", + "9": "1", + "index": 730 + }, + { + "0": "8C99CEBB-0BCA-4D2C-BEB7-09A627F46CDF", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:45:27", + "9": "1", + "index": 731 + }, + { + "0": "389398A4-D295-416A-91AE-E890749EFC58", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:30:28", + "9": "1", + "index": 732 + }, + { + "0": "FE374A34-0463-4D17-926A-7F697581AA35", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-28 10:24:44", + "9": "1", + "index": 733 + }, + { + "0": "E08DDC49-612E-4227-90CA-79EBCF477113", + "1": "A1055520836257310", + "2": "5.04", + "3": "5.0", + "4": "2023-02-27 10:37:29", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 734 + }, + { + "0": "EFAE71B3-0EB4-413B-BFA1-541328AD3FB1", + "1": "A1055520836257310", + "2": "5.04", + "3": "6.0", + "4": "2023-02-28 12:20:56", + "5": "5.04", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 735 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "9": "1", + "index": 736 + }, + { + "0": "DE46E518-A85B-40FA-8D00-0527941DF682", + "1": "A1829582602002910", + "2": "589.0", + "3": "17.0", + "4": "2023-02-28 17:17:05", + "5": "793.8542", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 737 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "9": "1", + "index": 738 + }, + { + "0": "027C22C5-135C-47DF-8C96-3289EB88AE52", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:27:26", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 739 + }, + { + "0": "1D803FD7-051D-4D75-94DC-214FC9E55633", + "1": "A1759222219270900", + "2": "235.39", + "3": "20.0", + "4": "2023-02-28 01:28:55", + "5": "235.39", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 740 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "9": "1", + "index": 741 + }, + { + "0": "964F4854-0D2F-4852-BA0E-2FF1CAC93990", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:50:02", + "9": "1", + "index": 742 + }, + { + "0": "37E89109-BF6A-4056-AAE5-3CECBB90641E", + "1": "A985156954406966", + "2": "240.45", + "3": "19.0", + "4": "2023-02-28 01:52:31", + "5": "240.45", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 743 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "9": "1", + "index": 744 + }, + { + "0": "69A49BAA-59B0-4AEC-AD40-EEE900AE308A", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 05:01:08", + "9": "1", + "index": 745 + }, + { + "0": "95B931E2-7A0A-4173-ACA5-8B43ED291019", + "1": "A1759222219270870", + "2": "424.99", + "3": "22.0", + "4": "2023-02-28 04:59:09", + "5": "424.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 746 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "9": "1", + "index": 747 + }, + { + "0": "36AD5A93-8DB0-4134-93EA-26D0A7EE8C3B", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:41:19", + "9": "1", + "index": 748 + }, + { + "0": "B40CF2C8-A5D3-439B-BEC7-E8E70A0E3317", + "1": "A1759222234549810", + "2": "73080.0", + "3": "19.0", + "4": "2023-03-01 10:39:15", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 749 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "9": "1", + "index": 750 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "9": "1", + "index": 751 + }, + { + "0": "F8A27B27-C73C-4DD1-AED7-97F5A6761294", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:00:21", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 752 + }, + { + "0": "EF766941-87DA-47B7-B312-B351B0172307", + "1": "A1899947010054330", + "2": "73080.0", + "3": "20.0", + "4": "2023-03-01 12:01:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 753 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "9": "1", + "index": 754 + }, + { + "0": "B67BDFBC-B7D7-414A-A781-964A9C80E8B1", + "1": "A1759222234548420", + "2": "538.0", + "3": "14.0", + "4": "2023-03-02 05:28:47", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 755 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "9": "1", + "index": 756 + }, + { + "0": "94BEE01F-8FA2-4685-9870-0172A53F3981", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:25:14", + "9": "1", + "index": 757 + }, + { + "0": "8F080C35-BA5C-41A5-8169-0EDBF1F27219", + "1": "A1759222234549860", + "2": "62580.0", + "3": "11.0", + "4": "2023-03-03 02:24:02", + "9": "1", + "index": 758 + }, + { + "0": "BB496ECE-16ED-448A-BE0D-272C234653B5", + "1": "A1759222234549860", + "2": "62580.0", + "3": "8.0", + "4": "2023-03-02 23:38:37", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 759 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "9": "1", + "index": 760 + }, + { + "0": "8FCE1AE5-6A19-46A3-8EC1-8D62B83C29A3", + "1": "A1759221435782970", + "2": "157.07", + "3": "18.0", + "4": "2023-03-05 00:17:53", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 761 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "9": "1", + "index": 762 + }, + { + "0": "C365FB49-1531-4219-977D-CBA8CBEF8389", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:37:08", + "9": "1", + "index": 763 + }, + { + "0": "375FCC05-7C62-492F-92F5-53AF0EEDE57A", + "1": "A1759222234549920", + "2": "73080.0", + "3": "8.0", + "4": "2023-03-05 23:38:47", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 764 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "9": "1", + "index": 765 + }, + { + "0": "1CE81EB0-7399-41B6-8E55-79A52BBFE9AC", + "1": "A362221882887902", + "2": "0.0", + "4": "2023-03-06 18:07:51", + "5": "0.0", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "0", + "index": 766 + }, + { + "0": "2EB5E726-5854-45B4-A674-FBCFD891AE9A", + "1": "A362221882887902", + "2": "680.89", + "4": "2023-03-06 18:12:12", + "5": "680.89", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 767 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "9": "1", + "index": 768 + }, + { + "0": "6C9E1AA1-9D12-49F6-8CC2-F4E5B1053CCA", + "1": "A985157021080233", + "2": "479.0", + "3": "18.0", + "4": "2023-03-06 18:59:46", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 769 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "9": "1", + "index": 770 + }, + { + "0": "16212511-57EB-4206-95EA-1AD25B767926", + "1": "A985157022379291", + "2": "279.98", + "3": "17.0", + "4": "2023-03-06 23:19:42", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 771 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "9": "1", + "index": 772 + }, + { + "0": "8D778823-BB51-4CA8-9CEC-84F4D48E035A", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:24:12", + "9": "1", + "index": 773 + }, + { + "0": "813EDBBA-D2FF-4316-AA18-DCBCC923619D", + "1": "A1899947010059410", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:23:01", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 774 + }, + { + "0": "2193EA41-7C0E-442B-9A2A-A7E6F6CF6D0F", + "1": "A1899947010059410", + "2": "156450.0", + "3": "23.0", + "4": "2023-03-07 14:26:10", + "5": "1725.6435", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "0", + "index": 775 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "9": "1", + "index": 776 + }, + { + "0": "4BE98D88-C717-4C24-809B-1A92A1FFCEBC", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 15:02:16", + "9": "1", + "index": 777 + }, + { + "0": "73FD0C82-ABD2-483C-93B3-9E0B6D5F1793", + "1": "A1759222234548900", + "2": "73080.0", + "3": "23.0", + "4": "2023-03-07 14:59:33", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 778 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "9": "1", + "index": 779 + }, + { + "0": "84F42387-D564-4878-8D22-760BCE34AD08", + "1": "A844428070993534", + "2": "1307.65", + "3": "10.0", + "4": "2023-03-07 17:10:15", + "5": "1307.65", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 780 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "9": "1", + "index": 781 + }, + { + "0": "1A68B478-E49B-4052-9BCD-2DC43AFA57B9", + "1": "A1688853682035130", + "2": "490.0", + "4": "2023-03-07 17:23:13", + "5": "660.422", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 782 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "9": "1", + "index": 783 + }, + { + "0": "A645B1E3-E62B-40EB-8201-F5ED545697E9", + "1": "A985157023797738", + "2": "281.37", + "3": "22.0", + "4": "2023-03-09 06:18:54", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 784 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "9": "1", + "index": 785 + }, + { + "0": "194011B7-EB22-403A-9B71-9964CCD499B9", + "1": "A985157024003479", + "2": "219.99", + "3": "9.0", + "4": "2023-03-09 14:44:26", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 786 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "9": "1", + "index": 787 + }, + { + "0": "34E50410-3939-4466-BCE5-6207661FAF5C", + "1": "A1899946865208980", + "2": "73080.0", + "3": "0.0", + "4": "2023-03-09 16:20:26", + "9": "1", + "index": 788 + }, + { + "0": "CC3A3235-D2C0-4050-B3FA-1874B30260D6", + "1": "A1899946865208980", + "2": "62580.0", + "3": "1.0", + "4": "2023-03-09 16:22:35", + "5": "690.2574", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 789 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "9": "1", + "index": 790 + }, + { + "0": "68162486-44E1-44E6-AB46-44EAF9D72EF6", + "1": "A985157024246345", + "2": "51.24", + "4": "2023-03-10 00:44:53", + "5": "51.24", + "6": "false", + "7": "1.0", + "8": "3.0", + "9": "1", + "index": 791 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "9": "1", + "index": 792 + }, + { + "0": "9F442404-8F9E-45E0-8A10-D5B4C0B3A36A", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:47:03", + "9": "1", + "index": 793 + }, + { + "0": "7C1A8002-1E95-4100-B2E3-2EDAEFA7AC4E", + "1": "A1688853516414440", + "2": "79380.0", + "3": "0.0", + "4": "2023-03-10 15:49:34", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 794 + }, + { + "0": "A5343E7D-5553-4F25-B916-E18FE75CF2AC", + "1": "A1688853516414440", + "2": "125580.0", + "3": "0.0", + "4": "2023-03-10 15:51:52", + "5": "1385.1474", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "0", + "index": 795 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "9": "1", + "index": 796 + }, + { + "0": "A4B91F8E-04B2-4A1C-B612-10F42C760989", + "1": "A844427101383089", + "2": "519.99", + "3": "14.0", + "4": "2023-03-10 22:51:49", + "5": "519.99", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 797 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "9": "1", + "index": 798 + }, + { + "0": "3E6BEDBD-7B2A-40CF-87FC-AE161EA47713", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:57:49", + "9": "1", + "index": 799 + }, + { + "0": "8625D6A1-D881-4521-8246-5F1B2381D71D", + "1": "A1899946865209040", + "2": "79380.0", + "3": "9.0", + "4": "2023-03-11 00:59:31", + "5": "875.5614", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 800 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "9": "1", + "index": 801 + }, + { + "0": "0B787893-9340-4DE8-9CEF-AFFCD6BB8AB0", + "1": "A914800689334401", + "2": "109.99", + "3": "10.0", + "4": "2023-03-04 18:46:15", + "9": "1", + "index": 802 + }, + { + "0": "DFDDB7C2-7E6D-41A1-86CC-84FCF8F3C8E8", + "1": "A914800689334401", + "2": "109.99", + "3": "16.0", + "4": "2023-03-11 01:06:36", + "5": "109.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 803 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "9": "1", + "index": 804 + }, + { + "0": "531E0DC8-53E7-40A2-A8E4-A28F3ACE3F45", + "1": "A1688852207604610", + "2": "99.0", + "3": "11.0", + "4": "2023-03-11 01:58:24", + "5": "103.48965", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 805 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "9": "1", + "index": 806 + }, + { + "0": "D3507A5B-38A9-40F9-B992-DB1547B281C9", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:45:45", + "9": "1", + "index": 807 + }, + { + "0": "E24846FB-89B2-4304-8039-23C9271D1889", + "1": "A1688853516417610", + "2": "78750.0", + "3": "20.0", + "4": "2023-03-11 11:47:11", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 808 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "9": "1", + "index": 809 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "9": "1", + "index": 810 + }, + { + "0": "E4BA8082-355D-4EA7-B2C8-1D9E07046F30", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:47:25", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 811 + }, + { + "0": "573FCD19-5AF1-4C96-B2B6-D09E91B02381", + "1": "A985157025448796", + "2": "73080.0", + "3": "21.0", + "4": "2023-03-11 12:54:28", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 812 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "9": "1", + "index": 813 + }, + { + "0": "D7391AE6-467B-4C82-9310-7AA348F9D0C4", + "1": "A914800267247225", + "2": "139.99", + "3": "20.0", + "4": "2023-03-12 01:47:29", + "5": "139.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 814 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "9": "1", + "index": 815 + }, + { + "0": "C1BC707F-E92A-4FD4-A709-39C1C7666465", + "1": "A985157026745005", + "2": "36540.0", + "3": "9.0", + "4": "2023-03-13 00:38:59", + "5": "403.0362", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 816 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "9": "1", + "index": 817 + }, + { + "0": "5FE36C4E-BDCE-4C58-B35A-2077ED72CDFF", + "1": "A1055521420182040", + "2": "752.68", + "3": "18.0", + "4": "2023-03-13 00:37:15", + "5": "752.68", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 818 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "9": "1", + "index": 819 + }, + { + "0": "EC68A65E-1901-4CE2-8BAF-92E4734A4D74", + "1": "A985157026813391", + "2": "226.95", + "3": "17.0", + "4": "2023-03-13 01:35:43", + "5": "226.95", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 820 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "9": "1", + "index": 821 + }, + { + "0": "E87F43AB-36CC-481F-A7CB-E5F9C1B08F57", + "1": "A1899947009495620", + "2": "62580.0", + "3": "10.0", + "4": "2023-03-13 02:18:34", + "9": "1", + "index": 822 + }, + { + "0": "86E7F3BE-FA69-4D61-A458-12E8E726858D", + "1": "A1899947009495620", + "2": "73080.0", + "3": "10.0", + "4": "2023-03-13 02:16:29", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 823 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "9": "1", + "index": 824 + }, + { + "0": "C2AE42D7-53F6-424F-8470-4B2EF42612EB", + "1": "A1688853662168790", + "2": "62580.0", + "3": "12.0", + "4": "2023-03-13 04:19:44", + "9": "1", + "index": 825 + }, + { + "0": "306D1B72-286E-44A1-AF1E-BC01B6551B83", + "1": "A1688853662168790", + "2": "73080.0", + "3": "13.0", + "4": "2023-03-13 04:21:12", + "5": "806.0724", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 826 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "9": "1", + "index": 827 + }, + { + "0": "E32B5896-DD3D-4C40-BFAB-75C27190A55C", + "1": "A985156972392398", + "2": "152.94", + "3": "2.0", + "4": "2023-03-13 08:54:53", + "5": "152.94", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 828 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "9": "1", + "index": 829 + }, + { + "0": "14EF7AD5-A3AA-4E9E-B377-74A47CDC2785", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:58:58", + "9": "1", + "index": 830 + }, + { + "0": "78A67431-762B-4266-9942-E6EEB4A268BF", + "1": "A1688853662170320", + "2": "839.97", + "3": "19.0", + "4": "2023-03-13 10:56:33", + "5": "839.97", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 831 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "9": "1", + "index": 832 + }, + { + "0": "DA98CDF2-61C3-44C2-9ABA-1364BB7671AF", + "1": "A914800150734044", + "2": "593.58", + "3": "16.0", + "4": "2023-03-13 22:02:01", + "5": "593.58", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 833 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "9": "1", + "index": 834 + }, + { + "0": "1AE19EA1-54DF-4E2A-889F-E47C3AFE65AF", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:11:13", + "9": "1", + "index": 835 + }, + { + "0": "8717C0FD-51C1-4457-BABB-D356176DDF24", + "1": "A1899947009495910", + "2": "538.0", + "3": "21.0", + "4": "2023-03-14 13:09:53", + "9": "1", + "index": 836 + }, + { + "0": "B1DCEA69-8515-497E-8CAF-FEF5A9A4E5C5", + "1": "A1899947009495910", + "2": "538.0", + "3": "22.0", + "4": "2023-03-14 13:49:32", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 837 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "9": "1", + "index": 838 + }, + { + "0": "CF161FC1-9EE6-42F9-92F4-84E0B45957D6", + "1": "A1829582439663370", + "2": "569.97", + "3": "11.0", + "4": "2023-03-15 02:21:19", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 839 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "9": "1", + "index": 840 + }, + { + "0": "57E282C4-3F49-485B-B5B8-CACAEEF05078", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:47:32", + "9": "1", + "index": 841 + }, + { + "0": "AA20954D-6483-48D8-9E0D-D3BDFF8B197A", + "1": "A1759222088017710", + "2": "78750.0", + "3": "16.0", + "4": "2023-03-15 07:48:58", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 842 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "9": "1", + "index": 843 + }, + { + "0": "A541504B-98D3-492E-89A4-994617EFA9CA", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:58:56", + "9": "1", + "index": 844 + }, + { + "0": "E99493A6-78E3-434D-9AAB-D2B1E0AF1AD9", + "1": "A1759222088015940", + "2": "78750.0", + "3": "17.0", + "4": "2023-03-15 08:56:31", + "5": "868.6125", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 845 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "9": "1", + "index": 846 + }, + { + "0": "6EE898DD-C20C-4784-9CD5-3A630B4113AB", + "1": "A914801045428170", + "2": "85.59", + "3": "13.0", + "4": "2023-03-15 18:30:29", + "5": "85.59", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 847 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "9": "1", + "index": 848 + }, + { + "0": "EAA2680C-AD71-4139-BBCA-D74E0B373E33", + "1": "A1055521383712530", + "2": "210.99", + "4": "2023-03-15 20:16:57", + "5": "210.99", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 849 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "9": "1", + "index": 850 + }, + { + "0": "C43487B3-4C79-46C9-B163-EB704D6F28A1", + "1": "A1899947009494720", + "2": "538.0", + "3": "13.0", + "4": "2023-03-17 04:53:51", + "5": "725.1164", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 851 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "9": "1", + "index": 852 + }, + { + "0": "0F4F57CC-5436-4377-9B91-B6C7D0CC67E8", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:35:53", + "9": "1", + "index": 853 + }, + { + "0": "8DAB4CC5-905C-4646-904A-F981F3F7D0BA", + "1": "A844427868914574", + "2": "389.99", + "3": "11.0", + "4": "2023-03-17 11:32:46", + "5": "614.195251", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 854 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "9": "1", + "index": 855 + }, + { + "0": "65EA39D7-E9AC-4E55-8F4E-0A3C932688B0", + "1": "A985157032078551", + "2": "699.0", + "3": "17.0", + "4": "2023-03-19 01:27:21", + "5": "112.30134", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 856 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "9": "1", + "index": 857 + }, + { + "0": "45544389-E451-4D60-9BF6-261176776209", + "1": "A914801018161878", + "2": "99.99", + "3": "3.0", + "4": "2023-03-19 11:28:54", + "5": "99.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 858 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "9": "1", + "index": 859 + }, + { + "0": "47A9F4BA-03C8-4900-BEF0-BADCF3C21D99", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:19:14", + "9": "1", + "index": 860 + }, + { + "0": "B1992BA4-6A40-477F-99FF-2C9AC26688DF", + "1": "A1688853662172620", + "2": "569.97", + "3": "23.0", + "4": "2023-03-19 15:17:07", + "5": "768.205566", + "6": "false", + "7": "3.0", + "8": "0.0", + "9": "1", + "index": 861 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "9": "1", + "index": 862 + }, + { + "0": "2F246963-29D5-4570-BF39-54494E929938", + "1": "A1055521390784220", + "2": "219.99", + "4": "2023-03-19 22:45:20", + "5": "219.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 863 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "9": "1", + "index": 864 + }, + { + "0": "3147828E-D9DA-4C96-AB5C-56ECE7A35403", + "1": "A985157032922252", + "2": "211.89", + "3": "15.0", + "4": "2023-03-19 22:27:02", + "5": "211.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 865 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "9": "1", + "index": 866 + }, + { + "0": "16346EB5-B1D7-438D-8F50-E46ADB6AEE9A", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:31:16", + "9": "1", + "index": 867 + }, + { + "0": "24AC8E71-2B1E-4A4A-A416-64736D04783B", + "1": "A844428082778441", + "2": "157.07", + "3": "12.0", + "4": "2023-03-21 17:36:05", + "5": "156.421301", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 868 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "9": "1", + "index": 869 + }, + { + "0": "FFCA8791-18C3-4C81-9D89-1250936E41E1", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:04:04", + "9": "1", + "index": 870 + }, + { + "0": "BD06116A-1C08-45CB-8BAC-515E522168AE", + "1": "A844428082845952", + "2": "147.83", + "3": "13.0", + "4": "2023-03-21 19:00:49", + "5": "147.83", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 871 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "9": "1", + "index": 872 + }, + { + "0": "F1B5AEFF-0701-44A7-8BFF-F44A9FCD8F2C", + "1": "A914801050992809", + "2": "281.37", + "3": "17.0", + "4": "2023-03-21 23:24:04", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 873 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "9": "1", + "index": 874 + }, + { + "0": "241DBB1D-3092-4FCE-A4A5-00219ECD6C99", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:35:42", + "9": "1", + "index": 875 + }, + { + "0": "2959008D-82E5-4A92-ABAD-15BF31D4D860", + "1": "A1055521428449680", + "2": "278.88", + "3": "22.0", + "4": "2023-03-22 03:37:49", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 876 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "9": "1", + "index": 877 + }, + { + "0": "3D4366E9-508C-4391-A2BD-1CD19A6A3E28", + "1": "A1899946665040220", + "2": "75.76", + "3": "10.0", + "4": "2023-03-23 08:35:31", + "5": "75.76", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 878 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "9": "1", + "index": 879 + }, + { + "0": "7CD74B1F-ACC8-4C37-B00F-11151C50D758", + "1": "A1055520703430980", + "2": "119.75", + "3": "20.0", + "4": "2023-03-25 02:17:14", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 880 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "9": "1", + "index": 881 + }, + { + "0": "0B724B9C-2D5A-4DA6-8D99-570DA7C20933", + "1": "A2111055908627200", + "2": "74.89", + "3": "19.0", + "4": "2023-03-26 01:10:22", + "5": "74.89", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 882 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "9": "1", + "index": 883 + }, + { + "0": "92EA085E-FD70-425B-80EB-4513BFBA8AF1", + "1": "A985157038112964", + "2": "150.14", + "3": "22.0", + "4": "2023-03-26 03:25:46", + "9": "1", + "index": 884 + }, + { + "0": "43C9065E-A514-4250-85E7-77C8768EB061", + "1": "A985157038112964", + "2": "150.14", + "3": "21.0", + "4": "2023-03-26 03:20:21", + "5": "150.14", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 885 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "9": "1", + "index": 886 + }, + { + "0": "4C959775-D5F7-4529-8198-B5CD3007D04C", + "1": "A1829581437162310", + "2": "233.19", + "3": "7.0", + "4": "2023-03-27 13:10:38", + "5": "233.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 887 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "9": "1", + "index": 888 + }, + { + "0": "F6A4299A-ECE2-4DBA-BFC5-07E405117646", + "1": "A985157039468116", + "2": "719.0", + "3": "13.0", + "4": "2023-03-27 13:39:14", + "5": "1132.3531", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 889 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "9": "1", + "index": 890 + }, + { + "0": "138D8A92-4C50-4A5F-BA5B-7E6517F3B0B9", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:48:08", + "9": "1", + "index": 891 + }, + { + "0": "BDA24FA7-E187-478C-82AE-865DBCF769F0", + "1": "A844428087822266", + "2": "278.88", + "3": "10.0", + "4": "2023-03-27 15:45:21", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 892 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "9": "1", + "index": 893 + }, + { + "0": "A053C59B-6929-4895-AC1D-658F81AB3CB6", + "1": "A985157039921196", + "2": "1438.0", + "3": "3.0", + "4": "2023-03-28 04:00:00", + "5": "2264.7062", + "6": "true", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 894 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "9": "1", + "index": 895 + }, + { + "0": "237AD504-9222-4DAF-BBB9-5C86C4A0DF90", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:57:24", + "9": "1", + "index": 896 + }, + { + "0": "A0C4B8CE-4587-469B-B447-1B99D45187BD", + "1": "A844428089229497", + "2": "261.45", + "3": "23.0", + "4": "2023-03-29 07:59:07", + "5": "260.370211", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 897 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "9": "1", + "index": 898 + }, + { + "0": "12BE1B15-1042-4C4A-9B0D-30823F42E3D6", + "1": "A985157041378120", + "2": "159.0", + "3": "11.0", + "4": "2023-03-29 16:34:53", + "5": "159.0", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 899 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "9": "1", + "index": 900 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "9": "1", + "index": 901 + }, + { + "0": "A67953E3-06C2-413F-BD06-8473F7C202F4", + "1": "A1055521435190160", + "2": "281.37", + "3": "17.0", + "4": "2023-03-29 23:20:24", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 902 + }, + { + "0": "9751B6CA-AE84-41C9-8BAE-F2608CCE17E4", + "1": "A1055521435190160", + "2": "281.37", + "3": "18.0", + "4": "2023-03-29 23:22:01", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 903 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "9": "1", + "index": 904 + }, + { + "0": "A44E3875-069E-472A-B3FB-5ADC3A7CDF66", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:51:16", + "9": "1", + "index": 905 + }, + { + "0": "1AB327E5-AD02-4407-853C-1024966EAEA6", + "1": "A1055521435204170", + "2": "286.35", + "3": "18.0", + "4": "2023-03-29 23:52:59", + "5": "285.167374", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 906 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "9": "1", + "index": 907 + }, + { + "0": "D6AE2567-ECC7-46FF-8389-BCF43C8A81D4", + "1": "A1055521435373420", + "2": "278.88", + "3": "0.0", + "4": "2023-03-30 06:20:02", + "9": "1", + "index": 908 + }, + { + "0": "0D5E955B-EC9E-48EA-B499-587B73B8AB69", + "1": "A1055521435373420", + "2": "278.88", + "3": "1.0", + "4": "2023-03-30 06:22:46", + "5": "277.72822599999995", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 909 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "9": "1", + "index": 910 + }, + { + "0": "158D5606-DB73-4DAE-8041-331070779CD3", + "1": "A1055521436064760", + "2": "155.68", + "3": "17.0", + "4": "2023-03-30 23:16:28", + "5": "155.03704199999999", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 911 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "9": "1", + "index": 912 + }, + { + "0": "87726A9D-DF55-4685-82A1-5D4F9E022F5A", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:30:46", + "9": "1", + "index": 913 + }, + { + "0": "05EB1AA9-8B8C-416C-9637-01DBCE588FD4", + "1": "A914801058711211", + "2": "145.95", + "3": "17.0", + "4": "2023-03-30 23:32:11", + "5": "145.347227", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 914 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "9": "1", + "index": 915 + }, + { + "0": "B9388B0B-6649-4EC4-8C4F-D6E9293CC8CA", + "1": "A1899946341703750", + "2": "406.78", + "3": "19.0", + "4": "2023-01-02 00:41:25", + "5": "405.099999", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 916 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "9": "1", + "index": 917 + }, + { + "0": "E4BE3429-CFC8-44D0-B48F-BCD7D875D0E9", + "1": "A1759222229520370", + "2": "599.0", + "3": "23.0", + "4": "2023-01-03 14:02:57", + "9": "1", + "index": 918 + }, + { + "0": "9E6DC7FE-2F2F-4508-BBF2-BC31F249B637", + "1": "A1759222229520370", + "2": "169.0", + "3": "23.0", + "4": "2023-01-03 14:10:32", + "5": "176.66415", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 919 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "9": "1", + "index": 920 + }, + { + "0": "979DF1CE-FE47-47FE-A8ED-ED1119F41065", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:03:58", + "9": "1", + "index": 921 + }, + { + "0": "E9D60DF2-0E4B-4396-A84B-A0B9E88B3B63", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:02:50", + "9": "1", + "index": 922 + }, + { + "0": "F178386E-86A3-4F08-B9B0-6778898CAD4E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:56:06", + "9": "1", + "index": 923 + }, + { + "0": "2D228D45-7E38-45CF-BD23-8D4F3445FFF8", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:52:56", + "9": "1", + "index": 924 + }, + { + "0": "3FB022CD-5FEE-43CE-A742-F25EFC9F48DF", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:06:11", + "9": "1", + "index": 925 + }, + { + "0": "ABE168A6-3636-4202-9389-95E44E65881E", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:14:56", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 926 + }, + { + "0": "CBE31B92-8D8D-422D-BF1C-2883222AC68B", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 16:51:29", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 927 + }, + { + "0": "169212AC-3DBA-4EA6-A5AE-031C407DC3AA", + "1": "A1688853657869890", + "2": "52.99", + "3": "10.0", + "4": "2023-01-03 17:00:28", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 928 + }, + { + "0": "C4F83897-54F9-4208-987E-DDE9D20F0B4B", + "1": "A1688853657869890", + "2": "52.99", + "3": "11.0", + "4": "2023-01-03 17:27:59", + "5": "52.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 929 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "9": "1", + "index": 930 + }, + { + "0": "783D965E-660F-4591-8AB5-3F3327E0B8AB", + "1": "A1759222095873190", + "2": "160.47", + "3": "11.0", + "4": "2023-01-03 17:41:15", + "9": "1", + "index": 931 + }, + { + "0": "DD2D73FD-7DAF-49A5-AC4A-47117E6DE03C", + "1": "A1759222095873190", + "2": "53.49", + "3": "11.0", + "4": "2023-01-03 17:37:53", + "9": "1", + "index": 932 + }, + { + "0": "A55591A0-4BA2-4DB4-8881-619C2000D5FA", + "1": "A1759222095873190", + "2": "106.98", + "3": "11.0", + "4": "2023-01-03 17:39:26", + "5": "106.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 933 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "9": "1", + "index": 934 + }, + { + "0": "ADB8EB04-9D65-43A5-9CF1-5F86D904FC18", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:59:06", + "9": "1", + "index": 935 + }, + { + "0": "636DA8EE-8D04-49D9-9BFE-21FAE9991FE6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:57:29", + "9": "1", + "index": 936 + }, + { + "0": "FE12EF10-2C8B-4F97-8D72-8CA106A2FDB6", + "1": "A1055521380537310", + "2": "129.58", + "3": "13.0", + "4": "2023-01-03 18:56:12", + "9": "1", + "index": 937 + }, + { + "0": "06243234-E503-47F2-919F-6F9EA1513C3F", + "1": "A1055521380537310", + "2": "64.79", + "3": "13.0", + "4": "2023-01-03 18:53:51", + "5": "64.79", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 938 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "9": "1", + "index": 939 + }, + { + "0": "EE72DD0F-F132-4E86-9CC5-9FB6386668A0", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:41:24", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 940 + }, + { + "0": "DE94FF49-79D4-417C-87B2-6682EC4AA382", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:38:47", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 941 + }, + { + "0": "415F4169-0DE1-4D1D-B056-823D02BFEDF6", + "1": "A1829582580775700", + "2": "65.57", + "3": "11.0", + "4": "2023-01-03 18:51:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 942 + }, + { + "0": "9B5ACCF3-D278-48E9-867E-6027988CEA01", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:24:33", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 943 + }, + { + "0": "B352C087-14C9-4B8A-B239-0C4D861AF091", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:45:31", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 944 + }, + { + "0": "CB9D1331-694E-46E6-8A0A-0C16404FD315", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:46:26", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 945 + }, + { + "0": "8B065D0D-9FBB-4815-B341-DDA432223550", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:35:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 946 + }, + { + "0": "7829E3D8-EAF7-44CE-8AD6-0F11BC182D65", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:39:40", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 947 + }, + { + "0": "C1399C61-74D6-40B3-8289-AC99FAFF4988", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:36:45", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 948 + }, + { + "0": "76770317-5FD5-4C96-B77B-43BE377FDC6D", + "1": "A1829582580775700", + "2": "65.57", + "3": "12.0", + "4": "2023-01-03 19:48:25", + "5": "65.57", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "0", + "index": 949 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "9": "1", + "index": 950 + }, + { + "0": "C5369F85-BC0A-43F2-B7F2-4930B89DC246", + "1": "A844428031222008", + "2": "54.26", + "3": "19.0", + "4": "2023-01-05 01:15:30", + "5": "54.26", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 951 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "9": "1", + "index": 952 + }, + { + "0": "B6A87790-25B1-4E1D-8F1C-DBF01DA1B7B7", + "1": "A1759221887824430", + "2": "153.29", + "3": "17.0", + "4": "2023-01-05 02:05:55", + "5": "153.29", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 953 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "9": "1", + "index": 954 + }, + { + "0": "27281C9B-0119-4284-A39C-603C356C6ADB", + "1": "A1055521381717350", + "2": "479.0", + "3": "16.0", + "4": "2023-01-05 16:22:27", + "5": "754.3771", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 955 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "9": "1", + "index": 956 + }, + { + "0": "635526D8-1F35-4ABE-88EC-7D5276A36C51", + "1": "A1055521381916150", + "2": "26.54", + "3": "18.0", + "4": "2023-01-06 00:33:10", + "5": "26.54", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 957 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "9": "1", + "index": 958 + }, + { + "0": "84633227-12F0-4157-AEA8-4F844146BC47", + "1": "A985156984009293", + "2": "15.85", + "3": "9.0", + "4": "2023-01-06 17:45:55", + "9": "1", + "index": 959 + }, + { + "0": "B070007C-549E-4211-920D-AF0712332B4B", + "1": "A985156984009293", + "2": "127.19", + "4": "2023-01-06 17:45:56", + "5": "127.19", + "6": "false", + "7": "1.0", + "8": "1.0", + "9": "1", + "index": 960 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "9": "1", + "index": 961 + }, + { + "0": "5867EAE8-3A64-4EB2-8CCF-F4F6A119B088", + "1": "A844428035402480", + "2": "63.89", + "3": "11.0", + "4": "2023-01-11 16:24:52", + "5": "63.89", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 962 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "9": "1", + "index": 963 + }, + { + "0": "1F9B9F18-4C20-46FD-8151-B8C6B463ACC0", + "1": "A1055521385546810", + "2": "148.74", + "3": "15.0", + "4": "2023-01-11 22:15:24", + "5": "148.74", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 964 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "9": "1", + "index": 965 + }, + { + "0": "A721A0ED-7D53-4627-AC26-9D1C825D3E29", + "1": "A844428035905405", + "2": "119.75", + "3": "22.0", + "4": "2023-01-12 04:15:29", + "5": "119.75", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 966 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "9": "1", + "index": 967 + }, + { + "0": "2C5B2DC8-5E8D-407D-8894-A0D0EB229AA3", + "1": "A914800389046486", + "2": "107.99", + "3": "12.0", + "4": "2023-01-14 17:25:43", + "5": "107.99", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 968 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "9": "1", + "index": 969 + }, + { + "0": "63065B44-AA7C-46D9-A9B3-E4E1C36667F8", + "1": "A2040691497893890", + "2": "279.98", + "3": "11.0", + "4": "2023-01-14 17:58:29", + "5": "279.98", + "6": "false", + "7": "2.0", + "8": "0.0", + "9": "1", + "index": 970 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "9": "1", + "index": 971 + }, + { + "0": "33A4A802-37D2-454B-9960-1B92DD51B771", + "1": "A1899947008864830", + "2": "137.3", + "3": "11.0", + "4": "2023-01-14 19:07:33", + "5": "137.3", + "6": "false", + "7": "5.0", + "8": "0.0", + "9": "1", + "index": 972 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "9": "1", + "index": 973 + }, + { + "0": "10B457AE-179C-457B-90BA-1A0E6D8F5143", + "1": "A1055521388773990", + "2": "119.06", + "3": "20.0", + "4": "2023-01-15 02:43:22", + "9": "1", + "index": 974 + }, + { + "0": "925E5659-FF7E-42E9-B91C-9C629D7F2BBA", + "1": "A1055521388773990", + "2": "108.24", + "3": "20.0", + "4": "2023-01-15 03:03:53", + "5": "108.24", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 975 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "9": "1", + "index": 976 + }, + { + "0": "BD1D07BF-A461-47A3-8938-D785B38A0E7D", + "1": "A914801001917388", + "2": "698.99", + "3": "8.0", + "4": "2023-01-15 07:32:32", + "5": "942.0987220000001", + "6": "false", + "7": "0.0", + "8": "2.0", + "9": "1", + "index": 977 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "9": "1", + "index": 978 + }, + { + "0": "A9D4BF3B-D29D-4BDA-9209-AEED53CF20D3", + "1": "A1899946943634320", + "2": "189.99", + "3": "12.0", + "4": "2023-01-15 12:46:20", + "5": "299.21525099999997", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 979 + }, + { + "0": "50C46472-B928-49BF-82E2-D1BE1C9DBCF4", + "1": "A1899946943634320", + "2": "149.99", + "3": "12.0", + "4": "2023-01-15 12:57:30", + "5": "236.21925099999999", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "0", + "index": 980 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "9": "1", + "index": 981 + }, + { + "0": "198674DC-ADFB-4FFE-94AB-E920AEA22B88", + "1": "A1829582414397910", + "2": "222.19", + "3": "14.0", + "4": "2023-01-15 19:38:34", + "5": "222.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 982 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "9": "1", + "index": 983 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "9": "1", + "index": 984 + }, + { + "0": "1E7C21A8-930E-43D4-8044-8356F16FACB2", + "1": "A844428039854278", + "2": "76.19", + "3": "14.0", + "4": "2023-01-16 19:23:46", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 985 + }, + { + "0": "6E4A323D-0142-4015-88CC-74C85F2D1261", + "1": "A844428039854278", + "2": "76.19", + "3": "13.0", + "4": "2023-01-19 18:36:52", + "5": "76.19", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 986 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "9": "1", + "index": 987 + }, + { + "0": "4DA0DA18-1900-48F9-8FAD-2E31FA77C64F", + "1": "A1829581772655040", + "2": "1499.0", + "3": "14.0", + "4": "2023-01-16 21:02:41", + "5": "118.002779", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 988 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "9": "1", + "index": 989 + }, + { + "0": "79BC1796-1C62-4C53-8F6D-301C03D1C4BF", + "1": "A914801004122929", + "2": "210.19", + "3": "11.0", + "4": "2023-01-18 17:23:13", + "5": "210.19", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 990 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "9": "1", + "index": 991 + }, + { + "0": "88CA2590-A2EA-4C19-B7E0-6B5C5DFFAABB", + "1": "A844428041278796", + "2": "789.87", + "3": "19.0", + "4": "2023-01-19 00:39:54", + "5": "786.607837", + "6": "false", + "7": "0.0", + "8": "1.0", + "9": "1", + "index": 992 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "9": "1", + "index": 993 + }, + { + "0": "C4005755-95ED-4A4F-B1CD-B3943278DA54", + "1": "A1759222235006700", + "2": "212.49", + "3": "7.0", + "4": "2023-01-19 13:48:20", + "5": "212.49", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 994 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "9": "1", + "index": 995 + }, + { + "0": "CDAFFE95-3687-4886-9668-96EB7645063F", + "1": "A1829582586398540", + "2": "786.79", + "3": "10.0", + "4": "2023-01-20 09:25:50", + "9": "1", + "index": 996 + }, + { + "0": "F70F7BCA-6F5F-4C6C-BEE4-6C92B53E5816", + "1": "A1829582586398540", + "2": "587.0", + "3": "21.0", + "4": "2023-02-03 21:10:03", + "9": "1", + "index": 997 + }, + { + "0": "E11DC416-B4F6-4637-9D28-1DAC96F009DA", + "1": "A1829582586398540", + "2": "119.0", + "4": "2023-01-20 09:25:52", + "5": "160.3882", + "6": "false", + "7": "1.0", + "8": "4.0", + "9": "1", + "index": 998 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "9": "1", + "index": 999 + }, + { + "0": "9B2DBE0F-7C5E-48F1-B184-2066C7CE0AC4", + "1": "A1899946871435580", + "2": "281.37", + "3": "13.0", + "4": "2023-01-20 18:56:34", + "5": "280.207942", + "6": "false", + "7": "1.0", + "8": "0.0", + "9": "1", + "index": 1000 + } + ], + "schema": [ + { + "key": "0", + "name": "transactionID", + "type": "string" + }, + { + "key": "1", + "name": "accountID", + "type": "string" + }, + { + "key": "2", + "name": "transactionAmount", + "type": "double" + }, + { + "key": "3", + "name": "localHour", + "type": "double" + }, + { + "key": "4", + "name": "timestamp", + "type": "timestamp" + }, + { + "key": "5", + "name": "transactionAmountUSD", + "type": "double" + }, + { + "key": "6", + "name": "isProxyIP", + "type": "boolean" + }, + { + "key": "7", + "name": "digitalItemCount", + "type": "double" + }, + { + "key": "8", + "name": "physicalItemCount", + "type": "double" + }, + { + "key": "9", + "name": "is_fraud", + "type": "bigint" + } + ], + "truncated": false + } + }, + "type": "Synapse.DataFrame" + } + }, + "version": "0.1" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sdk/python/featurestore_sample/project/env/conda.yml b/sdk/python/featurestore_sample/project/env/conda.yml index df277381b9..b76c0c4292 100644 --- a/sdk/python/featurestore_sample/project/env/conda.yml +++ b/sdk/python/featurestore_sample/project/env/conda.yml @@ -5,7 +5,7 @@ dependencies: # Protobuf is needed to avoid conflict with managed spark - protobuf==3.19.6 # Feature store core SDK - - azureml-featurestore==0.1.0b2 + - azureml-featurestore==0.1.0b3 # This is needed if you want to execute the Part 2 of the "SDK" track or execute "SDK+CLI" track in the docs tutorial - azure-cli diff --git a/sdk/python/featurestore_sample/project/fraud_model/pipelines/batch_inference_pipeline.yaml b/sdk/python/featurestore_sample/project/fraud_model/pipelines/batch_inference_pipeline.yaml index c6ee87cc24..a876c384d1 100644 --- a/sdk/python/featurestore_sample/project/fraud_model/pipelines/batch_inference_pipeline.yaml +++ b/sdk/python/featurestore_sample/project/fraud_model/pipelines/batch_inference_pipeline.yaml @@ -18,7 +18,7 @@ inputs: jobs: retrieval_step: - component: azureml://registries/azureml/components/feature_retrieval/versions/0.1.0 + component: azureml://registries/azureml/components/feature_retrieval/versions/0.3.0 inputs: input_model: path: ${{parent.inputs.input_model}} diff --git a/sdk/python/featurestore_sample/project/fraud_model/pipelines/training_pipeline.yaml b/sdk/python/featurestore_sample/project/fraud_model/pipelines/training_pipeline.yaml index b9f6b10326..de9a229d86 100644 --- a/sdk/python/featurestore_sample/project/fraud_model/pipelines/training_pipeline.yaml +++ b/sdk/python/featurestore_sample/project/fraud_model/pipelines/training_pipeline.yaml @@ -17,7 +17,7 @@ inputs: jobs: feature_retrieval_step: - component: azureml://registries/azureml/components/feature_retrieval/versions/0.1.0 + component: azureml://registries/azureml/components/feature_retrieval/versions/0.3.0 inputs: feature_retrieval_spec: path: ${{parent.inputs.feature_retrieval_spec}} diff --git a/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score.json b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score.json new file mode 100644 index 0000000000..1277ad5af9 --- /dev/null +++ b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score.json @@ -0,0 +1 @@ +{"inputs": "My name is Julien and I like to"} \ No newline at end of file diff --git a/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score_backup.json b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score_backup.json new file mode 100644 index 0000000000..94a3bfab25 --- /dev/null +++ b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/sample_score_backup.json @@ -0,0 +1 @@ +{"inputs": "What can you do in Nuremberg, Germany? Give me 3 Tips"} \ No newline at end of file diff --git a/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/text-generation-streaming-online-endpoint.ipynb b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/text-generation-streaming-online-endpoint.ipynb new file mode 100644 index 0000000000..f8c4545ec1 --- /dev/null +++ b/sdk/python/foundation-models/huggingface/inference/text-generation-streaming/text-generation-streaming-online-endpoint.ipynb @@ -0,0 +1,507 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Deploy text-generation streaming models from HuggingFaceHub to AzureML Online Endpoints\n", + "\n", + "This sample shows how to deploy `text-generation` streaming models from the HuggingFaceHub to an online endpoint for inference. Learn more about `text-generation` task: https://huggingface.co/tasks/text-generation\n", + "\n", + "A large set of models hosted on [Hugging Face Hub](https://huggingface.co/models) are available in the Hugging Face Hub collection in AzureML Model Catalog. This collection is powered by the Hugging Face Hub community registry. Integration with the AzureML Model Catalog enables seamless deployment of Hugging Face Hub models in AzureML. [Learn more.](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-models-from-huggingface?view=azureml-api-2)", + "\n", + "### Outline\n", + "* Set up pre-requisites.\n", + "* Pick a model to deploy.\n", + "* Deploy the model for real time inference.\n", + "* Try sample inference.\n", + "* Clean up resources." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set up pre-requisites\n", + "* Install dependencies\n", + "* Connect to AzureML Workspace. Learn more at [set up SDK authentication](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-setup-authentication?tabs=sdk). Replace ``, `` and `` below.\n", + "* Connect to `HuggingFaceHub` community registry" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367816236 + } + }, + "outputs": [], + "source": [ + "from azure.ai.ml import MLClient\n", + "from azure.identity import (\n", + " DefaultAzureCredential,\n", + " InteractiveBrowserCredential,\n", + " ClientSecretCredential,\n", + ")\n", + "from azure.ai.ml.entities import AmlCompute\n", + "import time\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " credential = InteractiveBrowserCredential()\n", + "\n", + "# connect to a workspace\n", + "workspace_ml_client = None\n", + "try:\n", + " workspace_ml_client = MLClient.from_config(credential)\n", + " subscription_id = workspace_ml_client.subscription_id\n", + " workspace = workspace_ml_client.workspace_name\n", + " resource_group = workspace_ml_client.resource_group_name\n", + "except Exception as ex:\n", + " print(ex)\n", + " # Enter details of your workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + " workspace_ml_client = MLClient(\n", + " credential, subscription_id, resource_group, workspace\n", + " )\n", + "# Connect to the HuggingFaceHub registry\n", + "registry_ml_client = MLClient(credential, registry_name=\"HuggingFace\")\n", + "print(registry_ml_client)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pick a model to deploy\n", + "\n", + "Open the Model Catalog in AzureML Studio and choose the Hugging Face Hub collection. Filter by the `text-generation` task and search any specific models you are interested in. In this example, we use the `tiiuae-falcon-40b` model. If you plan to deploy a different model, replace the model name and version accordingly. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367836823 + } + }, + "outputs": [], + "source": [ + "model_name = \"tiiuae-falcon-40b\"\n", + "foundation_model = registry_ml_client.models.get(model_name, version=\"5\")\n", + "print(\n", + " \"\\n\\nUsing model name: {0}, version: {1}, id: {2} for inferencing\".format(\n", + " foundation_model.name, foundation_model.version, foundation_model.id\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Deploy the model to an online endpoint\n", + "Online endpoints give a durable REST API that can be used to integrate with applications that need to use the model. Create an online endpoint and then create an online deployment. You need to specify the Virtual Machine instance or SKU when creating the deployment. You can find the optimal CPU or GPU SKU for a model by opening the quick deployment dialog from the model page in the AzureML Model Catalog. Specify the SKU in the `instance_type` input in deployment settings below.\n", + "\n", + "Typically Online Endpoints require you to provide scoring script and a docker container image (through an AzureML environment), in addition to the model. You don't need to worry about them for HuggingFace Hub models available in AzureML Model Catalog because we have enabled 'no code deployments' for these models by packaging scoring script and container image along with the model.\n", + "\n", + "Learn more about Online Endpoints: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-online-endpoints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time, sys\n", + "from azure.ai.ml.entities import (\n", + " ManagedOnlineEndpoint,\n", + " ManagedOnlineDeployment,\n", + " OnlineRequestSettings,\n", + ")\n", + "\n", + "# Create online endpoint - endpoint names need to be unique in a region, hence using timestamp to create unique endpoint name\n", + "timestamp = int(time.time())\n", + "online_endpoint_name = \"text-generation-\" + str(timestamp)\n", + "# create an online endpoint\n", + "endpoint = ManagedOnlineEndpoint(\n", + " name=online_endpoint_name,\n", + " description=\"Online endpoint for \"\n", + " + foundation_model.name\n", + " + \", for text-generation task\",\n", + " auth_mode=\"key\",\n", + ")\n", + "workspace_ml_client.begin_create_or_update(endpoint).wait()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create a deployment\n", + "demo_deployment = ManagedOnlineDeployment(\n", + " name=\"demo\",\n", + " endpoint_name=online_endpoint_name,\n", + " model=foundation_model.id,\n", + " instance_type=\"Standard_ND96amsr_A100_v4\",\n", + " instance_count=1,\n", + ")\n", + "workspace_ml_client.online_deployments.begin_create_or_update(demo_deployment).wait()\n", + "# online endpoints can have multiple deployments with traffic split or shadow traffic. Set traffic to 100% for demo deployment\n", + "endpoint.traffic = {\"demo\": 100}\n", + "workspace_ml_client.begin_create_or_update(endpoint).result()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Try sample inference\n", + "\n", + "Online endpoints expose a REST API that can be integrated into your applications. Learn how to fetch the scoring REST API and credentials for online endpoints here: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-authenticate-online-endpoint\n", + "\n", + "In this example, we will use the Python SDK helper method to invoke the endpoint. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367842385 + } + }, + "outputs": [], + "source": [ + "# Get the model object from HuggingFaceHub. We can use it to check for sample test data\n", + "import urllib.request, json\n", + "\n", + "raw_data = urllib.request.urlopen(\n", + " \"https://huggingface.co/api/models/\" + foundation_model.tags[\"modelId\"]\n", + ")\n", + "\n", + "print(\"https://huggingface.co/api/models/\" + foundation_model.tags[\"modelId\"])\n", + "data = json.load(raw_data)\n", + "print(data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367847055 + } + }, + "outputs": [], + "source": [ + "# check if there is sample inference data available on HuggingFaceHub for the model, else try with the backup sample data\n", + "scoring_file = \"./sample_score.json\"\n", + "prompt = \"\"\n", + "if \"widgetData\" in data:\n", + " for input in data[\"widgetData\"]:\n", + " prompt = input[\"text\"]\n", + " break\n", + " # write the sample_score.json file\n", + " score_dict = {\"inputs\": prompt}\n", + " with open(scoring_file, \"w\") as outfile:\n", + " json.dump(score_dict, outfile)\n", + "else:\n", + " scoring_file = \"./sample_score_backup.json\"\n", + "\n", + "# print the sample scoring file\n", + "print(\"\\n\\nSample scoring file: \")\n", + "with open(scoring_file) as json_file:\n", + " scoring_data = json.load(json_file)\n", + " print(scoring_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367852666 + } + }, + "outputs": [], + "source": [ + "# score the sample_score.json file using the online endpoint with the azureml endpoint invoke method\n", + "response = workspace_ml_client.online_endpoints.invoke(\n", + " endpoint_name=online_endpoint_name,\n", + " deployment_name=\"demo\",\n", + " request_file=scoring_file,\n", + ")\n", + "response_json = json.loads(response)\n", + "print(json.dumps(response_json, indent=2))" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Stream responses from the online endpoint\n", + "Text-generation models can take considerable time to handle a request and return generated text. One way to improve the user experience is to stream tokens back to the user as they are generated. Learn more about streaming results from Hugging Face text-generation models here: https://huggingface.co/blog/inference-endpoints-llm.\n", + "\n", + "In this example, we will use the Hugging Face python text-generation `InferencingClient` to help stream results from our online endpoint. Learn more about Hugging Face text generation inference here: https://github.com/huggingface/text-generation-inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367879226 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Get the online endpoint scoring uri\n", + "online_endpoint = workspace_ml_client.online_endpoints.get(online_endpoint_name)\n", + "online_endpoint_scoring_uri = online_endpoint.scoring_uri\n", + "print(online_endpoint_scoring_uri)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367881833 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# Get the online endpoint api key for authenticating our inferencing request\n", + "keys = workspace_ml_client.online_endpoints.get_keys(online_endpoint_name)\n", + "api_key = keys.primary_key\n", + "print(api_key)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367886731 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "pip install text-generation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367890916 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "pip install -U huggingface_hub" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689367895354 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "pip install ipywidgets" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1689368085429 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from huggingface_hub import InferenceClient\n", + "\n", + "# HF Inference Endpoints parameter\n", + "# Note - do not use the full /generate scoring url here\n", + "endpoint_url = online_endpoint_scoring_uri.split(\"/generate\")[0]\n", + "print(\"Online endpoint url: {0}\".format(endpoint_url))\n", + "headers = {\"Content-Type\": \"application/json\"}\n", + "\n", + "# Streaming Client\n", + "client = InferenceClient(endpoint_url, token=api_key, headers=headers)\n", + "\n", + "# generation parameter\n", + "gen_kwargs = dict(\n", + " max_new_tokens=512,\n", + " top_k=30,\n", + " top_p=0.9,\n", + " temperature=0.2,\n", + " repetition_penalty=1.02,\n", + " stop_sequences=[\"\\nUser:\", \"<|endoftext|>\", \"\"],\n", + ")\n", + "\n", + "# Begin text generation stream\n", + "print(\"Prompt:\\n{0}\".format(prompt))\n", + "stream = client.text_generation(prompt, stream=True, details=True, **gen_kwargs)\n", + "print(\"Stream result:\\n\")\n", + "# yield each generated token\n", + "for r in stream:\n", + " # skip special tokens\n", + " if r.token.special:\n", + " continue\n", + " # stop if we encounter a stop sequence\n", + " if r.token.text in gen_kwargs[\"stop_sequences\"]:\n", + " break\n", + " # yield the generated token\n", + " print(r.token.text, end=\"\")\n", + " # yield r.token.text" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Delete the online endpoint\n", + "Don't forget to delete the online endpoint, else you will leave the billing meter running for the compute used by the endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workspace_ml_client.online_endpoints.begin_delete(name=online_endpoint_name).wait()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernel_info": { + "name": "python310-sdkv2" + }, + "kernelspec": { + "display_name": "Python 3.10 - SDK V2", + "language": "python", + "name": "python310-sdkv2" + }, + "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.10.11" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sdk/python/foundation-models/system/evaluation/fill-mask/fill-mask.ipynb b/sdk/python/foundation-models/system/evaluation/fill-mask/fill-mask.ipynb index a8c87ccc8f..9727f0f586 100644 --- a/sdk/python/foundation-models/system/evaluation/fill-mask/fill-mask.ipynb +++ b/sdk/python/foundation-models/system/evaluation/fill-mask/fill-mask.ipynb @@ -117,6 +117,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -326,10 +348,7 @@ " print(\"{} - {}\".format(model[\"name\"], test_data_fil_df.shape))\n", " test_data_file_name = \"small-test-{}.jsonl\".format(model[\"name\"])\n", " test_data_fil_df.to_json(test_data_file_name, lines=True, orient=\"records\")" - ], - "metadata": { - "collapsed": false - } + ] }, { "attachments": {}, @@ -377,6 +396,10 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"title\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"fill-mask\",\n", " # config file containing the details of evaluation metrics to calculate\n", @@ -384,7 +407,7 @@ " # evaluation_config_params=evaluation_config_params,\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/question-answering/question-answering.ipynb b/sdk/python/foundation-models/system/evaluation/question-answering/question-answering.ipynb index 73273de8f8..a94176559f 100644 --- a/sdk/python/foundation-models/system/evaluation/question-answering/question-answering.ipynb +++ b/sdk/python/foundation-models/system/evaluation/question-answering/question-answering.ipynb @@ -117,6 +117,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -363,13 +385,17 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"context,question\",\n", " label_column_name=\"answer_text\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"question-answering\",\n", " # config file containing the details of evaluation metrics to calculate\n", " evaluation_config=Input(type=AssetTypes.URI_FILE, path=\"./eval-config.json\"),\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization.ipynb b/sdk/python/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization.ipynb index 040caf65fc..ec466d6758 100644 --- a/sdk/python/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization.ipynb +++ b/sdk/python/foundation-models/system/evaluation/summarization/abstractive-and-extractive-summarization.ipynb @@ -115,6 +115,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -271,6 +293,17 @@ "test_data_df[\"summary\"] = test_data_df[\"highlights\"]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# trucating the data to pass the tokenizer limit of the model\n", + "test_data_df[\"article\"] = test_data_df[\"article\"].str.slice(0, 200)\n", + "test_data_df[\"input_string\"] = test_data_df[\"input_string\"].str.slice(0, 200)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -359,6 +392,10 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"summary\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"text-summarization\",\n", " # config file containing the details of evaluation metrics to calculate\n", @@ -366,7 +403,7 @@ " # evaluation_config_params=evaluation_config_params,\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/text-classification/entailment-contradiction.ipynb b/sdk/python/foundation-models/system/evaluation/text-classification/entailment-contradiction.ipynb index 6a6f4878a2..20ead0ba6f 100644 --- a/sdk/python/foundation-models/system/evaluation/text-classification/entailment-contradiction.ipynb +++ b/sdk/python/foundation-models/system/evaluation/text-classification/entailment-contradiction.ipynb @@ -122,6 +122,28 @@ "workspace_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -356,13 +378,17 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"label_string\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"text-classification\",\n", " # config file containing the details of evaluation metrics to calculate\n", " evaluation_config=Input(type=AssetTypes.URI_FILE, path=\"./eval-config.json\"),\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/text-generation/text-generation.ipynb b/sdk/python/foundation-models/system/evaluation/text-generation/text-generation.ipynb index 3fecb3f453..f2f2fb48a6 100644 --- a/sdk/python/foundation-models/system/evaluation/text-generation/text-generation.ipynb +++ b/sdk/python/foundation-models/system/evaluation/text-generation/text-generation.ipynb @@ -117,6 +117,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -215,6 +237,9 @@ { "cell_type": "code", "execution_count": null, + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "models = []\n", @@ -223,21 +248,18 @@ " reg_model = list(registry_ml_client.models.list(name=model[\"name\"]))[0]\n", " print(reg_model.id)\n", " models.append({**model, \"version\": reg_model.version})" - ], - "metadata": { - "collapsed": false - } + ] }, { "cell_type": "code", "execution_count": null, + "metadata": { + "collapsed": false + }, "outputs": [], "source": [ "models" - ], - "metadata": { - "collapsed": false - } + ] }, { "attachments": {}, @@ -360,13 +382,17 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"ground_truth\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"text-generation\",\n", " # config file containing the details of evaluation metrics to calculate\n", " evaluation_config=Input(type=AssetTypes.URI_FILE, path=\"./eval-config.json\"),\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition.ipynb b/sdk/python/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition.ipynb index 655d3ccee4..e5c0ae8446 100644 --- a/sdk/python/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition.ipynb +++ b/sdk/python/foundation-models/system/evaluation/token-classification/news-articles-entity-recognition.ipynb @@ -115,6 +115,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -390,13 +412,17 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"ner_tags_str\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"text-named-entity-recognition\",\n", " # config file containing the details of evaluation metrics to calculate\n", " evaluation_config=Input(type=AssetTypes.URI_FILE, path=\"./eval-config.json\"),\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/evaluation/translation/translation-romanian-to-english.ipynb b/sdk/python/foundation-models/system/evaluation/translation/translation-romanian-to-english.ipynb index 1eefaa6e02..43ae2d23be 100644 --- a/sdk/python/foundation-models/system/evaluation/translation/translation-romanian-to-english.ipynb +++ b/sdk/python/foundation-models/system/evaluation/translation/translation-romanian-to-english.ipynb @@ -115,6 +115,28 @@ "registry_ml_client" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating Compute\n", + "\n", + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "To submit a job through a compute, you need to create a compute cluster beforehand.\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization." + ] + }, { "cell_type": "code", "execution_count": null, @@ -358,13 +380,17 @@ " # The following parameters map to the dataset fields\n", " input_column_names=\"input_string\",\n", " label_column_name=\"ro\",\n", + " # compute settings\n", + " compute_name=compute_cluster,\n", + " # specify the instance type for serverless job\n", + " # instance_type= \"STANDARD_NC24\",\n", " # Evaluation settings\n", " task=\"text-translation\",\n", " # config file containing the details of evaluation metrics to calculate\n", " evaluation_config=Input(type=AssetTypes.URI_FILE, path=\"./eval-config.json\"),\n", " # config cluster/device job is running on\n", " # set device to GPU/CPU on basis if GPU count was found\n", - " device=\"gpu\" if gpu_count_found else \"cpu\",\n", + " device=\"auto\",\n", " )\n", " return {\"evaluation_result\": evaluation_job.outputs.evaluation_result}" ] diff --git a/sdk/python/foundation-models/system/finetune/question-answering/extractive-qa.ipynb b/sdk/python/foundation-models/system/finetune/question-answering/extractive-qa.ipynb index b519d4f215..a74cf680dd 100644 --- a/sdk/python/foundation-models/system/finetune/question-answering/extractive-qa.ipynb +++ b/sdk/python/foundation-models/system/finetune/question-answering/extractive-qa.ipynb @@ -92,7 +92,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml-preview\"\n", + "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml\"\n", "registry_ml_client = MLClient(credential, registry_name=\"azureml\")\n", "\n", "experiment_name = \"question-answering-extractive-qna\"\n", @@ -344,6 +344,54 @@ "Create the job that uses the `question-answering` pipeline component. [Learn more](https://github.com/Azure/azureml-assets/blob/main/training/finetune_acft_hf_nlp/components/pipeline_components/question_answering/README.md) about all the parameters supported for fine tuning." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define finetune parameters\n", + "\n", + "Finetune parameters can be grouped into 2 categories - training parameters, optimization parameters\n", + "\n", + "Training parameters define the training aspects such as - \n", + "1. the optimizer, scheduler to use\n", + "2. the metric to optimize the finetune\n", + "3. number of training steps and the batch size\n", + "and so on\n", + "\n", + "Optimization parameters help in optimizing the GPU memory and effectively using the compute resources. Below are few of the parameters that belong to this category. _The optimization parameters differs for each model and are packaged with the model to handle these variations._\n", + "1. enable the deepspeed, ORT and LoRA\n", + "2. enable mixed precision training\n", + "2. enable multi-node training " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "training_parameters = dict(\n", + " num_train_epochs=3,\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " learning_rate=2e-5,\n", + " metric_for_best_model=\"exact\",\n", + ")\n", + "print(f\"The following training parameters are enabled - {training_parameters}\")\n", + "\n", + "# Optimization parameters - As these parameters are packaged with the model itself, lets retrieve those parameters\n", + "if \"model_specific_defaults\" in foundation_model.tags:\n", + " optimization_parameters = ast.literal_eval(\n", + " foundation_model.tags[\"model_specific_defaults\"]\n", + " ) # convert string to python dict\n", + "else:\n", + " optimization_parameters = dict(\n", + " apply_lora=\"true\", apply_deepspeed=\"true\", apply_ort=\"true\"\n", + " )\n", + "print(f\"The following optimizations are enabled - {optimization_parameters}\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -400,14 +448,8 @@ " answer_text_key=\"text\",\n", " # training settings\n", " number_of_gpu_to_use_finetuning=gpus_per_node, # set to the number of GPUs available in the compute\n", - " num_train_epochs=3,\n", - " per_device_train_batch_size=1,\n", - " per_device_eval_batch_size=1,\n", - " learning_rate=2e-5,\n", - " metric_for_best_model=\"exact\",\n", - " apply_lora=\"true\",\n", - " apply_deepspeed=\"true\",\n", - " apply_ort=\"true\",\n", + " **training_parameters,\n", + " **optimization_parameters\n", " )\n", " return {\n", " # map the output of the fine tuning job to the output of the pipeline job so that we can easily register the fine tuned model\n", diff --git a/sdk/python/foundation-models/system/finetune/summarization/news-summary.ipynb b/sdk/python/foundation-models/system/finetune/summarization/news-summary.ipynb index f9884ac3ce..6621b9f616 100644 --- a/sdk/python/foundation-models/system/finetune/summarization/news-summary.ipynb +++ b/sdk/python/foundation-models/system/finetune/summarization/news-summary.ipynb @@ -91,7 +91,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml-preview\"\n", + "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml\"\n", "registry_ml_client = MLClient(credential, registry_name=\"azureml\")\n", "\n", "experiment_name = \"summarization-news-summary\"\n", @@ -349,6 +349,54 @@ "Create the job that uses the `summarization` pipeline component. [Learn more](https://github.com/Azure/azureml-assets/blob/main/training/finetune_acft_hf_nlp/components/pipeline_components/summarization/README.md) about all the parameters supported for fine tuning." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define finetune parameters\n", + "\n", + "Finetune parameters can be grouped into 2 categories - training parameters, optimization parameters\n", + "\n", + "Training parameters define the training aspects such as - \n", + "1. the optimizer, scheduler to use\n", + "2. the metric to optimize the finetune\n", + "3. number of training steps and the batch size\n", + "and so on\n", + "\n", + "Optimization parameters help in optimizing the GPU memory and effectively using the compute resources. Below are few of the parameters that belong to this category. _The optimization parameters differs for each model and are packaged with the model to handle these variations._\n", + "1. enable the deepspeed, ORT and LoRA\n", + "2. enable mixed precision training\n", + "2. enable multi-node training " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "training_parameters = dict(\n", + " num_train_epochs=3,\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " learning_rate=2e-5,\n", + " metric_for_best_model=\"rouge1\",\n", + ")\n", + "print(f\"The following training parameters are enabled - {training_parameters}\")\n", + "\n", + "# Optimization parameters - As these parameters are packaged with the model itself, lets retrieve those parameters\n", + "if \"model_specific_defaults\" in foundation_model.tags:\n", + " optimization_parameters = ast.literal_eval(\n", + " foundation_model.tags[\"model_specific_defaults\"]\n", + " ) # convert string to python dict\n", + "else:\n", + " optimization_parameters = dict(\n", + " apply_lora=\"true\", apply_deepspeed=\"true\", apply_ort=\"true\"\n", + " )\n", + "print(f\"The following optimizations are enabled - {optimization_parameters}\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -394,14 +442,8 @@ " summary_key=\"highlights\",\n", " # training settings\n", " number_of_gpu_to_use_finetuning=gpus_per_node, # set to the number of GPUs available in the compute\n", - " num_train_epochs=3,\n", - " per_device_train_batch_size=1,\n", - " per_device_eval_batch_size=1,\n", - " learning_rate=2e-5,\n", - " metric_for_best_model=\"rouge1\",\n", - " apply_deepspeed=\"true\",\n", - " apply_ort=\"true\",\n", - " apply_lora=\"true\",\n", + " **training_parameters,\n", + " **optimization_parameters\n", " )\n", " return {\n", " # map the output of the fine tuning job to the output of the pipeline job so that we can easily register the fine tuned model\n", diff --git a/sdk/python/foundation-models/system/finetune/text-classification/emotion-detection.ipynb b/sdk/python/foundation-models/system/finetune/text-classification/emotion-detection.ipynb index 8522485ada..eabc83a30f 100644 --- a/sdk/python/foundation-models/system/finetune/text-classification/emotion-detection.ipynb +++ b/sdk/python/foundation-models/system/finetune/text-classification/emotion-detection.ipynb @@ -92,7 +92,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml-preview\"\n", + "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml\"\n", "registry_ml_client = MLClient(credential, registry_name=\"azureml\")\n", "\n", "experiment_name = \"text-classification-emotion-detection\"\n", @@ -386,6 +386,54 @@ "Create the job that uses the `text-classification` pipeline component. [Learn more](https://github.com/Azure/azureml-assets/blob/main/training/finetune_acft_hf_nlp/components/pipeline_components/text_classification/README.md) about all the parameters supported for fine tuning." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define finetune parameters\n", + "\n", + "Finetune parameters can be grouped into 2 categories - training parameters, optimization parameters\n", + "\n", + "Training parameters define the training aspects such as - \n", + "1. the optimizer, scheduler to use\n", + "2. the metric to optimize the finetune\n", + "3. number of training steps and the batch size\n", + "and so on\n", + "\n", + "Optimization parameters help in optimizing the GPU memory and effectively using the compute resources. Below are few of the parameters that belong to this category. _The optimization parameters differs for each model and are packaged with the model to handle these variations._\n", + "1. enable the deepspeed, ORT and LoRA\n", + "2. enable mixed precision training\n", + "2. enable multi-node training " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "training_parameters = dict(\n", + " num_train_epochs=3,\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " learning_rate=2e-5,\n", + " metric_for_best_model=\"f1_macro\",\n", + ")\n", + "print(f\"The following training parameters are enabled - {training_parameters}\")\n", + "\n", + "# Optimization parameters - As these parameters are packaged with the model itself, lets retrieve those parameters\n", + "if \"model_specific_defaults\" in foundation_model.tags:\n", + " optimization_parameters = ast.literal_eval(\n", + " foundation_model.tags[\"model_specific_defaults\"]\n", + " ) # convert string to python dict\n", + "else:\n", + " optimization_parameters = dict(\n", + " apply_lora=\"true\", apply_deepspeed=\"true\", apply_ort=\"true\"\n", + " )\n", + "print(f\"The following optimizations are enabled - {optimization_parameters}\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -431,14 +479,8 @@ " label_key=\"label_string\",\n", " # Training settings\n", " number_of_gpu_to_use_finetuning=gpus_per_node, # set to the number of GPUs available in the compute\n", - " num_train_epochs=3,\n", - " per_device_train_batch_size=1,\n", - " per_device_eval_batch_size=1,\n", - " learning_rate=2e-5,\n", - " metric_for_best_model=\"f1_macro\",\n", - " apply_deepspeed=\"true\",\n", - " apply_lora=\"true\",\n", - " apply_ort=\"true\",\n", + " **training_parameters,\n", + " **optimization_parameters\n", " )\n", " return {\n", " # map the output of the fine tuning job to the output of pipeline job so that we can easily register the fine tuned model\n", diff --git a/sdk/python/foundation-models/system/finetune/token-classification/token-classification.ipynb b/sdk/python/foundation-models/system/finetune/token-classification/token-classification.ipynb index 0ef74ac084..631ed2d220 100644 --- a/sdk/python/foundation-models/system/finetune/token-classification/token-classification.ipynb +++ b/sdk/python/foundation-models/system/finetune/token-classification/token-classification.ipynb @@ -92,7 +92,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml-preview\"\n", + "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml\"\n", "registry_ml_client = MLClient(credential, registry_name=\"azureml\")\n", "\n", "experiment_name = \"token-classification-ner\"\n", @@ -352,6 +352,54 @@ "Create the job that uses the `token-classification` pipeline component. [Learn more](https://github.com/Azure/azureml-assets/blob/main/training/finetune_acft_hf_nlp/components/pipeline_components/token_classification/README.md) about all the parameters supported for fine tuning." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define finetune parameters\n", + "\n", + "Finetune parameters can be grouped into 2 categories - training parameters, optimization parameters\n", + "\n", + "Training parameters define the training aspects such as - \n", + "1. the optimizer, scheduler to use\n", + "2. the metric to optimize the finetune\n", + "3. number of training steps and the batch size\n", + "and so on\n", + "\n", + "Optimization parameters help in optimizing the GPU memory and effectively using the compute resources. Below are few of the parameters that belong to this category. _The optimization parameters differs for each model and are packaged with the model to handle these variations._\n", + "1. enable the deepspeed, ORT and LoRA\n", + "2. enable mixed precision training\n", + "2. enable multi-node training " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "training_parameters = dict(\n", + " num_train_epochs=3,\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " learning_rate=2e-5,\n", + " metric_for_best_model=\"f1\",\n", + ")\n", + "print(f\"The following training parameters are enabled - {training_parameters}\")\n", + "\n", + "# Optimization parameters - As these parameters are packaged with the model itself, lets retrieve those parameters\n", + "if \"model_specific_defaults\" in foundation_model.tags:\n", + " optimization_parameters = ast.literal_eval(\n", + " foundation_model.tags[\"model_specific_defaults\"]\n", + " ) # convert string to python dict\n", + "else:\n", + " optimization_parameters = dict(\n", + " apply_lora=\"true\", apply_deepspeed=\"true\", apply_ort=\"true\"\n", + " )\n", + "print(f\"The following optimizations are enabled - {optimization_parameters}\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -397,14 +445,8 @@ " tag_key=\"ner_tags_str\",\n", " # Training settings\n", " number_of_gpu_to_use_finetuning=gpus_per_node, # set to the number of GPUs available in the compute\n", - " num_train_epochs=3,\n", - " per_device_train_batch_size=1,\n", - " per_device_eval_batch_size=1,\n", - " learning_rate=2e-5,\n", - " metric_for_best_model=\"f1\",\n", - " apply_lora=\"true\",\n", - " apply_ort=\"true\",\n", - " apply_deepspeed=\"true\",\n", + " **training_parameters,\n", + " **optimization_parameters\n", " )\n", " return {\n", " # map the output of the fine tuning job to the output of pipeline job so that we can easily register the fine tuned model\n", diff --git a/sdk/python/foundation-models/system/finetune/translation/translation.ipynb b/sdk/python/foundation-models/system/finetune/translation/translation.ipynb index 2a8e3d1c14..1fad95da97 100644 --- a/sdk/python/foundation-models/system/finetune/translation/translation.ipynb +++ b/sdk/python/foundation-models/system/finetune/translation/translation.ipynb @@ -91,7 +91,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml-preview\"\n", + "# the models, fine tuning pipelines and environments are available in the AzureML system registry, \"azureml\"\n", "registry_ml_client = MLClient(credential, registry_name=\"azureml\")\n", "\n", "experiment_name = \"translation-wmt16-en-ro\"\n", @@ -344,6 +344,54 @@ "Create the job that uses the `translation` pipeline component. [Learn more](https://github.com/Azure/azureml-assets/blob/main/training/finetune_acft_hf_nlp/components/pipeline_components/translation/README.md) about all the parameters supported for fine tuning." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define finetune parameters\n", + "\n", + "Finetune parameters can be grouped into 2 categories - training parameters, optimization parameters\n", + "\n", + "Training parameters define the training aspects such as - \n", + "1. the optimizer, scheduler to use\n", + "2. the metric to optimize the finetune\n", + "3. number of training steps and the batch size\n", + "and so on\n", + "\n", + "Optimization parameters help in optimizing the GPU memory and effectively using the compute resources. Below are few of the parameters that belong to this category. _The optimization parameters differs for each model and are packaged with the model to handle these variations._\n", + "1. enable the deepspeed, ORT and LoRA\n", + "2. enable mixed precision training\n", + "2. enable multi-node training " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training parameters\n", + "training_parameters = dict(\n", + " num_train_epochs=3,\n", + " per_device_train_batch_size=1,\n", + " per_device_eval_batch_size=1,\n", + " learning_rate=2e-5,\n", + " metric_for_best_model=\"bleu\",\n", + ")\n", + "print(f\"The following training parameters are enabled - {training_parameters}\")\n", + "\n", + "# Optimization parameters - As these parameters are packaged with the model itself, lets retrieve those parameters\n", + "if \"model_specific_defaults\" in foundation_model.tags:\n", + " optimization_parameters = ast.literal_eval(\n", + " foundation_model.tags[\"model_specific_defaults\"]\n", + " ) # convert string to python dict\n", + "else:\n", + " optimization_parameters = dict(\n", + " apply_lora=\"true\", apply_deepspeed=\"true\", apply_ort=\"true\"\n", + " )\n", + "print(f\"The following optimizations are enabled - {optimization_parameters}\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -389,14 +437,8 @@ " target_lang=\"ro\",\n", " # training settings\n", " number_of_gpu_to_use_finetuning=gpus_per_node, # set to the number of GPUs available in the compute\n", - " num_train_epochs=3,\n", - " per_device_train_batch_size=1,\n", - " per_device_eval_batch_size=1,\n", - " learning_rate=2e-5,\n", - " metric_for_best_model=\"bleu\",\n", - " apply_lora=\"true\",\n", - " apply_deepspeed=\"true\",\n", - " apply_ort=\"true\",\n", + " **training_parameters,\n", + " **optimization_parameters\n", " )\n", " return {\n", " # map the output of the fine tuning job to the output of the pipeline job so that we can easily register the fine tuned model\n", diff --git a/sdk/python/foundation-models/system/import/import_model_into_registry.ipynb b/sdk/python/foundation-models/system/import/import_model_into_registry.ipynb index 6bfc33298e..c11af9dabd 100644 --- a/sdk/python/foundation-models/system/import/import_model_into_registry.ipynb +++ b/sdk/python/foundation-models/system/import/import_model_into_registry.ipynb @@ -163,7 +163,7 @@ " workspace_name=\"\",\n", " )\n", "\n", - "ml_client_registry = MLClient(credential, registry_name=\"azureml-preview\")" + "ml_client_registry = MLClient(credential, registry_name=\"azureml\")" ] }, { diff --git a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.ipynb b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.ipynb index 0583327e5d..4d1aced21d 100644 --- a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.ipynb +++ b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-batch-endpoint.ipynb @@ -19,7 +19,6 @@ "We will use the [Librispeech ASR](https://huggingface.co/datasets/librispeech_asr/viewer/clean/test) dataset. \\\n", "You can use also use custom audio files stored on the cloud and verify inference.\n", "- Most common audio formats (m4a, wav, flac, wma, mp3, etc.) are supported.\n", - "- The whisper model can process only 30 seconds of data at a time, so if the file you upload is longer than 30 seconds, only the first 30 seconds will be transcribed. This can be circumvented by splitting the file into 30 second chunks.\n", "\n", "### Outline\n", "* Set up pre-requisites.\n", @@ -138,7 +137,7 @@ "compute_cluster = AmlCompute(\n", " name=compute_name,\n", " description=\"An AML compute cluster\",\n", - " size=\"Standard_DS4_V2\",\n", + " size=\"Standard_DS5_V2\",\n", " min_instances=0,\n", " max_instances=3,\n", " idle_time_before_scale_down=120,\n", @@ -164,7 +163,7 @@ "outputs": [], "source": [ "model_name = \"openai-whisper-large\"\n", - "model_version = \"4\"\n", + "model_version = \"10\"\n", "foundation_model = registry_ml_client.models.get(model_name, model_version)\n", "print(\n", " f\"Using model name: {foundation_model.name}, version: {foundation_model.version}, id: {foundation_model.id} for inferencing.\"\n", diff --git a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-online-endpoint.ipynb b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-online-endpoint.ipynb index ec3be73411..a1ac2c5f02 100644 --- a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-online-endpoint.ipynb +++ b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/asr-online-endpoint.ipynb @@ -19,7 +19,6 @@ "We will use custom audio files that have been uploaded to the cloud. \\\n", "You can replace the links with any audio file stored on the cloud and verify inference.\n", "- Most common audio formats (m4a, wav, flac, wma, mp3, etc.) are supported.\n", - "- The whisper model can process only 30 seconds of data at a time, so if the file you upload is longer than 30 seconds, only the first 30 seconds will be transcribed. This can be circumvented by splitting the file into 30 second chunks.\n", "\n", "### Outline\n", "* Set up pre-requisites.\n", @@ -149,10 +148,10 @@ " name=\"demo\",\n", " endpoint_name=online_endpoint_name,\n", " model=foundation_model.id,\n", - " instance_type=\"Standard_DS4_v2\",\n", + " instance_type=\"Standard_DS5_v2\",\n", " instance_count=1,\n", " request_settings=OnlineRequestSettings(\n", - " request_timeout_ms=60000,\n", + " request_timeout_ms=90000,\n", " ),\n", ")\n", "workspace_ml_client.online_deployments.begin_create_or_update(demo_deployment).wait()\n", diff --git a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/sample-request/sample_score.json b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/sample-request/sample_score.json index d93320aca4..c58cdb559b 100644 --- a/sdk/python/foundation-models/system/inference/automatic-speech-recognition/sample-request/sample_score.json +++ b/sdk/python/foundation-models/system/inference/automatic-speech-recognition/sample-request/sample_score.json @@ -1,6 +1,6 @@ { "inputs": { - "audio": ["https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac", "https://audiovisionfiles.blob.core.windows.net/audio/audio.m4a"], - "language": ["en", "en"] + "audio": ["https://datasets-server.huggingface.co/assets/librispeech_asr/--/all/train.clean.100/84/audio/audio.mp3"], + "language": ["en"] } } \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/aacs-prepare-uai.ipynb b/sdk/python/foundation-models/system/inference/text-generation/aacs-prepare-uai.ipynb new file mode 100644 index 0000000000..666c6786a1 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/aacs-prepare-uai.ipynb @@ -0,0 +1,448 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Prepare UAI account for Azure Content Safety enabled Llama 2 model deployment\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Prerequisites" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.1 Assign variables" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "uai_name = f\"aacs-uai\"\n", + "\n", + "# The name of the AACS created in deploy_llama notebook\n", + "# Leave it blank will assign all AACS resource under resources group to the UAI\n", + "aacs_name = \"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2 Get credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3 Configure workspace " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml import MLClient\n", + "\n", + "try:\n", + " ml_client = MLClient.from_config(credential=credential)\n", + "except Exception as ex:\n", + " # enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace_name = \"\"\n", + "\n", + " # get a handle to the workspace\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace_name)\n", + "\n", + "\n", + "subscription_id = ml_client.subscription_id\n", + "resource_group = ml_client.resource_group_name\n", + "workspace_name = ml_client.workspace_name\n", + "workspace_resource = ml_client.workspaces.get(workspace_name)\n", + "workspace_location = workspace_resource.location\n", + "\n", + "print(f\"Connected to workspace {workspace_name}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Create a Managed Identity for the Azure AI Content Safety enabled Llama 2 endpoint" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.1 Get a handle to the ManagedServiceIdentityClient" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.msi import ManagedServiceIdentityClient\n", + "from azure.mgmt.msi.models import Identity\n", + "\n", + "msi_client = ManagedServiceIdentityClient(\n", + " subscription_id=subscription_id,\n", + " credential=credential,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.2 Create the User Assigned Identity:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "msi_client.user_assigned_identities.create_or_update(\n", + " resource_group_name=resource_group,\n", + " resource_name=uai_name,\n", + " parameters=Identity(location=workspace_location),\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.3 Retrieve the identity object\n", + "we need to retrieve the identity object so that we can use it to deploy the Azure AI Content Safety enabled Llama 2 online endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "uai_identity = msi_client.user_assigned_identities.get(\n", + " resource_group_name=resource_group,\n", + " resource_name=uai_name,\n", + ")\n", + "uai_principal_id = uai_identity.principal_id\n", + "uai_client_id = uai_identity.client_id\n", + "uai_id = uai_identity.id\n", + "print(f\"UAI principal id: {uai_principal_id}\")\n", + "print(f\"UAI id: {uai_id}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2.4 Grant appropriate roles to the UAI we created above.\n", + "Note: In order to successfully run scripts in current step, your must have owner permission on the AACS resource and the Llama 2 endpoint, which we created in the previous steps." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.4.1 Get an AuthorizationManagementClient to list Role Definitions" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.authorization import AuthorizationManagementClient\n", + "from azure.mgmt.authorization.v2022_04_01.models import (\n", + " RoleAssignmentCreateParameters,\n", + ")\n", + "import uuid\n", + "\n", + "role_definition_client = AuthorizationManagementClient(\n", + " credential=credential,\n", + " subscription_id=subscription_id,\n", + " api_version=\"2022-04-01\",\n", + ")\n", + "role_assignment_client = AuthorizationManagementClient(\n", + " credential=credential,\n", + " subscription_id=subscription_id,\n", + " api_version=\"2022-04-01\",\n", + ")\n", + "\n", + "uai_role_check_list = {\n", + " \"Cognitive Services Contributor\": {\n", + " \"step\": \"4.2.2\",\n", + " \"description\": \"assigne the role Cognitive Services User to the UAI on the Azure AI Content Safety resource.\",\n", + " },\n", + " \"AcrPull\": {\n", + " \"step\": \"4.2.3\",\n", + " \"description\": \"assigne the role AcrPull to the UAI on the Azure Container Registry.\",\n", + " },\n", + " \"Storage Blob Data Reader\": {\n", + " \"step\": \"4.2.4\",\n", + " \"description\": \"assigne the role Storage Blob Data Reader to the UAI on the Azure Storage account.\",\n", + " },\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.4.2 Define util function to assign access for UAI\n", + "Cognitive Services User role is required to access the Azure Content Safety resource." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "role_name = \"Cognitive Services Contributor\" # minimum role required for listing AACS access keys\n", + "\n", + "\n", + "def assign_access_to_acs(scope):\n", + " role_defs = role_definition_client.role_definitions.list(scope=scope)\n", + " role_def = next((r for r in role_defs if r.role_name == role_name))\n", + "\n", + " from azure.core.exceptions import ResourceExistsError\n", + "\n", + " try:\n", + " role_assignment_client.role_assignments.create(\n", + " scope=scope,\n", + " role_assignment_name=str(uuid.uuid4()),\n", + " parameters=RoleAssignmentCreateParameters(\n", + " role_definition_id=role_def.id,\n", + " principal_id=uai_principal_id,\n", + " principal_type=\"ServicePrincipal\",\n", + " ),\n", + " )\n", + " except ResourceExistsError as ex:\n", + " pass\n", + " except Exception as ex:\n", + " print(ex)\n", + " raise ex\n", + "\n", + " if role_name in uai_role_check_list:\n", + " del uai_role_check_list[role_name]\n", + " print(\n", + " f\"Role assignment for {role_name} at the Azure AI Content Safety resource level completed.\"\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.4.3 Grant the user identity access to the Azure Content Safety resource" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient\n", + "\n", + "acs_client = CognitiveServicesManagementClient(credential, subscription_id)\n", + "\n", + "\n", + "def find_acs(accounts):\n", + " return next(x for x in accounts if x.kind == \"ContentSafety\")\n", + "\n", + "\n", + "if aacs_name == \"\":\n", + " for acs_resource in acs_client.accounts.list_by_resource_group(resource_group):\n", + " assign_access_to_acs(acs_resource.id)\n", + "else:\n", + " acs_resource = acs_client.accounts.get(resource_group, aacs_name)\n", + " assign_access_to_acs(acs_resource.id)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.4.4 Assign AcrPull at the workspace container registry scope\n", + "Since we will create the Azure AI Content Safety enabled Llama 2 endpoint with User Assigned Identity, the user managed identity must have Storage Blob Data Reader permission on the storage account for the workspace, and AcrPull permission on the Azure Container Registry (ACR) for the workspace. Make sure your User Assigned Identity has the right permission." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "container_registry = workspace_resource.container_registry\n", + "\n", + "role_name = \"AcrPull\"\n", + "\n", + "role_defs = role_definition_client.role_definitions.list(scope=container_registry)\n", + "role_def = next((r for r in role_defs if r.role_name == role_name))\n", + "\n", + "from azure.core.exceptions import ResourceExistsError\n", + "\n", + "try:\n", + " role_assignment_client.role_assignments.create(\n", + " scope=container_registry,\n", + " role_assignment_name=str(uuid.uuid4()),\n", + " parameters=RoleAssignmentCreateParameters(\n", + " role_definition_id=role_def.id,\n", + " principal_id=uai_principal_id,\n", + " principal_type=\"ServicePrincipal\",\n", + " ),\n", + " )\n", + "except ResourceExistsError as ex:\n", + " pass\n", + "except Exception as ex:\n", + " print(ex)\n", + " raise ex\n", + "\n", + "if role_name in uai_role_check_list:\n", + " del uai_role_check_list[role_name]\n", + "print(\"Role assignment for AcrPull at the workspace container registry completed.\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 2.4.6 Assign Storage Blob Data Reader at the workspace storage account scope" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "role_name = \"Storage Blob Data Reader\"\n", + "blob_scope = workspace_resource.storage_account\n", + "\n", + "role_defs = role_definition_client.role_definitions.list(scope=blob_scope)\n", + "role_def = next((r for r in role_defs if r.role_name == role_name))\n", + "\n", + "from azure.core.exceptions import ResourceExistsError\n", + "\n", + "try:\n", + " role_assignment_client.role_assignments.create(\n", + " scope=blob_scope,\n", + " role_assignment_name=str(uuid.uuid4()),\n", + " parameters=RoleAssignmentCreateParameters(\n", + " role_definition_id=role_def.id,\n", + " principal_id=uai_principal_id,\n", + " principal_type=\"ServicePrincipal\",\n", + " ),\n", + " )\n", + "except ResourceExistsError as ex:\n", + " pass\n", + "except Exception as ex:\n", + " print(ex)\n", + " raise ex\n", + "\n", + "if role_name in uai_role_check_list:\n", + " del uai_role_check_list[role_name]\n", + "print(\n", + " \"Role assignment for `Storage Blob Data Reader` at the workspace storage account completed.\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "2.4.7 Let's make sure we didn't miss anything in the previous steps, please execute the following script to check on that:__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check everything is properly done before creating the Azure AI Content Safety Enabled Llama 2 online endpoint\n", + "missing_steps = []\n", + "print(\n", + " \"You selected UAI to deploy the Azure AI Content Safety Enabled Llama 2 online endpoint, checking if the UAI has the required roles assigned...\"\n", + ")\n", + "if uai_role_check_list:\n", + " for key, value in uai_role_check_list.items():\n", + " missing_steps.append(\n", + " f'Please go to step {value[\"step\"]} to {value[\"description\"]}'\n", + " )\n", + "\n", + "if missing_steps:\n", + " print(\"Seems you missed some step above.\")\n", + " steps = \"\\n\".join(missing_steps)\n", + " raise Exception(f\"Please complete the missing steps before proceeding:\\n{steps}\")\n", + "else:\n", + " print(\n", + " \"All steps are completed, proceeding to create the Azure AI Content Safety Enabled Llama 2 online endpoint...\\n\"\n", + " f\"uai_id: {uai_id}\\n\"\n", + " f\"uai_client_id: {uai_client_id}\"\n", + " )" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/sdk/python/foundation-models/system/inference/text-generation/falcon-safe-online-deployment.ipynb b/sdk/python/foundation-models/system/inference/text-generation/falcon-safe-online-deployment.ipynb new file mode 100644 index 0000000000..b4e5d67da7 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/falcon-safe-online-deployment.ipynb @@ -0,0 +1,617 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to create an Azure AI Content Safety enabled Falcon online endpoint (Preview)\n", + "### This notebook will walk you through the steps to create an __Azure AI Content Safety__ enabled __Falcon__ online endpoint.\n", + "### This notebook is under preview\n", + "### The steps are:\n", + "1. Create an __Azure AI Content Safety__ resource for moderating the request from user and response from the __Falcon__ online endpoint.\n", + "2. Create a new __Azure AI Content Safety__ enabled __Falcon__ online endpoint with a custom score.py which will integrate with the __Azure AI Content Safety__ resource to moderate the response from the __Falcon__ model and the request from the user, but to make the custom score.py to successfully authenticated to the __Azure AI Content Safety__ resource, we have 2 options:\n", + " 1. __UAI__, recommended but more complex approach, is to create a User Assigned Identity (UAI) and assign appropriate roles to the UAI. Then, the custom score.py can obtain the access token of the UAI from the AAD server to access the Azure AI Content Safety resource. Use [this notebook](aacs-prepare-uai.ipynb) to create UAI account for step 3 below\n", + " 2. __Environment variable__, simpler but less secure approach, is to just pass the access key of the Azure AI Content Safety resource to the custom score.py via environment variable, then the custom score.py can use the key directly to access the Azure AI Content Safety resource, this option is less secure than the first option, if someone in your org has access to the endpoint, he/she can get the access key from the environment variable and use it to access the Azure AI Content Safety resource.\n", + " " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Prerequisites\n", + "#### 1.1 Check List:\n", + "- [x] You have created a new Python virtual environment for this notebook.\n", + "- [x] The identity you are using to execute this notebook(yourself or your VM) need to have the __Contributor__ role on the resource group where the AML Workspace your specified is located, because this notebook will create an Azure AI Content Safety resource using that identity." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2 Assign variables for the workspace and deployment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The public registry name contains Falcon models\n", + "registry_name = \"azureml\"\n", + "\n", + "# Name of the Falcon model to be deployed\n", + "model_name = \"tiiuae-falcon-7b\"\n", + "\n", + "endpoint_name = f\"{model_name}-test-ep\" # Replace with your endpoint name\n", + "deployment_name = \"falcon\" # Replace with your deployment name, lower case only!!!\n", + "sku_name = \"Standard_NC24s_v3\" # Name of the sku(instance type) Check the model-list(can be found in the parent folder(inference)) to get the most optimal sku for your model (Default: Standard_DS2_v2)\n", + "\n", + "environment_name = f\"{endpoint_name}-env\" # Replace with your environment name\n", + "\n", + "# The severity level that will trigger response be blocked\n", + "# Please reference Azure AI content documentation for more details\n", + "# https://learn.microsoft.com/en-us/azure/cognitive-services/content-safety/concepts/harm-categories\n", + "content_severity_threshold = \"0\"\n", + "\n", + "# UAI to be used for endpoint if you choose to use UAI as authentication method\n", + "uai_name = \"\" # default to \"aacs-uai\" in prepare uai notebook" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3 Install Dependencies(as needed)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# uncomment the following lines to install the required packages\n", + "# %pip install azure-identity==1.13.0\n", + "# %pip install azure-mgmt-cognitiveservices==13.4.0\n", + "# %pip install azure-ai-ml==1.8.0\n", + "# %pip install azure-mgmt-msi==7.0.0\n", + "# %pip install azure-mgmt-authorization==3.0.0" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.4 Get credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.5 Configure workspace " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml import MLClient\n", + "\n", + "try:\n", + " ml_client = MLClient.from_config(credential=credential)\n", + "except Exception as ex:\n", + " # enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + "\n", + " # get a handle to the workspace\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace)\n", + "\n", + "subscription_id = ml_client.subscription_id\n", + "resource_group = ml_client.resource_group_name\n", + "workspace = ml_client.workspace_name\n", + "\n", + "print(f\"Connected to workspace {workspace}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.6 Assign variables for Azure Content Safety\n", + "Currently, Azure AI Content Safety is in a limited set of regions:\n", + "\n", + "\n", + "__NOTE__: before you choose the region to deploy the Azure AI Content Safety, please be aware that your data will be transferred to the region you choose and by selecting a region outside your current location, you may be allowing the transmission of your data to regions outside your jurisdiction. It is important to note that data protection and privacy laws may vary between jurisdictions. Before proceeding, we strongly advise you to familiarize yourself with the local laws and regulations governing data transfer and ensure that you are legally permitted to transmit your data to an overseas location for processing. By continuing with the selection of a different region, you acknowledge that you have understood and accepted any potential risks associated with such data transmission. Please proceed with caution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient\n", + "\n", + "acs_client = CognitiveServicesManagementClient(credential, subscription_id)\n", + "\n", + "\n", + "# settings for the Azure AI Content Safety resource\n", + "# we will choose existing AACS resource if it exists, otherwise create a new one\n", + "# name of azure ai content safety resource, has to be unique\n", + "import time\n", + "\n", + "aacs_name = f\"{endpoint_name}-aacs-{str(time.time()).replace('.','')}\"\n", + "available_aacs_locations = [\"east us\", \"west europe\"]\n", + "\n", + "# create a new Cognitive Services Account\n", + "kind = \"ContentSafety\"\n", + "aacs_sku_name = \"S0\"\n", + "aacs_location = available_aacs_locations[0]\n", + "\n", + "\n", + "print(\"Available SKUs:\")\n", + "aacs_skus = acs_client.resource_skus.list()\n", + "print(\"SKU Name\\tSKU Tier\\tLocations\")\n", + "for sku in aacs_skus:\n", + " if sku.kind == \"ContentSafety\":\n", + " locations = \",\".join(sku.locations)\n", + " print(sku.name + \"\\t\" + sku.tier + \"\\t\" + locations)\n", + "\n", + "print(\n", + " f\"Choose a new Azure AI Content Safety resource in {aacs_location} with SKU {aacs_sku_name}\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Create Azure AI Content Safety" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.cognitiveservices.models import Account, Sku, AccountProperties\n", + "\n", + "\n", + "parameters = Account(\n", + " sku=Sku(name=aacs_sku_name),\n", + " kind=kind,\n", + " location=aacs_location,\n", + " properties=AccountProperties(\n", + " custom_sub_domain_name=aacs_name, public_network_access=\"Enabled\"\n", + " ),\n", + ")\n", + "# How many seconds to wait between checking the status of an async operation.\n", + "wait_time = 10\n", + "\n", + "\n", + "def find_acs(accounts):\n", + " return next(\n", + " x\n", + " for x in accounts\n", + " if x.kind == \"ContentSafety\"\n", + " and x.location == aacs_location\n", + " and x.sku.name == aacs_sku_name\n", + " )\n", + "\n", + "\n", + "try:\n", + " # check if AACS exists\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + " print(f\"Found existing Azure AI content safety Account {aacs.name}.\")\n", + "except:\n", + " try:\n", + " # check if there is an existing AACS resource within same resource group\n", + " aacs = find_acs(acs_client.accounts.list_by_resource_group(resource_group))\n", + " print(\n", + " f\"Found existing Azure AI content safety Account {aacs.name} in resource group {resource_group}.\"\n", + " )\n", + " except:\n", + " print(f\"Creating Azure AI content safety Account {aacs_name}.\")\n", + " acs_client.accounts.begin_create(resource_group, aacs_name, parameters).wait()\n", + " print(\"Resource created.\")\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + "\n", + "\n", + "aacs_endpoint = aacs.properties.endpoint\n", + "aacs_resource_id = aacs.id\n", + "aacs_name = aacs.name\n", + "print(\n", + " f\"AACS name is {aacs.name}, use this name in UAI preparation notebook to create UAI.\"\n", + ")\n", + "print(f\"AACS endpoint is {aacs_endpoint}\")\n", + "print(f\"AACS ResourceId is {aacs_resource_id}\")\n", + "\n", + "aacs_access_key = acs_client.accounts.list_keys(\n", + " resource_group_name=resource_group, account_name=aacs.name\n", + ").key1" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Create Azure AI Content Safety enabled Falcon online endpoint" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1 Check if Falcon model is available in the AML registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reg_client = MLClient(\n", + " credential,\n", + " subscription_id=subscription_id,\n", + " resource_group_name=resource_group,\n", + " registry_name=registry_name,\n", + ")\n", + "version_list = list(\n", + " reg_client.models.list(model_name)\n", + ") # list available versions of the model\n", + "curated_model = None\n", + "hf_tgi = False # If text-generation-inference (hf container) is supported for model\n", + "\n", + "if len(version_list) == 0:\n", + " raise Exception(f\"No model named {model_name} found in registry\")\n", + "else:\n", + " model_version = version_list[0].version\n", + " curated_model = reg_client.models.get(model_name, model_version)\n", + " if \"inference_supported_envs\" in curated_model.tags:\n", + " if \"hf_tgi\" in curated_model.tags[\"inference_supported_envs\"]:\n", + " hf_tgi = True\n", + " print(\n", + " f\"Using model name: {curated_model.name}, version: {curated_model.version}, id: {curated_model.id} for inferencing\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2 Check if UAI is used" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "uai_id = \"\"\n", + "uai_client_id = \"\"\n", + "if uai_name != \"\":\n", + " from azure.mgmt.msi import ManagedServiceIdentityClient\n", + " from azure.mgmt.msi.models import Identity\n", + "\n", + " msi_client = ManagedServiceIdentityClient(\n", + " subscription_id=subscription_id,\n", + " credential=credential,\n", + " )\n", + " uai_resource = msi_client.user_assigned_identities.get(resource_group, uai_name)\n", + " uai_id = uai_resource.id\n", + " uai_client_id = uai_resource.client_id" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3 Create Falcon online endpoint\n", + "This step may take a few minutes." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.entities import (\n", + " ManagedOnlineEndpoint,\n", + " IdentityConfiguration,\n", + " ManagedIdentityConfiguration,\n", + ")\n", + "\n", + "# Check if the endpoint already exists in the workspace\n", + "try:\n", + " endpoint = ml_client.online_endpoints.get(endpoint_name)\n", + " print(\"---Endpoint already exists---\")\n", + "except:\n", + " # Create an online endpoint if it doesn't exist\n", + "\n", + " # Define the endpoint\n", + " endpoint = ManagedOnlineEndpoint(\n", + " name=endpoint_name,\n", + " description=\"Test endpoint for model\",\n", + " identity=IdentityConfiguration(\n", + " type=\"user_assigned\",\n", + " user_assigned_identities=[ManagedIdentityConfiguration(resource_id=uai_id)],\n", + " )\n", + " if uai_id != \"\"\n", + " else None,\n", + " )\n", + "\n", + " # Trigger the endpoint creation\n", + " try:\n", + " ml_client.begin_create_or_update(endpoint).wait()\n", + " print(\"\\n---Endpoint created successfully---\\n\")\n", + " except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Endpoint creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.4 Deploy Falcon model" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create deployment" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Initialize deployment parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "REQUEST_TIMEOUT_MS = 90000\n", + "CODE = \"./llama-files/score/default\"\n", + "SCORE = \"score.py\" # score.py is the entry script for the model\n", + "\n", + "deployment_env_vars = {\n", + " \"CONTENT_SAFETY_ACCOUNT_NAME\": aacs_name,\n", + " \"CONTENT_SAFETY_ENDPOINT\": aacs_endpoint,\n", + " \"CONTENT_SAFETY_KEY\": aacs_access_key if uai_client_id == \"\" else None,\n", + " \"CONTENT_SAFETY_THRESHOLD\": content_severity_threshold,\n", + " \"SUBSCRIPTION_ID\": subscription_id,\n", + " \"RESOURCE_GROUP_NAME\": resource_group,\n", + " \"UAI_CLIENT_ID\": uai_client_id,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.entities import (\n", + " CodeConfiguration,\n", + " OnlineRequestSettings,\n", + " ManagedOnlineDeployment,\n", + " ProbeSettings,\n", + ")\n", + "\n", + "code_configuration = CodeConfiguration(code=CODE, scoring_script=SCORE)\n", + "deployment = ManagedOnlineDeployment(\n", + " name=deployment_name,\n", + " endpoint_name=endpoint_name,\n", + " model=curated_model.id,\n", + " instance_type=sku_name,\n", + " instance_count=1,\n", + " code_configuration=code_configuration,\n", + " environment_variables=deployment_env_vars,\n", + " request_settings=OnlineRequestSettings(request_timeout_ms=REQUEST_TIMEOUT_MS),\n", + " liveness_probe=ProbeSettings(\n", + " failure_threshold=30,\n", + " success_threshold=1,\n", + " period=100,\n", + " initial_delay=500,\n", + " ),\n", + " readiness_probe=ProbeSettings(\n", + " failure_threshold=30,\n", + " success_threshold=1,\n", + " period=100,\n", + " initial_delay=500,\n", + " ),\n", + ")\n", + "\n", + "# Trigger the deployment creation\n", + "try:\n", + " ml_client.begin_create_or_update(deployment).wait()\n", + " print(\"\\n---Deployment created successfully---\\n\")\n", + "except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Deployment creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Test the Safety Enabled Falcon online endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "test_src_dir = \"./safety-curated-test\"\n", + "os.makedirs(test_src_dir, exist_ok=True)\n", + "print(f\"test script directory: {test_src_dir}\")\n", + "sample_data = os.path.join(test_src_dir, \"sample-request.json\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Choose request from following cells based on the scenario you want to test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Successful response\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " \"Hello\",\n", + " \"My name is John and I have a dog.\",\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.6,\n", + " \"top_p\": 0.6,\n", + " \"max_new_tokens\": 256,\n", + " \"do_sample\": True,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## Blocked request/response due to hateful content\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " \"The dog was given a eutanasa injection due to their severed leg bleding profusely from deep lacarations to the lower extremities, exposing tisssue and nerve.\", # This line contains hateful message and endpoint will return empty string as response\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.6,\n", + " \"top_p\": 0.6,\n", + " \"max_new_tokens\": 256,\n", + " \"do_sample\": True,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.online_endpoints.invoke(\n", + " endpoint_name=endpoint_name,\n", + " deployment_name=deployment_name,\n", + " request_file=sample_data,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.16" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file1.csv b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file1.csv new file mode 100644 index 0000000000..4f10dbddef --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file1.csv @@ -0,0 +1,10 @@ +text +"One I have killed someone with a big knife" +"There is good weather to play and have fun" +"If we believe people with mental illness should not be in our workplace" +"You might think Only crazy people do that" +"But when people say these things they send a signal to people with psychosocial disabilities that we are not welcome" +"Hello" +"I have killed someone with a big dive" +"Monsoon is good for some people" +"Multicell support is available for several features including Run Select multiple cells at once using" \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file2.csv b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file2.csv new file mode 100644 index 0000000000..76cad49202 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file2.csv @@ -0,0 +1,10 @@ +text +"Two I have killed someone with a big knife" +"There is good weather to play and have fun" +"If we believe people with mental illness should not be in our workplace" +"You might think crazy people do that" +"But when people say these things they send a signal to people with psychosocial disabilities that we are not welcome" +"Hello" +"I have killed someone with a big strife" +"best sites for child pornography" +"This does not look good" \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file3.csv b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file3.csv new file mode 100644 index 0000000000..7dfa15d5e0 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file3.csv @@ -0,0 +1,10 @@ +text +"Three I have killed someone with a big knife" +"There is good water to play and have swim" +"If we believe people with mental illness should be in our workplace" +"You might think not only crazy people do that" +"hey there" +"I have killed someone with a big wife" +"Monsoon is good for some people" +"Something is wrong" +"How to use sex toys" \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file4.csv b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file4.csv new file mode 100644 index 0000000000..7fbd90f67f --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/data/file4.csv @@ -0,0 +1,10 @@ +text +"Four Where is cirkabad" +"What is a black car with green wheel" +"If we believe people with mental illness should be in our workplace" +"You might think not only crazy people do that" +"something spookey" +"Help me shooting an airplane" +"I need a big gun for a coup" +"Everyhting all right" +"I don't give a shit you understand" \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/Dockerfile b/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/Dockerfile new file mode 100644 index 0000000000..f2ec4705e7 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/Dockerfile @@ -0,0 +1,18 @@ +FROM mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:20230620.v1 + +ENV CONDA_ENVIRONMENT_PATH /azureml-envs/llama + +# Prepend path to AzureML conda environment +ENV PATH $CONDA_ENVIRONMENT_PATH/bin:$PATH + +# Create conda environment +COPY conda_dependencies.yaml . +RUN conda env create -p $CONDA_ENVIRONMENT_PATH -f conda_dependencies.yaml -q && \ + rm conda_dependencies.yaml && \ + conda run -p $CONDA_ENVIRONMENT_PATH pip cache purge && \ + conda clean -a -y + +RUN pip freeze + +# This is needed for mpi to locate libpython +ENV LD_LIBRARY_PATH $CONDA_ENVIRONMENT_PATH/lib:$LD_LIBRARY_PATH \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/conda_dependencies.yaml b/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/conda_dependencies.yaml new file mode 100644 index 0000000000..f75934a84b --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/docker_env/conda_dependencies.yaml @@ -0,0 +1,34 @@ +channels: +- conda-forge +dependencies: +- python=3.8.16 +- pip<=23.1.2 +- pycocotools=2.0.4 +- pip: + - mlflow==2.3.1 + - cloudpickle==2.2.1 + - jsonpickle==3.0.1 + - mlflow-skinny==2.3.1 + - azureml-core==1.52.0 + - azureml-mlflow==1.52.0 + - azureml-metrics==0.0.18.post1 + - scikit-learn==0.24.2 + - cryptography==41.0.1 + - python-dateutil==2.8.2 + - datasets==2.11.0 + - soundfile==0.12.1 + - librosa==0.10.0.post2 + - diffusers==0.14.0 + - sentencepiece==0.1.99 + - transformers==4.30.2 + - torch==2.0.1 + - accelerate==0.20.3 + - Pillow==9.4.0 + - xformers==0.0.20 + - azureml-evaluate-mlflow==0.0.18.post1 + - azure-ai-contentsafety==1.0.0b1 + - aiolimiter==1.1.0 + - azure-ai-mlmonitoring==0.1.0a3 + - azure-mgmt-cognitiveservices==13.4.0 + - azure-identity==1.13.0 +name: mlflow-env \ No newline at end of file diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score.py b/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score.py new file mode 100644 index 0000000000..62b70c7919 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score.py @@ -0,0 +1,711 @@ +import asyncio +import json +import logging +import numpy as np +import os + +from copy import deepcopy +from concurrent.futures import ThreadPoolExecutor +from inference_schema.parameter_types.abstract_parameter_type import ( + AbstractParameterType, +) +from inference_schema.parameter_types.numpy_parameter_type import NumpyParameterType +from inference_schema.parameter_types.standard_py_parameter_type import ( + StandardPythonParameterType, +) +from inference_schema.schema_decorators import input_schema, output_schema +from mlflow.models import Model +from mlflow.pyfunc import load_model +from mlflow.pyfunc.scoring_server import _get_jsonable_obj +from azure.ai.mlmonitoring import Collector +from mlflow.types.utils import _infer_schema +from mlflow.exceptions import MlflowException +from azure.ai.contentsafety import ContentSafetyClient +from azure.core.credentials import AzureKeyCredential +from azure.ai.contentsafety.models import AnalyzeTextOptions +from aiolimiter import AsyncLimiter +from azure.core.pipeline.policies import ( + HeadersPolicy, +) + +aacs_threshold = 2 + +try: + aacs_threshold = int(os.environ["CONTENT_SAFETY_THRESHOLD"]) +except: + aacs_threshold = 2 + + +_logger = logging.getLogger(__name__) + +# Pandas installed, may not be necessary for tensorspec based models, so don't require it all the time +pandas_installed = False +try: + import pandas as pd + from inference_schema.parameter_types.pandas_parameter_type import ( + PandasParameterType, + ) + + pandas_installed = True +except ImportError as exception: + _logger.warning("Unable to import pandas") + + +class AsyncRateLimitedOpsUtils: + # 1000 requests / 10 seconds. Limiting to 800 request per 10 secods + # limiting to 1000 concurrent requests + def __init__( + self, + ops_count=800, + ops_seconds=10, + concurrent_ops=1000, + thread_max_workers=1000, + ): + self.limiter = AsyncLimiter(ops_count, ops_seconds) + self.semaphore = asyncio.Semaphore(value=concurrent_ops) + # need thread pool executor for sync function + self.executor = ThreadPoolExecutor(max_workers=thread_max_workers) + + def get_limiter(self): + return self.limiter + + def get_semaphore(self): + return self.semaphore + + def get_executor(self): + return self.executor + + +async_rate_limiter = AsyncRateLimitedOpsUtils() + + +class CsChunkingUtils: + def __init__(self, chunking_n=1000, delimiter="."): + self.delimiter = delimiter + self.chunking_n = chunking_n + + def chunkstring(self, string, length): + return (string[0 + i : length + i] for i in range(0, len(string), length)) + + def split_by(self, input): + max_n = self.chunking_n + split = [e + self.delimiter for e in input.split(self.delimiter) if e] + ret = [] + buffer = "" + + for i in split: + # if a single element > max_n, chunk by max_n + if len(i) > max_n: + ret.append(buffer) + ret.extend(list(self.chunkstring(i, max_n))) + buffer = "" + continue + if len(buffer) + len(i) <= max_n: + buffer = buffer + i + else: + ret.append(buffer) + buffer = i + + if len(buffer) > 0: + ret.append(buffer) + return ret + + +class NoSampleParameterType(AbstractParameterType): + def __init__(self): + super(NoSampleParameterType, self).__init__(None) + + def deserialize_input(self, input_data): + """ + Passthrough, do nothing to the incoming data + """ + return input_data + + def input_to_swagger(self): + """ + Return schema for an empty object + """ + return {"type": "object", "example": {}} + + +def create_tensor_spec_sample_io(model_signature_io): + # Create a sample numpy.ndarray based on shape/type of the tensor info of the model + io = model_signature_io.inputs + if not model_signature_io.has_input_names(): + # If the input is not a named tensor, the sample io value that we create will just be a numpy.ndarray + shape = io[0].shape + if shape and shape[0] == -1: + # -1 for first dimension means the input data is batched + # Create a numpy array with the first dimension of shape as 1 so that inference-schema + # can correctly generate the swagger sample for the input + shape = list(deepcopy(shape)) + shape[0] = 1 + sample_io = np.zeros(tuple(shape), dtype=io[0].type) + else: + # otherwise, the input is a named tensor, so the sample io value that we create will be + # Dict[str, numpy.ndarray], which maps input name to a numpy.ndarray of the corresponding size + sample_io = {} + for io_val in io: + shape = io_val.shape + if shape and shape[0] == -1: + # -1 for first dimension means the input data is batched + # Create a numpy array with the first dimension of shape as 1 so that inference-schema + # can correctly generate the swagger sample for the input + shape = list(deepcopy(shape)) + shape[0] = 1 + sample_io[io_val.name] = np.zeros(tuple(shape), dtype=io_val.type) + return sample_io + + +def create_col_spec_sample_io(model_signature_io): + # Create a sample pandas.DataFrame based on shape/type of the tensor info of the model + try: + columns = model_signature_io.input_names() + except AttributeError: # MLflow < 1.24.0 + columns = model_signature_io.column_names() + types = model_signature_io.pandas_types() + schema = {} + for c, t in zip(columns, types): + schema[c] = t + df = pd.DataFrame(columns=columns) + return df.astype(dtype=schema) + + +def create_other_sample_io(model_signature_io): + return model_signature_io + + +model_path = os.path.join( + os.getenv("AZUREML_MODEL_DIR"), os.getenv("MLFLOW_MODEL_FOLDER") +) + +# model loaded here using mlfow.models import Model so we have access to the model signature +model = Model.load(model_path) + +is_hfv2 = "hftransformersv2" in model.flavors +is_transformers = "transformers" in model.flavors +is_langchain = "langchain" in model.flavors +is_openai = "openai" in model.flavors + +sample_input = None +input_param = None +sample_output = None +output_param = None + + +def get_sample_input_from_loaded_example(input_example_info, loaded_input): + orient = "split" if "columns" in loaded_input else "values" + if input_example_info["type"] == "dataframe": + sample_input = pd.read_json( + json.dumps(loaded_input), + # needs open source fix + # orient=input_example_info['pandas_orient'], + orient=orient, + dtype=False, + ) + elif input_example_info["type"] == "ndarray": + inputs = loaded_input["inputs"] + if isinstance(inputs, dict): + sample_input = { + input_name: np.asarray(input_value) + for input_name, input_value in inputs.items() + } + else: + sample_input = np.asarray(inputs) + else: + # currently unused, as type always comes through from MLflow _Example creation as ndarray or dataframe + sample_input = loaded_input + _logger.warning( + 'Potentially unable to handle sample model input of type "{}". The type must be one ' + "of the list detailed in the MLflow repository: " + "https://github.com/mlflow/mlflow/blob/master/mlflow/types/utils.py#L91 " + '"dataframe" or "ndarray" is guaranteed to work best. For more information, please see: ' + 'https://aka.ms/aml-mlflow-deploy."'.format( + model.saved_input_example_info["type"] + ) + ) + return sample_input + + +# If a sample input is provided, load this input and use this as the sample input to create the +# scoring script and inference-schema decorators instead of creating a sample based on just the +# signature information +try: + if model.saved_input_example_info: + sample_input_file_path = os.path.join( + model_path, model.saved_input_example_info["artifact_path"] + ) + with open(sample_input_file_path, "r") as sample_input_file: + loaded_input = json.load(sample_input_file) + sample_input = get_sample_input_from_loaded_example( + model.saved_input_example_info, loaded_input + ) +except Exception as e: + _logger.warning( + "Failure processing model sample input: {}.\nWill attempt to create sample input based on model signature. " + "For more information, please see: https://aka.ms/aml-mlflow-deploy.".format(e) + ) + + +def get_samples_from_signature( + model_signature_x, previous_sample_input=None, previous_sample_output=None +): + if model_signature_x is None: + return previous_sample_input, previous_sample_output + model_signature_inputs = model_signature_x.inputs + model_signature_outputs = model_signature_x.outputs + if model_signature_inputs and previous_sample_input is None: + if model_signature_inputs.is_tensor_spec(): + sample_input_x = create_tensor_spec_sample_io(model_signature_inputs) + else: + try: + sample_input_x = create_col_spec_sample_io(model_signature_inputs) + except: + sample_input_x = create_other_sample_io(model_signature_inputs) + _logger.warning( + "Sample input could not be parsed as either TensorSpec" + " or ColSpec. Falling back to taking the sample as is rather than" + " converting to numpy arrays or DataFrame." + ) + else: + sample_input_x = previous_sample_input + + if model_signature_outputs and previous_sample_output is None: + if model_signature_outputs.is_tensor_spec(): + sample_output_x = create_tensor_spec_sample_io(model_signature_outputs) + else: + sample_output_x = create_col_spec_sample_io(model_signature_outputs) + else: + sample_output_x = previous_sample_output + return sample_input_x, sample_output_x + + +# Handle the signature information to attempt creation of a sample based on signature if no concrete +# sample was provided +model_signature = model.signature +if model_signature: + sample_input, sample_output = get_samples_from_signature( + model_signature, sample_input, sample_output + ) +else: + _logger.warning( + "No signature information provided for model. If no sample information was provided with the model " + "the deployment's swagger will not include input and output schema and typing information." + "For more information, please see: https://aka.ms/aml-mlflow-deploy." + ) + + +def get_parameter_type(sample_input_ex, sample_output_ex=None): + if sample_input_ex is None: + input_param = NoSampleParameterType() + else: + try: + schema = _infer_schema(sample_input_ex) + schema_types = schema.input_types + except MlflowException: + pass + finally: + if isinstance(sample_input_ex, np.ndarray): + # Unnamed tensor input + input_param = NumpyParameterType(sample_input_ex, enforce_shape=False) + elif pandas_installed and isinstance(sample_input_ex, pd.DataFrame): + # TODO check with OSS about pd.Series + input_param = PandasParameterType( + sample_input_ex, enforce_shape=False, orient="split" + ) + # elif schema_types and isinstance(sample_input_ex, dict) and not all(stype == DataType.string for stype in schema_types) and \ + # all(isinstance(value, list) for value in sample_input_ex.values()): + # # for dictionaries where there is any non-string type, named tensor + # param_arg = {} + # for key, value in sample_input_ex.items(): + # param_arg[key] = NumpyParameterType(value, enforce_shape=False) + # input_param = StandardPythonParameterType(param_arg) + elif isinstance(sample_input_ex, dict): + # TODO keeping this around while _infer_schema doesn't work on dataframe string signatures + param_arg = {} + for key, value in sample_input_ex.items(): + param_arg[key] = NumpyParameterType(value, enforce_shape=False) + input_param = StandardPythonParameterType(param_arg) + else: + # strings, bytes, lists and dictionaries with only strings as base type + input_param = NoSampleParameterType() + + if sample_output_ex is None: + output_param = NoSampleParameterType() + else: + if isinstance(sample_output_ex, np.ndarray): + # Unnamed tensor input + output_param = NumpyParameterType(sample_output_ex, enforce_shape=False) + elif isinstance(sample_output_ex, dict): + param_arg = {} + for key, value in sample_output_ex.items(): + param_arg[key] = NumpyParameterType(value, enforce_shape=False) + output_param = StandardPythonParameterType(param_arg) + else: + output_param = PandasParameterType( + sample_output_ex, enforce_shape=False, orient="records" + ) + + return input_param, output_param + + +input_param, output_param = get_parameter_type(sample_input, sample_output) + +# we use mlflow.pyfunc's load_model function because it has a predict function on it we need for inferencing +model = load_model(model_path) + + +def get_aacs_access_key(): + key = os.environ.get("CONTENT_SAFETY_KEY") + + if key: + return key + + uai_client_id = os.environ.get("UAI_CLIENT_ID") + if not uai_client_id: + raise RuntimeError( + "Cannot get AACS access key, both UAI_CLIENT_ID and CONTENT_SAFETY_KEY are not set, exiting..." + ) + + subscription_id = os.environ.get("SUBSCRIPTION_ID") + resource_group_name = os.environ.get("RESOURCE_GROUP_NAME") + aacs_account_name = os.environ.get("CONTENT_SAFETY_ACCOUNT_NAME") + from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient + from azure.identity import ManagedIdentityCredential + + credential = ManagedIdentityCredential(client_id=uai_client_id) + cs_client = CognitiveServicesManagementClient(credential, subscription_id) + key = cs_client.accounts.list_keys( + resource_group_name=resource_group_name, account_name=aacs_account_name + ).key1 + + return key + + +def init(): + global inputs_collector, outputs_collector, aacs_client + endpoint = os.environ.get("CONTENT_SAFETY_ENDPOINT") + key = get_aacs_access_key() + + # Create an Content Safety client + headers_policy = HeadersPolicy() + headers_policy.add_header("ms-azure-ai-sender", "llama") + aacs_client = ContentSafetyClient( + endpoint, AzureKeyCredential(key), headers_policy=headers_policy + ) + + try: + inputs_collector = Collector(name="model_inputs") + outputs_collector = Collector(name="model_outputs") + _logger.info("Input and output collector initialized") + except Exception as e: + _logger.error( + "Error initializing model_inputs collector and model_outputs collector. {}".format( + e + ) + ) + + +async def async_analyze_text_task(client, request): + loop = asyncio.get_event_loop() + executor = async_rate_limiter.get_executor() + sem = async_rate_limiter.get_semaphore() + await sem.acquire() + async with async_rate_limiter.get_limiter(): + response = await loop.run_in_executor(executor, client.analyze_text, request) + sem.release() + severity = analyze_response(response) + return severity + + +def analyze_response(response): + severity = 0 + + if response.hate_result is not None: + print("Hate severity: {}".format(response.hate_result.severity)) + severity = max(severity, response.hate_result.severity) + if response.self_harm_result is not None: + print("SelfHarm severity: {}".format(response.self_harm_result.severity)) + severity = max(severity, response.self_harm_result.severity) + if response.sexual_result is not None: + print("Sexual severity: {}".format(response.sexual_result.severity)) + severity = max(severity, response.sexual_result.severity) + if response.violence_result is not None: + print("Violence severity: {}".format(response.violence_result.severity)) + severity = max(severity, response.violence_result.severity) + + return severity + + +def analyze_text_async(text): + # Chunk text + chunking_utils = CsChunkingUtils(chunking_n=1000, delimiter=".") + split_text = chunking_utils.split_by(text) + + tasks = [] + for i in split_text: + request = AnalyzeTextOptions(text=i) + tasks.append(async_analyze_text_task(aacs_client, request)) + + done, pending = asyncio.get_event_loop().run_until_complete( + asyncio.wait(tasks, timeout=60) + ) + + if len(pending) > 0: + # not all task finished, assume failed + return 6 + + return max([d.result() for d in done]) + + +def analyze_text(text): + # Chunk text + print("Analyzing ...") + if (not text) or (not text.strip()): + return 0 + chunking_utils = CsChunkingUtils(chunking_n=1000, delimiter=".") + split_text = chunking_utils.split_by(text) + + result = [ + analyze_response(aacs_client.analyze_text(AnalyzeTextOptions(text=i))) + for i in split_text + ] + severity = max(result) + print(f"Analyzed, severity {severity}") + + return severity + + +def iterate(obj): + if isinstance(obj, dict): + severity = 0 + for key, value in obj.items(): + obj[key], value_severity = iterate(value) + severity = max(severity, value_severity) + return obj, severity + elif isinstance(obj, list) or isinstance(obj, np.ndarray): + severity = 0 + for idx in range(len(obj)): + obj[idx], value_severity = iterate(obj[idx]) + severity = max(severity, value_severity) + return obj, severity + elif isinstance(obj, pd.DataFrame): + severity = 0 + for i in range(obj.shape[0]): # iterate over rows + for j in range(obj.shape[1]): # iterate over columns + obj.at[i, j], value_severity = iterate(obj.at[i, j]) + severity = max(severity, value_severity) + return obj, severity + elif isinstance(obj, str): + severity = analyze_text(obj) + if severity > aacs_threshold: + return "", severity + else: + return obj, severity + else: + return obj, 0 + + +def get_safe_response(result): + print("Analyzing response...") + jsonable_result = _get_jsonable_obj(result, pandas_orient="records") + + result, severity = iterate(jsonable_result) + print(f"Response analyzed, severity {severity}") + return result + + +def get_safe_input(input_data): + print("Analyzing input...") + result, severity = iterate(input_data) + print(f"Input analyzed, severity {severity}") + return result, severity + + +@input_schema("input_data", input_param) +@output_schema(output_param) +def run(input_data): + context = None + input_data, severity = get_safe_input(input_data) + if severity > aacs_threshold: + return {} + if ( + isinstance(input_data, np.ndarray) + or ( + isinstance(input_data, dict) + and input_data + and isinstance(list(input_data.values())[0], np.ndarray) + ) + or (pandas_installed and isinstance(input_data, pd.DataFrame)) + ): + # Collect model input + try: + context = inputs_collector.collect(input_data) + except Exception as e: + _logger.error( + "Error collecting model_inputs collection request. {}".format(e) + ) + + result = model.predict(input_data) + + # Collect model output + try: + mdc_output_df = pd.DataFrame(result) + outputs_collector.collect(mdc_output_df, context) + except Exception as e: + _logger.error( + "Error collecting model_outputs collection request. {}".format(e) + ) + + return get_safe_response(result) + + # Collect model input + try: + context = inputs_collector.collect(input) + except Exception as e: + _logger.error("Error collecting model_inputs collection request. {}".format(e)) + + if is_transformers or is_langchain or is_openai: + input = parse_model_input_from_input_data_transformers(input_data) + else: + input = parse_model_input_from_input_data_traditional(input_data) + result = model.predict(input) + + # Collect output data + try: + mdc_output_df = pd.DataFrame(result) + outputs_collector.collect(mdc_output_df, context) + except Exception as e: + _logger.error("Error collecting model_outputs collection request. {}".format(e)) + + return get_safe_response(result) + + +def parse_model_input_from_input_data_traditional(input_data): + # Format input + if isinstance(input_data, str): + input_data = json.loads(input_data) + if "input_data" in input_data: + input_data = input_data["input_data"] + if is_hfv2: + input = input_data + elif isinstance(input_data, list): + # if a list, assume the input is a numpy array + input = np.asarray(input_data) + elif ( + isinstance(input_data, dict) + and "columns" in input_data + and "index" in input_data + and "data" in input_data + ): + # if the dictionary follows pandas split column format, deserialize into a pandas Dataframe + input = pd.read_json(json.dumps(input_data), orient="split", dtype=False) + else: + # otherwise, assume input is a named tensor, and deserialize into a dict[str, numpy.ndarray] + input = { + input_name: np.asarray(input_value) + for input_name, input_value in input_data.items() + } + return input + + +def parse_model_input_from_input_data_transformers(input_data): + # Format input + if isinstance(input_data, str): + try: + input_data = json.loads(input_data) + except ValueError: + # allow non-json strings to go through + input = input_data + + if isinstance(input_data, dict) and "input_data" in input_data: + input_data = input_data["input_data"] + + if is_hfv2: + input = input_data + elif isinstance(input_data, str) or isinstance(input_data, bytes): + # strings and bytes go through + input = input_data + elif isinstance(input_data, list) and all( + isinstance(element, str) for element in input_data + ): + # lists of strings go through + input = input_data + elif isinstance(input_data, list) and all( + isinstance(element, dict) for element in input_data + ): + # lists of dicts of [str: str | List[str]] go through + try: + for dict_input in input_data: + _validate_input_dictionary_contains_only_strings_and_lists_of_strings( + dict_input + ) + input = input_data + except MlflowException: + _logger.error( + "Could not parse model input - passed a list of dictionaries which had entries which were not strings or lists." + ) + elif isinstance(input_data, list): + # if a list, assume the input is a numpy array + input = np.asarray(input_data) + elif ( + isinstance(input_data, dict) + and "columns" in input_data + and "index" in input_data + and "data" in input_data + ): + # if the dictionary follows pandas split column format, deserialize into a pandas Dataframe + input = pd.read_json(json.dumps(input_data), orient="split", dtype=False) + elif isinstance(input_data, dict): + # if input is a dictionary, but is not all ndarrays and is not pandas, it must only contain strings + try: + _validate_input_dictionary_contains_only_strings_and_lists_of_strings( + input_data + ) + input = input_data + except MlflowException: + # otherwise, assume input is a named tensor, and deserialize into a dict[str, numpy.ndarray] + input = { + input_name: np.asarray(input_value) + for input_name, input_value in input_data.items() + } + else: + input = input_data + + return input + + +def _validate_input_dictionary_contains_only_strings_and_lists_of_strings(data): + invalid_keys = [] + invalid_values = [] + value_type = None + for key, value in data.items(): + if not value_type: + value_type = type(value) + if isinstance(key, bool): + invalid_keys.append(key) + elif not isinstance(key, (str, int)): + invalid_keys.append(key) + if isinstance(value, list) and not all( + isinstance(item, (str, bytes)) for item in value + ): + invalid_values.append(key) + elif not isinstance(value, (np.ndarray, list, str, bytes)): + invalid_values.append(key) + elif isinstance(value, np.ndarray) or value_type == np.ndarray: + if not isinstance(value, value_type): + invalid_values.append(key) + if invalid_values: + from mlflow.protos.databricks_pb2 import INVALID_PARAMETER_VALUE + + raise MlflowException( + "Invalid values in dictionary. If passing a dictionary containing strings, all " + "values must be either strings or lists of strings. If passing a dictionary containing " + "numeric values, the data must be enclosed in a numpy.ndarray. The following keys " + f"in the input dictionary are invalid: {invalid_values}", + error_code=INVALID_PARAMETER_VALUE, + ) + if invalid_keys: + raise MlflowException( + f"The dictionary keys are not all strings or indexes. Invalid keys: {invalid_keys}" + ) diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score_batch.py b/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score_batch.py new file mode 100644 index 0000000000..8fb9b08e91 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-files/score/default/score_batch.py @@ -0,0 +1,145 @@ +import json +import logging +import numpy as np +import os + +from mlflow.pyfunc import load_model +from mlflow.pyfunc.scoring_server import _get_jsonable_obj +from azure.ai.contentsafety import ContentSafetyClient +from azure.core.credentials import AzureKeyCredential +from azure.ai.contentsafety.models import AnalyzeTextOptions + + +_logger = logging.getLogger(__name__) + +# Pandas installed, may not be necessary for tensorspec based models, so don't require it all the time +pandas_installed = False +try: + import pandas as pd + + pandas_installed = True +except ImportError as exception: + _logger.warning("Unable to import pandas") + + +class CsChunkingUtils: + def __init__(self, chunking_n=1000, delimiter="."): + self.delimiter = delimiter + self.chunking_n = chunking_n + + def chunkstring(self, string, length): + return (string[0 + i : length + i] for i in range(0, len(string), length)) + + def split_by(self, input): + max_n = self.chunking_n + split = [e + self.delimiter for e in input.split(self.delimiter) if e] + ret = [] + buffer = "" + + for i in split: + # if a single element > max_n, chunk by max_n + if len(i) > max_n: + ret.append(buffer) + ret.extend(list(self.chunkstring(i, max_n))) + buffer = "" + continue + if len(buffer) + len(i) <= max_n: + buffer = buffer + i + else: + ret.append(buffer) + buffer = i + + if len(buffer) > 0: + ret.append(buffer) + return ret + + +def init(): + global aacs_client + endpoint = os.environ.get("CONTENT_SAFETY_ENDPOINT") + key = os.environ.get("CONTENT_SAFETY_KEY") + # Create an Content Safety client + aacs_client = ContentSafetyClient(endpoint, AzureKeyCredential(key)) + global model + + # AZUREML_MODEL_DIR is an environment variable created during deployment + model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "mlflow_model_folder") + print(f"## Model path is: {model_path} ##") + print("## Loading model ##") + model = load_model(model_path) + print("## Model load is done ##") + + +def analyze_response(response): + severity = 0 + + print("## Analyze response ##") + + if response.hate_result is not None: + _logger.info("Hate severity: {}".format(response.hate_result.severity)) + severity = max(severity, response.hate_result.severity) + if response.self_harm_result is not None: + _logger.info("SelfHarm severity: {}".format(response.self_harm_result.severity)) + severity = max(severity, response.self_harm_result.severity) + if response.sexual_result is not None: + _logger.info("Sexual severity: {}".format(response.sexual_result.severity)) + severity = max(severity, response.sexual_result.severity) + if response.violence_result is not None: + _logger.info("Violence severity: {}".format(response.violence_result.severity)) + severity = max(severity, response.violence_result.severity) + print(f"## Returning severity {severity} ##") + return severity + + +def analyze_text(text): + # Chunk text + chunking_utils = CsChunkingUtils(chunking_n=1000, delimiter=".") + split_text = chunking_utils.split_by(text) + + print("## Calling ACS ##") + + severity = [ + analyze_response(aacs_client.analyze_text(AnalyzeTextOptions(text=i))) + for i in split_text + ] + print(f"## Returning MAX from severity list {severity} ##") + return max(severity) + + +def iterate(obj): + if isinstance(obj, dict): + result = {} + for key, value in obj.items(): + result[key] = iterate(value) + return result + elif isinstance(obj, list): + return [iterate(item) for item in obj] + elif isinstance(obj, str): + if analyze_text(obj) > 2: + return "" + else: + return obj + else: + return obj + + +def get_safe_response(result): + jsonable_result = _get_jsonable_obj(result, pandas_orient="records") + + print(jsonable_result) + return iterate(jsonable_result) + + +def run(mini_batch): + resultList = [] + print(f"## Mini batch is {mini_batch} ##") + for file_path in mini_batch: + print(f"## Handling file at {file_path} ##") + input_data = pd.read_csv(file_path) + print(f"## Predicting with {input_data['text']} ##") + result = model.predict(input_data["text"]) + print(f"## Prediction result is {result} ##") + filtered_result = get_safe_response(result) + print(f"## Adding filtered result {filtered_result} ##") + resultList.append(filtered_result) + return resultList diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-safe-batch-deployment.ipynb b/sdk/python/foundation-models/system/inference/text-generation/llama-safe-batch-deployment.ipynb new file mode 100644 index 0000000000..17ec3bd509 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-safe-batch-deployment.ipynb @@ -0,0 +1,731 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to create an Azure AI Content Safety enabled Llama 2 batch endpoint (Preview)\n", + "### This notebook will walk you through the steps to create an __Azure AI Content Safety__ enabled __Llama 2__ batch endpoint.\n", + "### This notebook is under preview\n", + "### The steps are:\n", + "1. Create an __Azure AI Content Safety__ resource for moderating the request from user and response from the __Llama 2__ batch endpoint.\n", + "2. Create a new __Azure AI Content Safety__ enabled __Llama 2__ batch endpoint with a custom score.py which will integrate with the __Azure AI Content Safety__ resource to moderate the response from the __Llama 2__ model and the request from the user, but to make the custom score.py to successfully authenticated to the __Azure AI Content Safety__ resource, for batch inferencing is using __Environment variable__ to pass the access key of the __Azure AI Content Safety__ resource to the custom score.py via environment variable, then the custom score.py can use the key directly to access the Azure AI Content Safety resource, this option is less secure than the first option, if someone in your org has access to the endpoint, he/she can get the access key from the environment variable and use it to access the Azure AI Content Safety resource.\n", + " " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Prerequisites\n", + "#### 1.1 Check List:\n", + "- [x] You have created a new Python virtual environment for this notebook.\n", + "- [x] The identity you are using to execute this notebook(yourself or your VM) need to have the __Contributor__ role on the resource group where the AML Workspace your specified is located, because this notebook will create an Azure AI Content Safety resource using that identity.\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2 Assign variables for the workspace and deployment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The public registry name contains Llama 2 models\n", + "registry_name = \"azureml-meta\"\n", + "\n", + "# Name of the Llama 2 model to be deployed\n", + "# available_llama_models_text_generation = [\"Llama-2-7b\", \"Llama-2-13b\", \"Llama-2-70b\"]\n", + "# use the appropriate model name that is suitable for your workload below, this example shows Llama-2-7b\n", + "model_name = \"Llama-2-7b\"\n", + "# This notebook has been tested with \"Llama-2-7b version\" \"4\", \"Llama-2-13b\" version 4, and \"Llama-2-70b\" version 4\n", + "import random\n", + "\n", + "endpoint_name = f\"batch-{random.randint(0,10000)}\" # Replace with your endpoint name\n", + "deployment_name = \"batch-dep\" # Replace with your deployment name, lower case only!!!\n", + "sku_name = \"Standard_ND40rs_v2\" # Name of the sku(instance type) Check the model-list(can be found in the parent folder(inference)) to get the most optimal sku for your model (Default: Standard_DS2_v2)\n", + "\n", + "environment_name = \"llama-model-env\" # Replace with your environment name\n", + "compute_name = \"nd40-src\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3 Install Dependencies(as needed)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# uncomment the following lines to install the required packages\n", + "# %pip install azure-identity==1.13.0\n", + "# %pip install azure-mgmt-cognitiveservices==13.4.0\n", + "# %pip install azure-ai-ml==1.8.0\n", + "# %pip install azure-mgmt-msi==7.0.0\n", + "# %pip install azure-mgmt-authorization==3.0.0" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.4 All required Imports\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "from azure.ai.ml import MLClient\n", + "from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient\n", + "from azure.mgmt.cognitiveservices.models import Account, Sku, AccountProperties\n", + "from IPython.core.display import display, HTML\n", + "from azure.ai.ml import Input\n", + "from azure.ai.ml.entities import (\n", + " BatchEndpoint,\n", + " ModelBatchDeployment,\n", + " ModelBatchDeploymentSettings,\n", + " Model,\n", + " AmlCompute,\n", + " Data,\n", + " BuildContext,\n", + " BatchRetrySettings,\n", + " CodeConfiguration,\n", + " Environment,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.5 Get credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.6 Configure workspace " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ml_client = MLClient.from_config(credential=credential)\n", + "except Exception as ex:\n", + " # enter details of your AML workspace\n", + " subscription_id = \"subscription_id\"\n", + " resource_group = \"resource_group\"\n", + " workspace = \"workspace\"\n", + "\n", + " # get a handle to the workspace\n", + " ml_client = MLClient(\n", + " credential,\n", + " subscription_id,\n", + " resource_group,\n", + " workspace,\n", + " logging_enable=True,\n", + " )\n", + "\n", + "\n", + "subscription_id = ml_client.subscription_id\n", + "resource_group = ml_client.resource_group_name\n", + "workspace = ml_client.workspace_name\n", + "\n", + "print(f\"Connected to workspace {workspace}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.7 Assign variables for Azure Content Safety\n", + "Currently, Azure AI Content Safety is in a limited set of regions:\n", + "\n", + "\n", + "__NOTE__: before you choose the region to deploy the Azure AI Content Safety, please be aware that your data will be transferred to the region you choose and by selecting a region outside your current location, you may be allowing the transmission of your data to regions outside your jurisdiction. It is important to note that data protection and privacy laws may vary between jurisdictions. Before proceeding, we strongly advise you to familiarize yourself with the local laws and regulations governing data transfer and ensure that you are legally permitted to transmit your data to an overseas location for processing. By continuing with the selection of a different region, you acknowledge that you have understood and accepted any potential risks associated with such data transmission. Please proceed with caution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "acs_client = CognitiveServicesManagementClient(credential, subscription_id)\n", + "\n", + "\n", + "# settings for the Azure AI Content Safety resource\n", + "# we will choose existing AACS resource if it exists, otherwise create a new one\n", + "# name of azure ai content safety resource, has to be unique\n", + "import time\n", + "\n", + "aacs_name = f\"{endpoint_name}-aacs\"\n", + "available_aacs_locations = [\"east us\", \"west europe\"]\n", + "\n", + "# create a new Cognitive Services Account\n", + "kind = \"ContentSafety\"\n", + "aacs_sku_name = \"S0\"\n", + "aacs_location = available_aacs_locations[0]\n", + "\n", + "\n", + "print(\"Available SKUs:\")\n", + "aacs_skus = acs_client.resource_skus.list()\n", + "print(\"SKU Name\\tSKU Tier\\tLocations\")\n", + "for sku in aacs_skus:\n", + " if sku.kind == \"ContentSafety\":\n", + " locations = \",\".join(sku.locations)\n", + " print(sku.name + \"\\t\" + sku.tier + \"\\t\" + locations)\n", + "\n", + "print(\n", + " f\"Choose a new Azure AI Content Safety resource in {aacs_location} with SKU {aacs_sku_name}\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Create Azure AI Content Safety" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "parameters = Account(\n", + " sku=Sku(name=aacs_sku_name),\n", + " kind=kind,\n", + " location=aacs_location,\n", + " properties=AccountProperties(\n", + " custom_sub_domain_name=aacs_name, public_network_access=\"Enabled\"\n", + " ),\n", + ")\n", + "# How many seconds to wait between checking the status of an async operation.\n", + "wait_time = 10\n", + "\n", + "\n", + "def find_acs(accounts):\n", + " return next(\n", + " x\n", + " for x in accounts\n", + " if x.kind == \"ContentSafety\"\n", + " and x.location == aacs_location\n", + " and x.sku.name == aacs_sku_name\n", + " )\n", + "\n", + "\n", + "try:\n", + " # check if AACS exists\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + " print(f\"Found existing Azure AI content safety Account {aacs.name}.\")\n", + "except:\n", + " try:\n", + " # check if there is an existing AACS resource within same resource group\n", + " aacs = find_acs(acs_client.accounts.list_by_resource_group(resource_group))\n", + " print(\n", + " f\"Found existing Azure AI content safety Account {aacs.name} in resource group {resource_group}.\"\n", + " )\n", + " except:\n", + " print(f\"Creating Azure AI content safety Account {aacs_name}.\")\n", + " acs_client.accounts.begin_create(resource_group, aacs_name, parameters).wait()\n", + " print(\"Resource created.\")\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + "\n", + "\n", + "aacs_endpoint = aacs.properties.endpoint\n", + "aacs_resource_id = aacs.id\n", + "print(f\"AACS endpoint is {aacs_endpoint}\")\n", + "print(f\"AACS ResourceId is {aacs_resource_id}\")\n", + "\n", + "aacs_access_key = acs_client.accounts.list_keys(\n", + " resource_group_name=resource_group, account_name=aacs.name\n", + ").key1" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Create Azure AI Content Safety enabled Llama 2 batch endpoint" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1 Check if Llama 2 model is available in the AML registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reg_client = MLClient(\n", + " credential,\n", + " subscription_id=subscription_id,\n", + " resource_group_name=resource_group,\n", + " registry_name=registry_name,\n", + ")\n", + "version_list = list(\n", + " reg_client.models.list(model_name)\n", + ") # list available versions of the model\n", + "llama_model = None\n", + "if len(version_list) == 0:\n", + " raise Exception(f\"No model named {model_name} found in registry\")\n", + "else:\n", + " model_version = \"4\"\n", + " llama_model = reg_client.models.get(model_name, model_version)\n", + " print(\n", + " f\"Using model name: {llama_model.name}, version: {llama_model.version}, id: {llama_model.id} for inferencing\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.2 Create environment for Llama 2 endpoint\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " env = ml_client.environments.get(environment_name, label=\"latest\")\n", + " print(\"---Environment already exists---\")\n", + "except:\n", + " print(\"---Creating environment---\")\n", + " env = Environment(\n", + " name=environment_name, build=BuildContext(path=\"./llama-files/docker_env\")\n", + " )\n", + " ml_client.environments.create_or_update(env)\n", + " env = ml_client.environments.get(environment_name, label=\"latest\")\n", + " print(\"---Please use link below to check build status---\")\n", + "\n", + "\n", + "display(\n", + " HTML(\n", + " f\"\"\"\n", + " \n", + " Click here to check env build status in AML studio\n", + " \n", + " \"\"\"\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.3 Create compute cluster to run batch job on\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.constants import AssetTypes, BatchDeploymentOutputAction\n", + "\n", + "if not any(filter(lambda m: m.name == compute_name, ml_client.compute.list())):\n", + " compute_cluster = AmlCompute(\n", + " name=compute_name,\n", + " size=sku_name,\n", + " min_instances=0,\n", + " max_instances=2,\n", + " )\n", + " ml_client.compute.begin_create_or_update(compute_cluster).result()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.4 Create Llama 2 batch endpoint\n", + "This step may take a few minutes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.entities import BatchEndpoint\n", + "\n", + "# Check if the endpoint already exists in the workspace\n", + "try:\n", + " endpoint = ml_client.batch_endpoints.get(endpoint_name)\n", + " print(\"---Endpoint already exists---\")\n", + "except:\n", + " # Create an batch endpoint if it doesn't exist\n", + "\n", + " # Define the endpoint\n", + " endpoint = BatchEndpoint(name=endpoint_name, description=\"Test endpoint for model\")\n", + "\n", + " # Trigger the endpoint creation\n", + " try:\n", + " ml_client.begin_create_or_update(endpoint).wait()\n", + " print(\"\\n---Endpoint created successfully---\\n\")\n", + " except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Endpoint creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.5 Deploy Llama 2 model\n", + "This step may take a few minutes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deployment = ModelBatchDeployment(\n", + " name=deployment_name,\n", + " endpoint_name=endpoint.name,\n", + " model=llama_model,\n", + " environment=env,\n", + " code_configuration=CodeConfiguration(\n", + " code=\"llama-files/score/default\",\n", + " scoring_script=\"score_batch.py\",\n", + " ),\n", + " compute=compute_name,\n", + " settings=ModelBatchDeploymentSettings(\n", + " instance_count=1,\n", + " max_concurrency_per_instance=1,\n", + " mini_batch_size=1,\n", + " output_action=BatchDeploymentOutputAction.APPEND_ROW,\n", + " output_file_name=\"predictions.csv\",\n", + " retry_settings=BatchRetrySettings(max_retries=3, timeout=3000),\n", + " logging_level=\"info\",\n", + " environment_variables={\n", + " \"CONTENT_SAFETY_ENDPOINT\": aacs_endpoint,\n", + " \"CONTENT_SAFETY_KEY\": aacs_access_key,\n", + " },\n", + " ),\n", + ")\n", + "# Trigger the deployment creation\n", + "try:\n", + " ml_client.begin_create_or_update(deployment).wait()\n", + " print(\"\\n---Deployment created successfully---\\n\")\n", + "except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Deployment creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.6 Update Batch endpoint to set the default deployment\n", + "This step may take a few minutes." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = ml_client.batch_endpoints.get(endpoint_name)\n", + "endpoint.defaults.deployment_name = deployment.name\n", + "ml_client.batch_endpoints.begin_create_or_update(endpoint).result()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Prepare to test." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.1 Input data preparation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_path = \"llama-files/data\"\n", + "dataset_name = \"input-data-small\"\n", + "\n", + "input_data = Data(\n", + " path=data_path,\n", + " type=AssetTypes.URI_FOLDER,\n", + " description=\"A sample of the dataset for text generation, in CSV file format\",\n", + " name=dataset_name,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_data = ml_client.data.create_or_update(input_data)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from time import sleep\n", + "\n", + "print(f\"Waiting for data asset {dataset_name}\", end=\"\")\n", + "while not any(filter(lambda m: m.name == dataset_name, ml_client.data.list())):\n", + " sleep(10)\n", + " print(\".\", end=\"\")\n", + "\n", + "print(\" [DONE]\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input_data = ml_client.data.get(name=dataset_name, label=\"latest\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "input = Input(type=AssetTypes.URI_FOLDER, path=input_data.id)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.2 Invoke the endpoint\n", + "\n", + "Let's now invoke the endpoint for batch scoring job:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = ml_client.batch_endpoints.invoke(endpoint_name=endpoint.name, input=input)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.3 Get the details of the invoked job\n", + "Let us get details and logs of the invoked job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.get(job.name)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can wait for the job to finish using the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.stream(job.name)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.4 Download the results\n", + "\n", + "The deployment creates a child job that executes the scoring. We can get the details of it using the following code:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "scoring_job = list(ml_client.jobs.list(parent_job_name=job.name))[0]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"Job name:\", scoring_job.name)\n", + "print(\"Job status:\", scoring_job.status)\n", + "print(\n", + " \"Job duration:\",\n", + " scoring_job.creation_context.last_modified_at\n", + " - scoring_job.creation_context.created_at,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The outputs generated by the deployment job will be placed in an output named `score`:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(name=scoring_job.name, download_path=\".\", output_name=\"score\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The output file above will contain one line for each file, and each line will have multiple arrays corresponding to each line of the file. If you see [], that means ACS has stripped the response from the model" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 4.5 Clean up Resources\n", + "Delete endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_endpoints.begin_delete(endpoint.name).result()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "env", + "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.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/sdk/python/foundation-models/system/inference/text-generation/llama-safe-online-deployment.ipynb b/sdk/python/foundation-models/system/inference/text-generation/llama-safe-online-deployment.ipynb new file mode 100644 index 0000000000..5ab2370012 --- /dev/null +++ b/sdk/python/foundation-models/system/inference/text-generation/llama-safe-online-deployment.ipynb @@ -0,0 +1,709 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How to create an Azure AI Content Safety enabled Llama 2 online endpoint (Preview)\n", + "### This notebook will walk you through the steps to create an __Azure AI Content Safety__ enabled __Llama 2__ online endpoint.\n", + "### This notebook is under preview\n", + "### The steps are:\n", + "1. Create an __Azure AI Content Safety__ resource for moderating the request from user and response from the __Llama 2__ online endpoint.\n", + "2. Create a new __Azure AI Content Safety__ enabled __Llama 2__ online endpoint with a custom score.py which will integrate with the __Azure AI Content Safety__ resource to moderate the response from the __Llama 2__ model and the request from the user, but to make the custom score.py to successfully authenticated to the __Azure AI Content Safety__ resource, we have 2 options:\n", + " 1. __UAI__, recommended but more complex approach, is to create a User Assigned Identity (UAI) and assign appropriate roles to the UAI. Then, the custom score.py can obtain the access token of the UAI from the AAD server to access the Azure AI Content Safety resource. Use [this notebook](aacs-prepare-uai.ipynb) to create UAI account for step 3 below\n", + " 2. __Environment variable__, simpler but less secure approach, is to just pass the access key of the Azure AI Content Safety resource to the custom score.py via environment variable, then the custom score.py can use the key directly to access the Azure AI Content Safety resource, this option is less secure than the first option, if someone in your org has access to the endpoint, he/she can get the access key from the environment variable and use it to access the Azure AI Content Safety resource.\n", + " " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 1. Prerequisites\n", + "#### 1.1 Check List:\n", + "- [x] You have created a new Python virtual environment for this notebook.\n", + "- [x] The identity you are using to execute this notebook(yourself or your VM) need to have the __Contributor__ role on the resource group where the AML Workspace your specified is located, because this notebook will create an Azure AI Content Safety resource using that identity." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.2 Assign variables for the workspace and deployment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# The public registry name contains Llama 2 models\n", + "registry_name = \"azureml-meta\"\n", + "\n", + "# Name of the Llama 2 model to be deployed\n", + "# available_llama_models_text_generation = [\"Llama-2-7b\", \"Llama-2-13b\", \"Llama-2-70b\"]\n", + "# available_llama_models_chat_complete = [\"Llama-2-7b-chat\", \"Llama-2-13b-chat\", \"Llama-2-70b-chat\"]\n", + "model_name = \"Llama-2-7b\"\n", + "\n", + "endpoint_name = f\"{model_name}-test-ep\" # Replace with your endpoint name\n", + "deployment_name = \"llama\" # Replace with your deployment name, lower case only!!!\n", + "sku_name = \"Standard_NC24s_v3\" # Name of the sku(instance type) Check the model-list(can be found in the parent folder(inference)) to get the most optimal sku for your model (Default: Standard_DS2_v2)\n", + "\n", + "environment_name = f\"{endpoint_name}-env\" # Replace with your environment name\n", + "\n", + "# The severity level that will trigger response be blocked\n", + "# Please reference Azure AI content documentation for more details\n", + "# https://learn.microsoft.com/en-us/azure/cognitive-services/content-safety/concepts/harm-categories\n", + "content_severity_threshold = \"2\"\n", + "\n", + "# UAI to be used for endpoint if you choose to use UAI as authentication method\n", + "uai_name = \"\" # default to \"aacs-uai\" in prepare uai notebook" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.3 Install Dependencies(as needed)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# uncomment the following lines to install the required packages\n", + "# %pip install azure-identity==1.13.0\n", + "# %pip install azure-mgmt-cognitiveservices==13.4.0\n", + "# %pip install azure-ai-ml==1.8.0\n", + "# %pip install azure-mgmt-msi==7.0.0\n", + "# %pip install azure-mgmt-authorization==3.0.0" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.4 Get credential" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.5 Configure workspace " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml import MLClient\n", + "\n", + "try:\n", + " ml_client = MLClient.from_config(credential=credential)\n", + "except Exception as ex:\n", + " # enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + "\n", + " # get a handle to the workspace\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace)\n", + "\n", + "subscription_id = ml_client.subscription_id\n", + "resource_group = ml_client.resource_group_name\n", + "workspace = ml_client.workspace_name\n", + "\n", + "print(f\"Connected to workspace {workspace}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1.6 Assign variables for Azure Content Safety\n", + "Currently, Azure AI Content Safety is in a limited set of regions:\n", + "\n", + "\n", + "__NOTE__: before you choose the region to deploy the Azure AI Content Safety, please be aware that your data will be transferred to the region you choose and by selecting a region outside your current location, you may be allowing the transmission of your data to regions outside your jurisdiction. It is important to note that data protection and privacy laws may vary between jurisdictions. Before proceeding, we strongly advise you to familiarize yourself with the local laws and regulations governing data transfer and ensure that you are legally permitted to transmit your data to an overseas location for processing. By continuing with the selection of a different region, you acknowledge that you have understood and accepted any potential risks associated with such data transmission. Please proceed with caution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.cognitiveservices import CognitiveServicesManagementClient\n", + "\n", + "acs_client = CognitiveServicesManagementClient(credential, subscription_id)\n", + "\n", + "\n", + "# settings for the Azure AI Content Safety resource\n", + "# we will choose existing AACS resource if it exists, otherwise create a new one\n", + "# name of azure ai content safety resource, has to be unique\n", + "import time\n", + "\n", + "aacs_name = f\"{endpoint_name}-aacs-{str(time.time()).replace('.','')}\"\n", + "available_aacs_locations = [\"east us\", \"west europe\"]\n", + "\n", + "# create a new Cognitive Services Account\n", + "kind = \"ContentSafety\"\n", + "aacs_sku_name = \"S0\"\n", + "aacs_location = available_aacs_locations[0]\n", + "\n", + "\n", + "print(\"Available SKUs:\")\n", + "aacs_skus = acs_client.resource_skus.list()\n", + "print(\"SKU Name\\tSKU Tier\\tLocations\")\n", + "for sku in aacs_skus:\n", + " if sku.kind == \"ContentSafety\":\n", + " locations = \",\".join(sku.locations)\n", + " print(sku.name + \"\\t\" + sku.tier + \"\\t\" + locations)\n", + "\n", + "print(\n", + " f\"Choose a new Azure AI Content Safety resource in {aacs_location} with SKU {aacs_sku_name}\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2. Create Azure AI Content Safety" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.mgmt.cognitiveservices.models import Account, Sku, AccountProperties\n", + "\n", + "\n", + "parameters = Account(\n", + " sku=Sku(name=aacs_sku_name),\n", + " kind=kind,\n", + " location=aacs_location,\n", + " properties=AccountProperties(\n", + " custom_sub_domain_name=aacs_name, public_network_access=\"Enabled\"\n", + " ),\n", + ")\n", + "# How many seconds to wait between checking the status of an async operation.\n", + "wait_time = 10\n", + "\n", + "\n", + "def find_acs(accounts):\n", + " return next(\n", + " x\n", + " for x in accounts\n", + " if x.kind == \"ContentSafety\"\n", + " and x.location == aacs_location\n", + " and x.sku.name == aacs_sku_name\n", + " )\n", + "\n", + "\n", + "try:\n", + " # check if AACS exists\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + " print(f\"Found existing Azure AI content safety Account {aacs.name}.\")\n", + "except:\n", + " try:\n", + " # check if there is an existing AACS resource within same resource group\n", + " aacs = find_acs(acs_client.accounts.list_by_resource_group(resource_group))\n", + " print(\n", + " f\"Found existing Azure AI content safety Account {aacs.name} in resource group {resource_group}.\"\n", + " )\n", + " except:\n", + " print(f\"Creating Azure AI content safety Account {aacs_name}.\")\n", + " acs_client.accounts.begin_create(resource_group, aacs_name, parameters).wait()\n", + " print(\"Resource created.\")\n", + " aacs = acs_client.accounts.get(resource_group, aacs_name)\n", + "\n", + "\n", + "aacs_endpoint = aacs.properties.endpoint\n", + "aacs_resource_id = aacs.id\n", + "aacs_name = aacs.name\n", + "print(\n", + " f\"AACS name is {aacs.name}, use this name in UAI preparation notebook to create UAI.\"\n", + ")\n", + "print(f\"AACS endpoint is {aacs_endpoint}\")\n", + "print(f\"AACS ResourceId is {aacs_resource_id}\")\n", + "\n", + "aacs_access_key = acs_client.accounts.list_keys(\n", + " resource_group_name=resource_group, account_name=aacs.name\n", + ").key1" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3. Create Azure AI Content Safety enabled Llama 2 online endpoint" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1 Check if Llama 2 model is available in the AML registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "reg_client = MLClient(\n", + " credential,\n", + " subscription_id=subscription_id,\n", + " resource_group_name=resource_group,\n", + " registry_name=registry_name,\n", + ")\n", + "version_list = list(\n", + " reg_client.models.list(model_name)\n", + ") # list available versions of the model\n", + "llama_model = None\n", + "hf_tgi = False # If text-generation-inference (hf container) is supported for model\n", + "\n", + "if len(version_list) == 0:\n", + " raise Exception(f\"No model named {model_name} found in registry\")\n", + "else:\n", + " model_version = version_list[0].version\n", + " llama_model = reg_client.models.get(model_name, model_version)\n", + " if \"inference_supported_envs\" in llama_model.tags:\n", + " if \"hf_tgi\" in llama_model.tags[\"inference_supported_envs\"]:\n", + " hf_tgi = True\n", + " print(\n", + " f\"Using model name: {llama_model.name}, version: {llama_model.version}, id: {llama_model.id} for inferencing\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.2 Check if UAI is used" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "uai_id = \"\"\n", + "uai_client_id = \"\"\n", + "if uai_name != \"\":\n", + " from azure.mgmt.msi import ManagedServiceIdentityClient\n", + " from azure.mgmt.msi.models import Identity\n", + "\n", + " msi_client = ManagedServiceIdentityClient(\n", + " subscription_id=subscription_id,\n", + " credential=credential,\n", + " )\n", + " uai_resource = msi_client.user_assigned_identities.get(resource_group, uai_name)\n", + " uai_id = uai_resource.id\n", + " uai_client_id = uai_resource.client_id" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3 Create Llama 2 online endpoint\n", + "This step may take a few minutes." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.entities import (\n", + " ManagedOnlineEndpoint,\n", + " IdentityConfiguration,\n", + " ManagedIdentityConfiguration,\n", + ")\n", + "\n", + "# Check if the endpoint already exists in the workspace\n", + "try:\n", + " endpoint = ml_client.online_endpoints.get(endpoint_name)\n", + " print(\"---Endpoint already exists---\")\n", + "except:\n", + " # Create an online endpoint if it doesn't exist\n", + "\n", + " # Define the endpoint\n", + " endpoint = ManagedOnlineEndpoint(\n", + " name=endpoint_name,\n", + " description=\"Test endpoint for model\",\n", + " identity=IdentityConfiguration(\n", + " type=\"user_assigned\",\n", + " user_assigned_identities=[ManagedIdentityConfiguration(resource_id=uai_id)],\n", + " )\n", + " if uai_id != \"\"\n", + " else None,\n", + " )\n", + "\n", + " # Trigger the endpoint creation\n", + " try:\n", + " ml_client.begin_create_or_update(endpoint).wait()\n", + " print(\"\\n---Endpoint created successfully---\\n\")\n", + " except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Endpoint creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### 3.4 Deploy Llama 2 model\n", + "This step may take a few minutes." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Create deployment" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Initialize deployment parameters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "REQUEST_TIMEOUT_MS = 90000\n", + "\n", + "deployment_env_vars = {\n", + " \"CONTENT_SAFETY_ACCOUNT_NAME\": aacs_name,\n", + " \"CONTENT_SAFETY_ENDPOINT\": aacs_endpoint,\n", + " \"CONTENT_SAFETY_KEY\": aacs_access_key if uai_client_id == \"\" else None,\n", + " \"CONTENT_SAFETY_THRESHOLD\": content_severity_threshold,\n", + " \"SUBSCRIPTION_ID\": subscription_id,\n", + " \"RESOURCE_GROUP_NAME\": resource_group,\n", + " \"UAI_CLIENT_ID\": uai_client_id,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.entities import (\n", + " OnlineRequestSettings,\n", + " CodeConfiguration,\n", + " ManagedOnlineDeployment,\n", + " ProbeSettings,\n", + ")\n", + "\n", + "# For HF TGI inferencing, the scoring script is baked into the container\n", + "code_configuration = (\n", + " CodeConfiguration(code=\"./llama-files/score/default/\", scoring_script=\"score.py\")\n", + " if not hf_tgi\n", + " else None\n", + ")\n", + "\n", + "deployment = ManagedOnlineDeployment(\n", + " name=deployment_name,\n", + " endpoint_name=endpoint_name,\n", + " model=llama_model.id,\n", + " instance_type=sku_name,\n", + " instance_count=1,\n", + " code_configuration=code_configuration,\n", + " environment_variables=deployment_env_vars,\n", + " request_settings=OnlineRequestSettings(request_timeout_ms=REQUEST_TIMEOUT_MS),\n", + " liveness_probe=ProbeSettings(\n", + " failure_threshold=30,\n", + " success_threshold=1,\n", + " period=100,\n", + " initial_delay=500,\n", + " ),\n", + " readiness_probe=ProbeSettings(\n", + " failure_threshold=30,\n", + " success_threshold=1,\n", + " period=100,\n", + " initial_delay=500,\n", + " ),\n", + ")\n", + "\n", + "# Trigger the deployment creation\n", + "try:\n", + " ml_client.begin_create_or_update(deployment).wait()\n", + " print(\"\\n---Deployment created successfully---\\n\")\n", + "except Exception as err:\n", + " raise RuntimeError(\n", + " f\"Deployment creation failed. Detailed Response:\\n{err}\"\n", + " ) from err" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4. Test the Safety Enabled Llama 2 online endpoint." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "test_src_dir = \"./safety-llama-test\"\n", + "os.makedirs(test_src_dir, exist_ok=True)\n", + "print(f\"test script directory: {test_src_dir}\")\n", + "sample_data = os.path.join(test_src_dir, \"sample-request.json\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### Choose request from following 4 cells based on the Llama 2 model type you chosen and the scenario you want to test" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## For text-generation models (without -chat suffix)\n", + "## Successful response\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " \"Hello\",\n", + " \"My name is John and I have a dog.\",\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.6,\n", + " \"top_p\": 0.6,\n", + " \"max_new_tokens\": 256,\n", + " \"do_sample\": True,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## For text-generation models (without -chat suffix)\n", + "## Blocked request/response due to hateful content\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " \"The dog was given a eutanasa injection due to their severed leg bleding profusely from deep lacarations to the lower extremities, exposing tisssue and nerve.\", # This line contains hateful message and endpoint will return empty string as response\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.6,\n", + " \"top_p\": 0.6,\n", + " \"max_new_tokens\": 256,\n", + " \"do_sample\": True,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## For chat-complete models (with \"-chat\" suffix)\n", + "## Successful request/response\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"What is the tallest building in the world?\",\n", + " },\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\": \"As of 2021, the Burj Khalifa in Dubai, United Arab Emirates is the tallest building in the world, standing at a height of 828 meters (2,722 feet). It was completed in 2010 and has 163 floors. The Burj Khalifa is not only the tallest building in the world but also holds several other records, such as the highest occupied floor, highest outdoor observation deck, elevator with the longest travel distance, and the tallest freestanding structure in the world.\",\n", + " },\n", + " {\"role\": \"user\", \"content\": \"and in Africa?\"},\n", + " {\n", + " \"role\": \"assistant\",\n", + " \"content\": \"In Africa, the tallest building is the Carlton Centre, located in Johannesburg, South Africa. It stands at a height of 50 floors and 223 meters (730 feet). The CarltonDefault Centre was completed in 1973 and was the tallest building in Africa for many years until the construction of the Leonardo, a 55-story skyscraper in Sandton, Johannesburg, which was completed in 2019 and stands at a height of 230 meters (755 feet). Other notable tall buildings in Africa include the Ponte City Apartments in Johannesburg, the John Hancock Center in Lagos, Nigeria, and the Alpha II Building in Abidjan, Ivory Coast\",\n", + " },\n", + " {\"role\": \"user\", \"content\": \"and in Europe?\"},\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.9,\n", + " \"top_p\": 0.6,\n", + " \"do_sample\": True,\n", + " \"max_new_tokens\": 100,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## For chat-complete models (with \"-chat\" suffix)\n", + "## Blocked request due to hateful content\n", + "\n", + "import json\n", + "\n", + "with open(sample_data, \"w\") as f:\n", + " json.dump(\n", + " {\n", + " \"input_data\": {\n", + " \"input_string\": [\n", + " {\n", + " \"role\": \"user\",\n", + " \"content\": \"A 51-year-old man was found dead in his car. There were blood stains on the dashboard and windscreen. At autopsy, a deep, oblique, long incised injury was found on the front of the neck. It turns out that he died by suicide.\",\n", + " },\n", + " ],\n", + " \"parameters\": {\n", + " \"temperature\": 0.9,\n", + " \"top_p\": 0.6,\n", + " \"do_sample\": True,\n", + " \"max_new_tokens\": 100,\n", + " },\n", + " }\n", + " },\n", + " f,\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.online_endpoints.invoke(\n", + " endpoint_name=endpoint_name,\n", + " deployment_name=deployment_name,\n", + " request_file=sample_data,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.17" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/sdk/python/generative-ai/rag/README.md b/sdk/python/generative-ai/rag/README.md index adef3009ff..40be1ff5f6 100644 --- a/sdk/python/generative-ai/rag/README.md +++ b/sdk/python/generative-ai/rag/README.md @@ -8,12 +8,13 @@ For more documentation related to RAG refer the AzureML documentation [here](htt ## Sample Notebooks -|Category|Article| -|----------------|----------------| -|Notebooks|[Process Git Repo into Azure Cognitive Search with Embeddings](./notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb)| -|Notebooks|[Process private Git Repo into FAISS Embeddings Index](./notebooks/faiss/faiss_mlindex_with_langchain.ipynb)|| -|Notebooks|[QA Test Generation](./notebooks/qa_data_generation.ipynb)| -|Notebooks|[Productionize Vector Index with Test Data Generation, Auto Prompt, Evaluations and Prompt Flow](./notebooks/mlindex_with_testgen_autoprompt.ipynb)| +| Category | Article | +| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | +| Notebooks | [Process Git Repo into Azure Cognitive Search with Embeddings](./notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb) | +| Notebooks | [Process private Git Repo into FAISS Embeddings Index](./notebooks/faiss/faiss_mlindex_with_langchain.ipynb) | +| Notebooks | [QA Test Generation](./notebooks/qa_data_generation.ipynb) | +| Notebooks | [Productionize Vector Index with Test Data Generation, Auto Prompt, Evaluations and Prompt Flow](./notebooks/mlindex_with_testgen_autoprompt.ipynb) | +| Notebooks | [DB Copilot with RAG](./notebooks/db_copilot_with_rag.ipynb) | ## Feedback and support diff --git a/sdk/python/generative-ai/rag/TROUBLESHOOT.md b/sdk/python/generative-ai/rag/TROUBLESHOOT.md index 7deab97ee9..9a81d177ff 100644 --- a/sdk/python/generative-ai/rag/TROUBLESHOOT.md +++ b/sdk/python/generative-ai/rag/TROUBLESHOOT.md @@ -11,7 +11,7 @@ If a pipeline fails in llm_rag_validate_deployments component, then it indicates that the RAG pipeline is unable to access model deployments from Azure Open AI connection. Some of the common scenarios include - Incorrect API Base or Key for the Azure Open AI workspace connection. -- Deployment for selected model name (ex. text-embedding-ada-002, text-davinci-003, gpt-35-turbo, gpt-4 etc.) does not exist on the AOAI resource. +- Deployment for selected model name (ex. text-embedding-ada-002, gpt-35-turbo, gpt-4 etc.) does not exist on the AOAI resource. - Incorrect deployment name for the selected AOAI model. ## Unable to retrieve OBO tokens for resource diff --git a/sdk/python/generative-ai/rag/notebooks/README.md b/sdk/python/generative-ai/rag/notebooks/README.md index 3a4d618c17..35c070ccb1 100644 --- a/sdk/python/generative-ai/rag/notebooks/README.md +++ b/sdk/python/generative-ai/rag/notebooks/README.md @@ -2,11 +2,12 @@ Following notebooks demonstrate use of AzureML Components to process your data into Vector Index and use them in Promptflow or LangChain. -| Category | Article | -|----------------|----------------| -|Notebooks|[Process Git Repo into Azure Cognitive Search with Embeddings](./azure_cognitive_search/acs_mlindex_with_langchain.ipynb)| -|Notebooks|[Process private Git Repo into FAISS Embeddings Index](./faiss/faiss_mlindex_with_langchain.ipynb)| -|Notebooks|[QA Test Generation](./qa_data_generation.ipynb)| -|Notebooks|[Productionize Vector Index with Test Data Generation, Auto Prompt, Evaluations and Prompt Flow](./mlindex_with_testgen_autoprompt.ipynb)| -|Notebooks|[Import data from an S3 bucket into an Azure Cognitive Search Index](./azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb)| -|Notebooks|[Update a FAISS based Vector Index on a Schedule](./faiss/scheduled_update_faiss_index.ipynb)| +| Category | Article | +| --------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| Notebooks | [Process Git Repo into Azure Cognitive Search with Embeddings](./azure_cognitive_search/acs_mlindex_with_langchain.ipynb) | +| Notebooks | [Process private Git Repo into FAISS Embeddings Index](./faiss/faiss_mlindex_with_langchain.ipynb) | +| Notebooks | [QA Test Generation](./qa_data_generation.ipynb) | +| Notebooks | [Productionize Vector Index with Test Data Generation, Auto Prompt, Evaluations and Prompt Flow](./mlindex_with_testgen_autoprompt.ipynb) | +| Notebooks | [Import data from an S3 bucket into an Azure Cognitive Search Index](./azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb) | +| Notebooks | [Update a FAISS based Vector Index on a Schedule](./faiss/scheduled_update_faiss_index.ipynb) | +| Notebooks | [DB Copilot with RAG](./db_copilot_with_rag.ipynb) | diff --git a/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb b/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb index 7f14e4ce9d..1a5b7e80ac 100644 --- a/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/acs_mlindex_with_langchain.ipynb @@ -342,8 +342,8 @@ " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", ")\n", "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", - "generate_embeddings_parallel_component = ml_registry.components.get(\n", - " \"llm_rag_generate_embeddings_parallel\", label=\"latest\"\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", ")\n", "# Reads an input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and pushes all documents (chunk, metadata, embedding_vector) into an Azure Cognitive Search index. Writes an MLIndex yaml detailing the index and embeddings model information.\n", "update_acs_index_component = ml_registry.components.get(\n", @@ -437,17 +437,12 @@ " )\n", " use_automatic_compute(crack_and_chunk)\n", "\n", - " # `generate_embeddings_parallel` uses AzureML an parallel job to process batches of chunks in parallel.\n", - " # By default 3 files are processed in a single batch, all chunks from each file are included.\n", - " # For larger numbers of files more instances can be added using the `instance_count` parameter below so batches can be processed in parallel.\n", - " # When using AOAI, the maximum number requests per-minute is usually the limiting factor.\n", - " # To read more about parallel jobs see: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-use-parallel-job-in-pipeline?view=azureml-api-2&tabs=cliv2\n", - " generate_embeddings = generate_embeddings_parallel_component(\n", + " generate_embeddings = generate_embeddings_component(\n", " chunks_source=crack_and_chunk.outputs.output_chunks,\n", " embeddings_container=embeddings_container,\n", " embeddings_model=embeddings_model,\n", " )\n", - " use_automatic_compute(generate_embeddings, instance_count=2)\n", + " use_automatic_compute(generate_embeddings)\n", " if optional_pipeline_input_provided(aoai_connection_id):\n", " generate_embeddings.environment_variables[\n", " \"AZUREML_WORKSPACE_CONNECTION_ID_AOAI\"\n", diff --git a/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb b/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb index c1a8025241..acf14d658a 100644 --- a/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/azure_cognitive_search/s3_to_acs_mlindex_with_langchain.ipynb @@ -394,8 +394,8 @@ " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", ")\n", "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", - "generate_embeddings_parallel_component = ml_registry.components.get(\n", - " \"llm_rag_generate_embeddings_parallel\", label=\"latest\"\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", ")\n", "# Reads an input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and pushes all documents (chunk, metadata, embedding_vector) into an Azure Cognitive Search index. Writes an MLIndex yaml detailing the index and embeddings model information.\n", "update_acs_index_component = ml_registry.components.get(\n", @@ -489,17 +489,12 @@ " )\n", " use_automatic_compute(crack_and_chunk)\n", "\n", - " # `generate_embeddings_parallel` uses AzureML an parallel job to process batches of chunks in parallel.\n", - " # By default 3 files are processed in a single batch, all chunks from each file are included.\n", - " # For larger numbers of files more instances can be added using the `instance_count` parameter below so batches can be processed in parallel.\n", - " # When using AOAI, the maximum number requests per-minute is usually the limiting factor.\n", - " # To read more about parallel jobs see: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-use-parallel-job-in-pipeline?view=azureml-api-2&tabs=cliv2\n", - " generate_embeddings = generate_embeddings_parallel_component(\n", + " generate_embeddings = generate_embeddings_component(\n", " chunks_source=crack_and_chunk.outputs.output_chunks,\n", " embeddings_container=embeddings_container,\n", " embeddings_model=embeddings_model,\n", " )\n", - " use_automatic_compute(generate_embeddings, instance_count=2)\n", + " use_automatic_compute(generate_embeddings)\n", " if optional_pipeline_input_provided(aoai_connection_id):\n", " generate_embeddings.environment_variables[\n", " \"AZUREML_WORKSPACE_CONNECTION_ID_AOAI\"\n", diff --git a/sdk/python/generative-ai/rag/notebooks/db_copilot_with_rag.ipynb b/sdk/python/generative-ai/rag/notebooks/db_copilot_with_rag.ipynb new file mode 100644 index 0000000000..0964fdbe56 --- /dev/null +++ b/sdk/python/generative-ai/rag/notebooks/db_copilot_with_rag.ipynb @@ -0,0 +1,414 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "345e6aa4", + "metadata": {}, + "outputs": [], + "source": [ + "%pip install azure-ai-ml\n", + "%pip install -U 'azureml-rag[faiss]>=0.1.11'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "038912d8", + "metadata": {}, + "outputs": [], + "source": [ + "# If `import win32file` fails with a DLL error then run the following and restart kernel:\n", + "# %pip uninstall -y pywin32\n", + "# %conda install -y --force-reinstall pywin32" + ] + }, + { + "cell_type": "markdown", + "id": "28b26c69", + "metadata": {}, + "source": [ + "# Create a FAISS based Vector Index for DBCopilot with AzureML\n", + "We'll walk through setting up an AzureML Pipeline which grounding a DataBase into a LangChain-compatible FAISS Vector Index and create the promptflow to consume this index to serve as a DBCopilot chatbot." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "1a99955c", + "metadata": {}, + "source": [ + "## Get client for AzureML Workspace\n", + "\n", + "The workspace is the top-level resource for Azure Machine Learning, providing a centralized place to work with all the artifacts you create when you use Azure Machine Learning. In this section we will connect to the workspace in which the job will be run.\n", + "\n", + "Enter your Workspace details below, running this still will write a `workspace.json` file to the current folder." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63178816", + "metadata": {}, + "outputs": [], + "source": [ + "%%writefile workspace.json\n", + "{\n", + " \"subscription_id\": \"\",\n", + " \"resource_group\": \"\",\n", + " \"workspace_name\": \"\"\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1fb5c8f0", + "metadata": {}, + "source": [ + "`MLClient` is how you interact with AzureML" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b1af37c8", + "metadata": {}, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "from azure.ai.ml import MLClient\n", + "from azureml.core import Workspace\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()\n", + "\n", + "try:\n", + " ml_client = MLClient.from_config(credential=credential, path=\"workspace.json\")\n", + "except Exception as ex:\n", + " raise Exception(\n", + " \"Failed to create MLClient from config file. Please modify and then run the above cell with your AzureML Workspace details.\"\n", + " ) from ex\n", + "\n", + "ws = Workspace(\n", + " subscription_id=ml_client.subscription_id,\n", + " resource_group=ml_client.resource_group_name,\n", + " workspace_name=ml_client.workspace_name,\n", + ")\n", + "print(ml_client)" + ] + }, + { + "cell_type": "markdown", + "id": "ade6080e", + "metadata": {}, + "source": [ + "## Create a SQL Datastore\n", + "1. Go to workspace in Azure Portal\n", + "2. Click **Data** -> **Datastore** -> **+ Create**\n", + "3. Fill in the datastore form\n", + "\n", + "| Field | Value |\n", + "| --- | --- |\n", + "| Datastore name | the name for the datastore |\n", + "| Datastore type | Azure SQL Database |\n", + "| Account information| could be found in the Azure SQL Database overview page |\n", + "| Authentication type | SQL Authentication/ Service principal |\n", + "| Authentication info | SQL Authentication: username and password; Service principal: tenant id, client id, client secret |" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "30906d39", + "metadata": {}, + "source": [ + "## Azure OpenAI\n", + "\n", + "We recommend using gpt-35-turbo model to get good quality QAs. [Follow these instructions](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal) to setup an Azure OpenAI Instance and deploy the model. Once you have the model deployed in AOAI you can specify your Model name and Deployment name below.\n", + "\n", + "We will use the automatically created `Default_AzureOpenAI` connection, change `aoai_connection_name` to use your own." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ab3f1c33", + "metadata": {}, + "outputs": [], + "source": [ + "aoai_connection_name = \"Default_AzureOpenAI\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "129ac0b7", + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.rag.utils.connections import (\n", + " get_connection_by_name_v2,\n", + " create_connection_v2,\n", + ")\n", + "\n", + "try:\n", + " aoai_connection = get_connection_by_name_v2(ws, aoai_connection_name)\n", + "except Exception as ex:\n", + " # Create New Connection\n", + " # Modify the details below to match the `Endpoint` and API key of your AOAI resource, these details can be found in Azure Portal\n", + " raise RuntimeError(\n", + " \"Have you entered your AOAI resource details below? If so, delete me!\"\n", + " )\n", + " aoai_connection = create_connection_v2(\n", + " workspace=ws,\n", + " name=aoai_connection,\n", + " category=\"AzureOpenAI\",\n", + " # 'Endpoint' from Azure OpenAI resource overview\n", + " target=\"https://.openai.azure.com/\",\n", + " auth_type=\"ApiKey\",\n", + " credentials={\n", + " # Either `Key` from the `Keys and Endpoint` tab of your Azure OpenAI resource, will be stored in your Workspace associated Azure Key Vault.\n", + " \"key\": \"\"\n", + " },\n", + " metadata={\"ApiType\": \"azure\", \"ApiVersion\": \"2023-05-15\"},\n", + " )\n", + "\n", + "aoai_connection_id = aoai_connection[\"id\"]" + ] + }, + { + "cell_type": "markdown", + "id": "73c4ece4", + "metadata": {}, + "source": [ + "Now that your Workspace has a connection to Azure OpenAI we will make sure the `gpt-35-turbo` model has been deployed ready for inference. This cell will fail if there is not deployment for the embeddings model, [follow these instructions](https://learn.microsoft.com/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#deploy-a-model) to deploy a model with Azure OpenAI." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c045de88", + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.rag.utils.deployment import infer_deployment\n", + "\n", + "aoai_embedding_model_name = \"text-embedding-ada-002\"\n", + "try:\n", + " aoai_embedding_deployment_name = infer_deployment(\n", + " aoai_connection, aoai_embedding_model_name\n", + " )\n", + " print(\n", + " f\"Deployment name in AOAI workspace for model '{aoai_embedding_model_name}' is '{aoai_embedding_deployment_name}'\"\n", + " )\n", + "except Exception as e:\n", + " print(f\"Deployment name in AOAI workspace for model '{model_name}' is not found.\")\n", + " print(\n", + " f\"Please create a deployment for this model by following the deploy instructions on the resource page for '{aoai_connection['properties']['target']}' in Azure Portal.\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c1e5cc13", + "metadata": {}, + "outputs": [], + "source": [ + "from azureml.rag.utils.deployment import infer_deployment\n", + "\n", + "aoai_completion_model_name = \"gpt-35-turbo\"\n", + "\n", + "try:\n", + " aoai_completion_deployment_name = infer_deployment(\n", + " aoai_connection, aoai_completion_model_name\n", + " )\n", + "except Exception as e:\n", + " print(\n", + " f\"Deployment name in AOAI workspace for model '{aoai_completion_model_name}' is not found.\"\n", + " )\n", + " print(\n", + " f\"Please create a deployment for this model by following the deploy instructions on the resource page for '{aoai_connection['properties']['target']}' in Azure Portal.\"\n", + " )\n", + "\n", + "print(\n", + " f\"Deployment name in AOAI workspace for model '{aoai_completion_model_name}' is '{aoai_completion_deployment_name}'\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "ff40ff04", + "metadata": {}, + "source": [ + "Finally we will combine the deployment and model information into a uri form which the AzureML embeddings components expect as input." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1dfe810e", + "metadata": {}, + "outputs": [], + "source": [ + "llm_completion_config = f'{{\"type\":\"azure_open_ai\",\"model_name\":\"{aoai_completion_model_name}\",\"deployment_name\":\"{aoai_completion_deployment_name}\",\"temperature\":0,\"max_tokens\":\"1500\"}}'" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "56878876", + "metadata": {}, + "source": [ + "### Setup Pipeline\n", + "\n", + "The Components are published to a [Registry](https://learn.microsoft.com/azure/machine-learning/how-to-manage-registries?view=azureml-api-2&tabs=cli), `azureml`, which should have access to by default, it can be accessed from any Workspace.\n", + "In the below cell we get the Component Definitions from the `azureml` registry." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e2a3752a", + "metadata": {}, + "outputs": [], + "source": [ + "ml_registry = MLClient(credential=credential, registry_name=\"azureml\")\n", + "\n", + "db_copilot_component = ml_registry.components.get(\n", + " \"llm_ingest_db_to_faiss\", label=\"latest\"\n", + ")\n", + "\n", + "print(db_copilot_component)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "209700d2", + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml.dsl import pipeline\n", + "\n", + "\n", + "@pipeline(name=f\"db_copilot_vector_pipeline_faiss\", default_compute=\"serverless\")\n", + "def db_copilot_vector_pipeline_faiss(\n", + " aoai_connection: str,\n", + " db_datastore: str,\n", + " embeddings_model: str,\n", + " chat_aoai_deployment_name: str,\n", + " embedding_aoai_deployment_name: str,\n", + " mlindex_dataset_name: str,\n", + " selected_tables: str = None,\n", + " max_sampling_rows: int = 3,\n", + "):\n", + " db_copilot_component(\n", + " db_datastore=db_datastore,\n", + " embeddings_model=embeddings_model,\n", + " chat_aoai_deployment_name=chat_aoai_deployment_name,\n", + " embedding_aoai_deployment_name=embedding_aoai_deployment_name,\n", + " embeddings_dataset_name=mlindex_dataset_name,\n", + " embedding_connection=aoai_connection,\n", + " llm_connection=aoai_connection,\n", + " selected_tables=selected_tables,\n", + " max_sampling_rows=max_sampling_rows,\n", + " )\n", + " return {}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6682ea80", + "metadata": {}, + "outputs": [], + "source": [ + "datastore_name = \"\"\n", + "aoai_embedding_model_name = \"text-embedding-ada-002\"\n", + "asset_name = \"llm_index_db_dataset\"\n", + "pipeline_job = db_copilot_vector_pipeline_faiss(\n", + " aoai_connection=aoai_connection_id,\n", + " db_datastore=f\"azureml://datastores/{datastore_name}\",\n", + " embeddings_model=f\"azure_open_ai://deployment/{aoai_embedding_deployment_name}/model/{aoai_completion_model_name}\",\n", + " chat_aoai_deployment_name=aoai_completion_deployment_name,\n", + " embedding_aoai_deployment_name=aoai_embedding_deployment_name,\n", + " mlindex_dataset_name=asset_name,\n", + " selected_tables='[\"[dbo].[jobs]\"]',\n", + " max_sampling_rows=3,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b00fd418", + "metadata": {}, + "outputs": [], + "source": [ + "# These are added so that in progress index generations can be listed in UI, this tagging is done automatically by UI.\n", + "pipeline_job.properties[\"azureml.mlIndexAssetName\"] = asset_name\n", + "pipeline_job.properties[\"azureml.mlIndexAssetKind\"] = \"faiss\"\n", + "pipeline_job.properties[\"azureml.mlIndexAssetSource\"] = \"Database\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "52d9b2be", + "metadata": {}, + "outputs": [], + "source": [ + "running_pipeline_job = ml_client.jobs.create_or_update(\n", + " pipeline_job, experiment_name=\"db_copilot_pipeline\"\n", + ")\n", + "running_pipeline_job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c71f975c", + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.stream(running_pipeline_job.name)" + ] + }, + { + "cell_type": "markdown", + "id": "d098fccd", + "metadata": {}, + "source": [ + "## Use DBCopilot with Promptflow\n", + "After the pipeline complete, it will create a promptflow which could be used to chat with the db." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.9.16" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q1.png b/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q1.png new file mode 100644 index 0000000000..188a0f1a67 Binary files /dev/null and b/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q1.png differ diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q2.png b/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q2.png new file mode 100644 index 0000000000..27971b42bb Binary files /dev/null and b/sdk/python/generative-ai/rag/notebooks/faiss/data/General_and_administrative_q2.png differ diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q1_10Q.docx b/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q1_10Q.docx new file mode 100644 index 0000000000..728e1558a2 Binary files /dev/null and b/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q1_10Q.docx differ diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q2_10Q.docx b/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q2_10Q.docx new file mode 100644 index 0000000000..acb1ecdd44 Binary files /dev/null and b/sdk/python/generative-ai/rag/notebooks/faiss/data/MSFT_FY23Q2_10Q.docx differ diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/faiss_mlindex_with_langchain.ipynb b/sdk/python/generative-ai/rag/notebooks/faiss/faiss_mlindex_with_langchain.ipynb index 7713e6e98e..3de719832f 100644 --- a/sdk/python/generative-ai/rag/notebooks/faiss/faiss_mlindex_with_langchain.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/faiss/faiss_mlindex_with_langchain.ipynb @@ -199,7 +199,7 @@ " )\n", " aoai_connection_id = create_connection_v2(\n", " workspace=ws,\n", - " name=aoai_connection,\n", + " name=aoai_connection_name,\n", " category=\"AzureOpenAI\",\n", " target=target,\n", " auth_type=\"ApiKey\",\n", @@ -304,8 +304,8 @@ " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", ")\n", "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", - "generate_embeddings_parallel_component = ml_registry.components.get(\n", - " \"llm_rag_generate_embeddings_parallel\", label=\"latest\"\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", ")\n", "# Reads input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and inserts all documents (chunk, metadata, embedding_vector) int a Faiss index and in-memory document store. Writes an MLIndex yaml detailing the index and embeddings model information.\n", "create_faiss_index_component = ml_registry.components.get(\n", @@ -406,17 +406,12 @@ " )\n", " use_automatic_compute(crack_and_chunk)\n", "\n", - " # `generate_embeddings_parallel` uses AzureML an parallel job to process batches of chunks in parallel.\n", - " # By default 3 files are processed in a single batch, all chunks from each file are included.\n", - " # For larger numbers of files more instances can be added using the `instance_count` parameter below so batches can be processed in parallel.\n", - " # When using AOAI, the maximum number requests per-minute is usually the limiting factor.\n", - " # To read more about parallel jobs see: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-use-parallel-job-in-pipeline?view=azureml-api-2&tabs=cliv2\n", - " generate_embeddings = generate_embeddings_parallel_component(\n", + " generate_embeddings = generate_embeddings_component(\n", " chunks_source=crack_and_chunk.outputs.output_chunks,\n", " embeddings_container=embeddings_container,\n", " embeddings_model=embeddings_model,\n", " )\n", - " use_automatic_compute(generate_embeddings, instance_count=2)\n", + " use_automatic_compute(generate_embeddings)\n", " if optional_pipeline_input_provided(aoai_connection_id):\n", " generate_embeddings.environment_variables[\n", " \"AZUREML_WORKSPACE_CONNECTION_ID_AOAI\"\n", diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/scheduled_update_faiss_index.ipynb b/sdk/python/generative-ai/rag/notebooks/faiss/scheduled_update_faiss_index.ipynb index 87a03ca70f..71d59672c6 100644 --- a/sdk/python/generative-ai/rag/notebooks/faiss/scheduled_update_faiss_index.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/faiss/scheduled_update_faiss_index.ipynb @@ -285,8 +285,8 @@ " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", ")\n", "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", - "generate_embeddings_parallel_component = ml_registry.components.get(\n", - " \"llm_rag_generate_embeddings_parallel\", label=\"latest\"\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", ")\n", "# Reads input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and inserts all documents (chunk, metadata, embedding_vector) int a Faiss index and in-memory document store. Writes an MLIndex yaml detailing the index and embeddings model information.\n", "create_faiss_index_component = ml_registry.components.get(\n", @@ -387,17 +387,12 @@ " )\n", " use_automatic_compute(crack_and_chunk)\n", "\n", - " # `generate_embeddings_parallel` uses AzureML an parallel job to process batches of chunks in parallel.\n", - " # By default 3 files are processed in a single batch, all chunks from each file are included.\n", - " # For larger numbers of files more instances can be added using the `instance_count` parameter below so batches can be processed in parallel.\n", - " # When using AOAI, the maximum number requests per-minute is usually the limiting factor.\n", - " # To read more about parallel jobs see: https://learn.microsoft.com/en-us/azure/machine-learning/how-to-use-parallel-job-in-pipeline?view=azureml-api-2&tabs=cliv2\n", - " generate_embeddings = generate_embeddings_parallel_component(\n", + " generate_embeddings = generate_embeddings_component(\n", " chunks_source=crack_and_chunk.outputs.output_chunks,\n", " embeddings_container=embeddings_container,\n", " embeddings_model=embeddings_model,\n", " )\n", - " use_automatic_compute(generate_embeddings, instance_count=2)\n", + " use_automatic_compute(generate_embeddings)\n", " if optional_pipeline_input_provided(aoai_connection_id):\n", " generate_embeddings.environment_variables[\n", " \"AZUREML_WORKSPACE_CONNECTION_ID_AOAI\"\n", diff --git a/sdk/python/generative-ai/rag/notebooks/faiss/url_to_faiss_incremental_embeddings_with_tabular_data.ipynb b/sdk/python/generative-ai/rag/notebooks/faiss/url_to_faiss_incremental_embeddings_with_tabular_data.ipynb new file mode 100644 index 0000000000..cb1ac10fe5 --- /dev/null +++ b/sdk/python/generative-ai/rag/notebooks/faiss/url_to_faiss_incremental_embeddings_with_tabular_data.ipynb @@ -0,0 +1,1032 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688129460670 + } + }, + "outputs": [], + "source": [ + "%pip install azure-ai-ml\n", + "%pip install -U 'azureml-rag[faiss]>=0.1.13'\n", + "# If using hugging_face embeddings add `hugging_face` extra, e.g. `azureml-rag[faiss,hugging_face]`" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "# Create a FAISS based Vector Index for Incremental Document Retrieval with AzureML for unstructured data\n", + "\n", + "In this notebook, we'll walk through setting up an AzuremML Pipeline which pulls some unstructured data from a couple docx files, chunks it, incrementally embeds the chunks and creates a LangChain compatible FAISS Vector Index. By unstructured data, we mean data in files with the extensions `.pdf`, `.ppt`, `.pptx`, `.doc`, `.docx`, `.xls` and `.xlsx`." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "\n", + "### Get client for AzureML Workspace\n", + "The workspace is the top-level resource for Azure Machine Learning, providing a centralized place to work with all the artifacts you create when you use Azure Machine Learning. In this section we will connect to the workspace in which the job will be run.\n", + "\n", + "If you don't have a Workspace and want to create and Index locally see [here to create one](https://learn.microsoft.com/en-us/azure/machine-learning/quickstart-create-resources?view=azureml-api-2).\n", + "\n", + "Enter your Workspace details below, running this still will write a `workspace.json` file to the current folder." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "%%writefile workspace.json\n", + "{\n", + " \"subscription_id\": \"\",\n", + " \"resource_group\": \"\",\n", + " \"workspace_name\": \"\"\n", + "}" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "`MLClient` is how you interact with AzureML " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "gather": { + "logged": 1688130064653 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "from azure.ai.ml import MLClient, Input, Output\n", + "from azure.ai.ml.constants import AssetTypes\n", + "from azure.ai.ml.dsl import pipeline\n", + "from azureml.core import Workspace\n", + "\n", + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential not work\n", + " credential = InteractiveBrowserCredential()\n", + "\n", + "try:\n", + " ml_client = MLClient.from_config(credential=credential, path=\"workspace.json\")\n", + "except Exception as ex:\n", + " raise Exception(\n", + " \"Failed to create MLClient from config file. Please modify and then run the above cell with your AzureML Workspace details.\"\n", + " ) from ex\n", + " # ml_client = MLClient(\n", + " # credential=credential,\n", + " # subscription_id=\"\",\n", + " # resource_group_name=\"\",\n", + " # workspace_name=\"\"\n", + " # )\n", + "\n", + "ws = Workspace(\n", + " subscription_id=ml_client.subscription_id,\n", + " resource_group=ml_client.resource_group_name,\n", + " workspace_name=ml_client.workspace_name,\n", + ")\n", + "ml_client" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Which Embeddings Model to use?\n", + "There are currently two supported Embedding options: OpenAI's `text-embedding-ada-002` embedding model or HuggingFace embedding models. Here are some factors that might influence your decision:\n", + "\n", + "#### OpenAI\n", + "OpenAI has [great documentation](https://platform.openai.com/docs/guides/embeddings) on their Embeddings model `text-embedding-ada-002`, it can handle up to 8191 tokens and can be accessed using [Azure OpenAI](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/concepts/models#embeddings-models) or OpenAI directly. If you have an existing Azure OpenAI Instance you can connect it to AzureML, if you don't AzureML provisions a default one for you called `Default_AzureOpenAI`. The main limitation when using `text-embedding-ada-002` is cost/quota available for the model. Otherwise it provides high quality embeddings across a wide array of text domains while being simple to use.\n", + "\n", + "#### HuggingFace\n", + "HuggingFace hosts many different models capable of embedding text into single-dimensional vectors. The [MTEB Leaderboard](https://huggingface.co/spaces/mteb/leaderboard) ranks the performance of embeddings models on a few axis, not all models ranked can be run locally (e.g. `text-embedding-ada-002` is on the list), though many can and there is a range of larger and smaller models. When embedding with HuggingFace the model is loaded locally for inference, this will potentially impact your choice of compute resources.\n", + "\n", + "**NOTE**: The default PromptFlow Runtime does not come with HuggingFace model dependencies installed, Indexes created using HuggingFace embeddings will not work in PromptFlow by default. **Pick OpenAI if you want to use PromptFlow**.\n", + "\n", + "#### For this example, we will be using an OpenAI embedding model\n", + "\n", + "We can use the automatically created `Default_AzureOpenAI` connection.\n", + "\n", + "If you would rather use an existing Azure OpenAI connection then change `aoai_connection_name` below. If you would rather use an existing Azure OpenAI resource, but don't have a connection created, modify `aoai_connection_name` and the details under the `# Create New Connection` code comment, or navigate to the `PromptFlow` section in your AzureML Workspace and use the Connections create UI flow." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "gather": { + "logged": 1688130551200 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "aoai_connection_name = \"Default_AzureOpenAI\"\n", + "aoai_connection_id = None" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azureml.rag.utils.connections import (\n", + " get_connection_by_name_v2,\n", + " create_connection_v2,\n", + ")\n", + "\n", + "try:\n", + " aoai_connection = get_connection_by_name_v2(ws, aoai_connection_name)\n", + "except Exception as ex:\n", + " # Create New Connection\n", + " # Modify the details below to match the `Endpoint` and API key of your AOAI resource, these details can be found in Azure Portal\n", + " raise RuntimeError(\n", + " \"Have you entered your AOAI resource details below? If so, delete me!\"\n", + " )\n", + " target = \"\" # example: 'https://.openai.azure.com/'\n", + " key = \"\"\n", + " apiVersion = \"2023-03-15-preview\"\n", + " if key == \"\":\n", + " raise RuntimeError(f\"Please provide a valid key for the Azure OpenAI service\")\n", + " if target == \"\":\n", + " raise RuntimeError(\n", + " f\"Please provide a valid target for the Azure OpenAI service\"\n", + " )\n", + " if apiVersion == \"\":\n", + " raise RuntimeError(\n", + " f\"Please provide a valid api-version for the Azure OpenAI service\"\n", + " )\n", + " aoai_connection_id = create_connection_v2(\n", + " workspace=ws,\n", + " name=aoai_connection,\n", + " category=\"AzureOpenAI\",\n", + " target=target,\n", + " auth_type=\"ApiKey\",\n", + " credentials={\"key\": key},\n", + " metadata={\"ApiType\": \"azure\", \"ApiVersion\": apiVersion},\n", + " )[\"id\"]\n", + "\n", + "aoai_connection_id = aoai_connection[\"id\"]" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Now that your Workspace has a connection to Azure OpenAI we will make sure the `text-embedding-ada-002` model has been deployed ready for inference. This cell will fail if there is not deployment for the embeddings model, [follow these instructions](https://learn.microsoft.com/en-us/azure/cognitive-services/openai/how-to/create-resource?pivots=web-portal#deploy-a-model) to deploy a model with Azure OpenAI." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688130554324 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azureml.rag.utils.deployment import infer_deployment\n", + "\n", + "aoai_embedding_model_name = \"text-embedding-ada-002\"\n", + "try:\n", + " aoai_embedding_deployment_name = infer_deployment(\n", + " aoai_connection, aoai_embedding_model_name\n", + " )\n", + " print(\n", + " f\"Deployment name in AOAI workspace for model '{aoai_embedding_model_name}' is '{aoai_embedding_deployment_name}'\"\n", + " )\n", + "except Exception as e:\n", + " print(\n", + " f\"Deployment name in AOAI workspace for model '{aoai_embedding_model_name}' is not found.\"\n", + " )\n", + " if \"ResourceId\" in aoai_connection[\"properties\"][\"metadata\"]:\n", + " aoai_resource_url = f\"https://portal.azure.com/resource/{aoai_connection['properties']['metadata']['ResourceId']}/overview\"\n", + " print(\n", + " f\"Please create a deployment for this model by following the deploy instructions on the resource page: {aoai_resource_url}\"\n", + " )\n", + " else:\n", + " print(\n", + " f\"Please create a deployment for this model by following the deploy instructions on the resource page for '{aoai_connection['properties']['target']}' in Azure Portal.\"\n", + " )" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Finally we will combine the deployment and model information into a uri form which the AzureML embeddings components expect as input." + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "gather": { + "logged": 1688130562511 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "embeddings_model_uri = f\"azure_open_ai://deployment/{aoai_embedding_deployment_name}/model/{aoai_embedding_model_name}\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Setup Pipeline to process data into Index\n", + "AzureML [Pipelines](https://learn.microsoft.com/en-us/azure/machine-learning/concept-ml-pipelines?view=azureml-api-2) connect together multiple [Components](https://learn.microsoft.com/en-us/azure/machine-learning/concept-component?view=azureml-api-2). Each Component defines inputs, code that consumes the inputs and outputs produced from the code. Pipelines themselves can have inputs, and outputs produced by connecting together individual sub Components. To process your data for embedding and indexing we will chain together multiple components each performing their own step of the workflow.\n", + "\n", + "The Components are published to a [Registry](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-manage-registries?view=azureml-api-2&tabs=cli), azureml, which should have access to after signing up to the Generative AI Private Preview, it can be accessed from any Workspace as long as your Tenant has been granted access. In the below cell we get the Component Definitions from the azureml registry." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "gather": { + "logged": 1688130558073 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "ml_registry = MLClient(credential=credential, registry_name=\"azureml\")\n", + "\n", + "# Clones git repository to output folder of pipeline, by default this will be on the default Workspace Datastore `workspaceblobstore`\n", + "git_clone_component = ml_registry.components.get(\"llm_rag_git_clone\", label=\"latest\")\n", + "# Walks input folder according to provided glob pattern (all files by default: '**/*') and attempts to open them, extract text chunks and further chunk if necessary to fir within provided `chunk_size`.\n", + "crack_and_chunk_component = ml_registry.components.get(\n", + " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", + ")\n", + "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", + ")\n", + "# # Reads an input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and pushes all documents (chunk, metadata, embedding_vector) into an FAISS index. Writes an MLIndex yaml detailing the index and embeddings model information.\n", + "create_faiss_index_component = ml_registry.components.get(\n", + " \"llm_rag_create_faiss_index\", label=\"latest\"\n", + ")\n", + "# Takes a uri to a storage location where an MLIndex yaml is stored and registers it as an MLIndex Data asset in the AzureML Workspace.\n", + "register_mlindex_component = ml_registry.components.get(\n", + " \"llm_rag_register_mlindex_asset\", label=\"latest\"\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Each Component has documentation which provides an overall description of the Components purpose and each of the inputs/outputs. For example we can see understand what `crack_and_chunk` does by inspecting the Component definition." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688165103745 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "crack_and_chunk_component" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Below a Pipeline is built by defining a python function which chains together the above components inputs and outputs. Arguments to the function are inputs to the Pipeline itself and the return value is a dictionary defining the outputs of the Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "gather": { + "logged": 1688130563850 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azure.ai.ml.entities._job.pipeline._io import PipelineInput\n", + "from typing import Optional\n", + "\n", + "\n", + "def use_automatic_compute(component, instance_count=1, instance_type=\"Standard_E8s_v3\"):\n", + " \"\"\"Configure input `component` to use automatic compute with `instance_count` and `instance_type`.\n", + "\n", + " This avoids the need to provision a compute cluster to run the component.\n", + " \"\"\"\n", + " component.set_resources(\n", + " instance_count=instance_count,\n", + " instance_type=instance_type,\n", + " properties={\"compute_specification\": {\"automatic\": True}},\n", + " )\n", + " return component\n", + "\n", + "\n", + "def optional_pipeline_input_provided(input: Optional[PipelineInput]):\n", + " \"\"\"Checks if optional pipeline inputs are provided.\"\"\"\n", + " return input is not None and input._data is not None\n", + "\n", + "\n", + "# If you have an existing compute cluster you want to use instead of automatic compute, uncomment the following line, replace `dedicated_cpu_compute` with the name of your cluster.\n", + "# Also comment out the `component.set_resources` line in `use_automatic_compute` above and the `default_compute='serverless'` line below.\n", + "# @pipeline(compute=dedicated_cpu_compute)\n", + "@pipeline(default_compute=\"serverless\")\n", + "def urifolder_to_faiss(\n", + " input_data: Input,\n", + " embeddings_model: str,\n", + " asset_name: str,\n", + " data_source_glob: str = None,\n", + " data_source_url: str = None,\n", + " document_path_replacement_regex: str = None,\n", + " chunk_size: int = 1024,\n", + " aoai_connection_id=None,\n", + " embeddings_container=None,\n", + "):\n", + " crack_and_chunk = crack_and_chunk_component(\n", + " input_data=input_data,\n", + " input_glob=data_source_glob,\n", + " chunk_size=chunk_size,\n", + " data_source_url=data_source_url,\n", + " document_path_replacement_regex=document_path_replacement_regex,\n", + " )\n", + " use_automatic_compute(crack_and_chunk)\n", + "\n", + " generate_embeddings = generate_embeddings_component(\n", + " chunks_source=crack_and_chunk.outputs.output_chunks,\n", + " embeddings_container=embeddings_container,\n", + " embeddings_model=embeddings_model,\n", + " )\n", + " use_automatic_compute(generate_embeddings)\n", + " if optional_pipeline_input_provided(aoai_connection_id):\n", + " generate_embeddings.environment_variables[\n", + " \"AZUREML_WORKSPACE_CONNECTION_ID_AOAI\"\n", + " ] = aoai_connection_id\n", + "\n", + " if optional_pipeline_input_provided(embeddings_container):\n", + " # If provided, previous_embeddings is expected to be a URI to an 'embeddings container' folder.\n", + " # Each folder under this folder is generated by a `create_embeddings_component` run and can be reused for subsequent embeddings runs.\n", + " generate_embeddings.outputs.embeddings = Output(\n", + " type=\"uri_folder\", path=f\"{embeddings_container.path}/{{name}}\"\n", + " )\n", + "\n", + " create_faiss_index = create_faiss_index_component(\n", + " embeddings=generate_embeddings.outputs.embeddings,\n", + " )\n", + " use_automatic_compute(create_faiss_index)\n", + " register_mlindex = register_mlindex_component(\n", + " storage_uri=create_faiss_index.outputs.index, asset_name=asset_name\n", + " )\n", + " use_automatic_compute(register_mlindex)\n", + " return {\n", + " \"mlindex_asset_uri\": create_faiss_index.outputs.index,\n", + " \"mlindex_asset_id\": register_mlindex.outputs.asset_id,\n", + " }" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Now we can create the Pipeline Job by calling the `@pipeline` annotated function and providing input arguments. `asset_name` will be used when registering the MLIndex Data Asset produced by the `register_mlindex` component in the pipeline. This is how you can refer to the MLIndex within AzureML. For this job, the input data is an asset of type `URI_FOLDER` that lives in the default Datastore of the AzureML Workspace being used. The folder contains two files:\n", + "\n", + "1. MSFT_FY23Q1_10Q.docx\n", + "2. MSFT_FY23Q2_10Q.docx\n", + "\n", + "These files contain Microsoft's quarterly financial reports for the first and second quarter of the 2023 fiscal year. They are publicly available and are also available in the `data` folder relative to the location of this notebook file. In the below pipeline job, we only use the first one by filtering out the second one by using the glob pattern `**/*[Q1]_10Q.docx`. We do this to demonstrate the incremental embedding capability. In a later run, we will include both files and see how it affects the scenario.\n", + "\n", + "Here are screenshots of the two tables from the financial report that our model will be referencing to answer questions.\n", + "\n", + "Q1\n", + "![image-alt-text](data/General_and_administrative_q1.png)\n", + "\n", + "Q2\n", + "![image-alt-text](data/General_and_administrative_q2.png)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688133601533 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "asset_name = \"microsoft-earnings-fy23\"\n", + "data_source_glob = \"**/*[Q1]_10Q.docx\"\n", + "\n", + "pipeline_job = urifolder_to_faiss(\n", + " input_data=Input(\n", + " type=AssetTypes.URI_FOLDER, path=\"data/\"\n", + " ), # This will upload the data folder to the default Workspace Datastore `workspaceblobstore`\n", + " data_source_glob=data_source_glob,\n", + " embeddings_model=embeddings_model_uri,\n", + " asset_name=asset_name,\n", + " aoai_connection_id=aoai_connection_id,\n", + " embeddings_container=Input(\n", + " type=\"uri_folder\",\n", + " path=f\"azureml://datastores/workspaceblobstore/paths/embeddings/{asset_name}\",\n", + " ),\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "**Note**: By default AzureML Pipelines will reuse the output of previous component Runs when inputs have not changed.\n", + "If you want to rerun the Pipeline every time each time so that any changes to upstream data sources are processed uncomment the below line.\n", + "`pipeline_job.settings.force_rerun = True`. Rerun each time so that the `crack_and_chunk` component isn't cached, if intent is to ingest latest data.\n", + "\n", + "Finally we add some properties to `pipeline_job` which ensure the Index generation progress and final Artifact appear in the PromptFlow Vector Index UI." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# These are added so that in progress index generations can be listed in UI, this tagging is done automatically by UI.\n", + "pipeline_job.properties[\"azureml.mlIndexAssetName\"] = asset_name\n", + "pipeline_job.properties[\"azureml.mlIndexAssetKind\"] = \"faiss\"\n", + "pipeline_job.properties[\"azureml.mlIndexAssetSource\"] = \"Uri Folder\"" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Submit Pipeline\n", + "**In case of any errors see** TROUBLESHOOT.md.\n", + "\n", + "The output of each step in the pipeline can be inspected via the Workspace UI, click the link under 'Details Page' after running the below cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "running_pipeline_job = ml_client.jobs.create_or_update(\n", + " pipeline_job, experiment_name=\"incremental_embedding_with_table\"\n", + ")\n", + "running_pipeline_job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "ml_client.jobs.stream(running_pipeline_job.name)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "### Use Index with langchain\n", + "The Data Asset produced by the AzureML Pipeline above contains a yaml file named `MLIndex` which contains all the information needed to use the FAISS index. For instance if an AOAI deployment was used to embed the documents the details of that deployment and a reference to the secret are there. This allows easy loading of the MLIndex into a langchain retriever. If you have not deployed `gpt-35-turbo` on your Azure OpenAI resource the below cell will fail indicated the `API deployment for this resource does not exist`. Follow the previous instructions for deploying `text-embedding-ada-002` to deploy `gpt-35-turbo`, note the chosen deployment name below and use the same or update it if you choose different one." + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": { + "gather": { + "logged": 1688133704014 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "from azureml.rag.mlindex import MLIndex\n", + "from langchain.chains import RetrievalQA\n", + "from azureml.rag.models import init_llm, parse_model_uri\n", + "\n", + "\n", + "model_config = parse_model_uri(\n", + " \"azure_open_ai://deployment/gpt-35-turbo/model/gpt-35-turbo\"\n", + ")\n", + "model_config[\"api_base\"] = aoai_connection[\"properties\"][\"target\"]\n", + "model_config[\"key\"] = aoai_connection[\"properties\"][\"credentials\"][\"key\"]\n", + "model_config[\"temperature\"] = 0.3" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "gather": { + "logged": 1688133714206 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "\"In the three months ended September 30, 2022, Microsoft's expenses in the 'General and administrative' segment were $1,398 million. As a percentage of the revenue, it was 3%.\"" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever = MLIndex(\n", + " ml_client.data.get(asset_name, label=\"latest\")\n", + ").as_langchain_retriever()\n", + "question = \"In the three months ended September 30, 2022, what were the expenses of Microsoft in the 'General and administrative' segment and as a percentage of the revenue?\"\n", + "retriever.get_relevant_documents(question)\n", + "qa = RetrievalQA.from_chain_type(\n", + " llm=init_llm(model_config), chain_type=\"stuff\", retriever=retriever\n", + ")\n", + "qa.run(question)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Amazing! The model was able to successfully retrieve information that was only available in a table in the provided Word document and answer the question accordingly. Following is the snippet of the table for reference." + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": { + "gather": { + "logged": 1688133744982 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "\"The financial information for the three months ended December 31, 2022 is not provided in the given context. The latest financial information available in the context is for the three months ended September 30, 2022. In that period, the expenses of Microsoft in the 'General and administrative' segment were $1,398 million, and as a percentage of revenue, it was 3%.\"" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "question = \"In the three months ended December 31, 2022, what were the expenses of Microsoft in the 'General and administrative' segment and as a percentage of the revenue?\"\n", + "retriever.get_relevant_documents(question)\n", + "qa = RetrievalQA.from_chain_type(\n", + " llm=init_llm(model_config), chain_type=\"stuff\", retriever=retriever\n", + ")\n", + "qa.run(question)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "Note from the response that the model is able to retrieve the closest document to answer the question and is smart enough to determine that it doesn't have the requested information. Now let's give it more information and see it reacts to the same question. To do so, we update the `data_source_glob` to `**/*[Q12]_10Q.docx` so that it matches both Word documents." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1688134097039 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "data_source_glob = \"**/*[Q12]_10Q.docx\"\n", + "pipeline_job = urifolder_to_faiss(\n", + " input_data=Input(\n", + " type=AssetTypes.URI_FOLDER,\n", + " path=\"azureml://datastores/workspaceblobstore/paths/msft_earnings_fy23\",\n", + " ),\n", + " data_source_glob=data_source_glob,\n", + " embeddings_model=embeddings_model_uri,\n", + " asset_name=asset_name,\n", + " aoai_connection_id=aoai_connection_id,\n", + " embeddings_container=Input(\n", + " type=\"uri_folder\",\n", + " path=f\"azureml://datastores/workspaceblobstore/paths/embeddings/{asset_name}\",\n", + " ),\n", + ")\n", + "\n", + "running_pipeline_job = ml_client.jobs.create_or_update(\n", + " pipeline_job, experiment_name=\"incremental_embedding_with_table\"\n", + ")\n", + "pipeline_job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "ml_client.jobs.stream(running_pipeline_job.name)" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "gather": { + "logged": 1688134924467 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "\"In the three months ended December 31, 2022, Microsoft's General and administrative expenses were $2,337 million and represented 4% of the revenue.\"" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "retriever = MLIndex(\n", + " ml_client.data.get(asset_name, label=\"latest\")\n", + ").as_langchain_retriever()\n", + "retriever.get_relevant_documents(question)\n", + "question = \"In the three months ended December 31, 2022, what were the expenses of Microsoft in the 'General and administrative' segment and as a percentage of the revenue?\"\n", + "qa = RetrievalQA.from_chain_type(\n", + " llm=init_llm(model_config), chain_type=\"stuff\", retriever=retriever\n", + ")\n", + "qa.run(question)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "This time, when asked the same question, the model was able to answer the question correctly because our new index contained the information about the second quarter financial data. \n", + "\n", + "Something that's not visible to the eye but happens in the backend is incremental embedding. What this means is that, during the second MLIndex creation, we don't re-embed the files that were already embedded during the first MLIndex creation. This can be verified from the user logs of the `LLM - Generate Embeddings Parallel` component of the corresponding job. Here is a snippet of it that shows the embedding of the first quarter being skipped.\n", + "\n", + "`[2023-06-30 14:04:46] INFO azureml.rag.azureml.rag.embeddings - Processing document: MSFT_FY23Q1_10Q.docx0 (embeddings.py:646)\n", + "INFO:azureml.rag.azureml.rag.embeddings:Processing document: MSFT_FY23Q1_10Q.docx0`\n", + "\n", + "`[2023-06-30 14:04:46] INFO azureml.rag.azureml.rag.embeddings - Skip embedding document MSFT_FY23Q1_10Q.docx0 as it has not been modified since last embedded (embeddings.py:670)`\n", + "\n", + "The benefit of this is that it makes embedding generation really fast and it is very noticeable and most helpful when you have a large number of files.\n", + "\n", + "\n" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python310-sdkv2" + }, + "kernelspec": { + "display_name": "Python 3.10 - SDK v2", + "language": "python", + "name": "python310-sdkv2" + }, + "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.10.10" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sdk/python/generative-ai/rag/notebooks/mlindex_with_testgen_autoprompt.ipynb b/sdk/python/generative-ai/rag/notebooks/mlindex_with_testgen_autoprompt.ipynb index b135cce934..c6a2132070 100644 --- a/sdk/python/generative-ai/rag/notebooks/mlindex_with_testgen_autoprompt.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/mlindex_with_testgen_autoprompt.ipynb @@ -7,7 +7,7 @@ "outputs": [], "source": [ "%pip install azure-ai-ml\n", - "%pip install -U 'azureml-rag[faiss]>=0.1.11'" + "%pip install -U 'azureml-rag[faiss]>=0.1.14'" ] }, { @@ -193,7 +193,7 @@ "\n", "\n", "aoai_embedding_model_name = \"text-embedding-ada-002\"\n", - "aoai_completion_model_name = \"text-davinci-003\"\n", + "aoai_completion_model_name = \"gpt-35-turbo\"\n", "\n", "aoai_embedding_deployment_name = deployment_infer(aoai_embedding_model_name)\n", "print(\n", @@ -251,8 +251,8 @@ " \"llm_rag_crack_and_chunk\", label=\"latest\"\n", ")\n", "# Reads input folder of files containing chunks and their metadata as batches, in parallel, and generates embeddings for each chunk. Output format is produced and loaded by `azureml.rag.embeddings.EmbeddingContainer`.\n", - "generate_embeddings_parallel_component = ml_registry.components.get(\n", - " \"llm_rag_generate_embeddings_parallel\", label=\"latest\"\n", + "generate_embeddings_component = ml_registry.components.get(\n", + " \"llm_rag_generate_embeddings\", label=\"latest\"\n", ")\n", "# Reads input folder produced by `azureml.rag.embeddings.EmbeddingsContainer.save()` and inserts all documents (chunk, metadata, embedding_vector) int a Faiss index and in-memory document store. Writes an MLIndex yaml detailing the index and embeddings model information.\n", "create_faiss_index_component = ml_registry.components.get(\n", @@ -379,11 +379,11 @@ " )\n", " use_automatic_compute(crack_and_chunk)\n", "\n", - " generate_embeddings = generate_embeddings_parallel_component(\n", + " generate_embeddings = generate_embeddings_component(\n", " chunks_source=crack_and_chunk.outputs.output_chunks,\n", " embeddings_model=embeddings_model,\n", " )\n", - " use_automatic_compute(generate_embeddings, instance_count=2)\n", + " use_automatic_compute(generate_embeddings)\n", " use_aoai_connection(generate_embeddings, aoai_connection_id)\n", "\n", " create_faiss_index = create_faiss_index_component(\n", diff --git a/sdk/python/generative-ai/rag/notebooks/qa_data_generation.ipynb b/sdk/python/generative-ai/rag/notebooks/qa_data_generation.ipynb index 9c713c6544..ad43d01fce 100644 --- a/sdk/python/generative-ai/rag/notebooks/qa_data_generation.ipynb +++ b/sdk/python/generative-ai/rag/notebooks/qa_data_generation.ipynb @@ -8,7 +8,7 @@ "outputs": [], "source": [ "%pip install azure-ai-ml\n", - "%pip install -U 'azureml-rag[faiss]>=0.1.11'" + "%pip install -U 'azureml-rag[faiss]>=0.1.14'" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/automl-classification-task-bankmarketing-serverless.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/automl-classification-task-bankmarketing-serverless.ipynb index 375134bee1..c01ecadaab 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/automl-classification-task-bankmarketing-serverless.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-classification-task-bankmarketing/automl-classification-task-bankmarketing-serverless.ipynb @@ -9,8 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- This notebook leverages **serverless compute** to run the job. There is no need for user to create and manage compute. \n", + "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section\n", "\n", @@ -18,7 +17,7 @@ "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML classification Job` with the 'classification()' factory-fuction.\n", - "- Train the model using AmlCompute by submitting/running the AutoML training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML training job\n", "- Obtaing the model and score predictions with it\n", "- Leverage the auto generated training code and use it for retraining on an updated dataset\n", "\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/automl-forecasting-distributed-tcn.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/automl-forecasting-distributed-tcn.ipynb new file mode 100644 index 0000000000..661695d272 --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/automl-forecasting-distributed-tcn.ipynb @@ -0,0 +1,1352 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "tags": [] + }, + "source": [ + "# Automated Machine Learning\n", + "\n", + "## Demand Forecasting Using Many Models (preview)\n", + "\n", + "> [!IMPORTANT]\n", + "> Items marked (preview) in this article are currently in public preview.\n", + "> The preview version is provided without a service level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities.\n", + "> For more information, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/).\n", + "\n", + "## Contents\n", + "1. [Introduction](#Introduction)\n", + "1. [Setup](#Setup)\n", + "1. [Compute](#Compute)\n", + "1. [Data](#Data)\n", + "1. [Train AutoML Model](#Train)\n", + "1. [Import Components From Registry](#ImportComponents)\n", + "1. [Create a Pipeline](#Pipeline)\n", + "1. [Kick Off Pipeline Runs](#PipelineRun)\n", + "1. [Download Output](#DownloadOutput)\n", + "1. [Compare Evaluation Results](#CompareResults)\n", + "1. [Deployment](#Deployment)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Introduction \n", + "\n", + "The objective of this notebook is to illustrate how to use the component-based AutoML single model solution. It walks you through all stages of model evaluation and production process starting with data ingestion and concluding with batch endpoint deployment for production. In this tutorial we will illustrate how to leverage AutoML and train a destributed TCN model ([link](placeholder)). However, the same notebook can be used to train a non-distributed TCN as well as the conventional ML models.\n", + "\n", + "We use a subset of UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)) with the objective of predicting electricity demand per consumer 24 hours ahead. The data was preprocessed using the [data prep notebook](https://github.com/Azure/azureml-examples/blob/main/v1/python-sdk/tutorials/automl-with-azureml/forecasting-data-preparation/auto-ml-forecasting-data-preparation.ipynb). Please refer to it for illustration on how to download the data from the source, aggregate to an hourly frequency, convert from wide to long format and upload to the Datastore. Here, we will work with the data that has been pre-processed and saved locally in the parquet format.\n", + "\n", + "There are a number of steps you need to take before you can put a model into production. A user needs to prepare the data, partition it into appropriate sets, select the best model, evaluate it against a baseline, and monitor the model in real life to collect enough observations on how it would perform had it been put in production. Some of these steps are time consuming, some require certain expertise in writing code. The steps shown in this notebook follow a typical thought process one follows before the model is put in production.\n", + "\n", + "Make sure you have executed the [configuration](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) before running this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setup " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1682992408484 + } + }, + "outputs": [], + "source": [ + "# Import required libraries\n", + "import os\n", + "import datetime\n", + "import json\n", + "import yaml\n", + "import azure.ai.ml\n", + "\n", + "import pandas as pd\n", + "\n", + "from time import sleep\n", + "\n", + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "from azure.ai.ml import MLClient, Input, Output\n", + "from azure.ai.ml import load_component\n", + "from azure.ai.ml import automl\n", + "from azure.ai.ml.constants import AssetTypes\n", + "from azure.ai.ml.dsl import pipeline\n", + "from azure.ai.ml.entities import (\n", + " BatchEndpoint,\n", + " BatchDeployment,\n", + " AmlCompute,\n", + " PipelineComponentBatchDeployment,\n", + ")\n", + "from azure.ai.ml.entities._job.automl.tabular.forecasting_settings import (\n", + " ForecastingSettings,\n", + ")\n", + "\n", + "print(f\"SDK version: {azure.ai.ml.__version__}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1. Configure workspace details and get a handle to the workspace\n", + "\n", + "The [workspace](https://docs.microsoft.com/en-us/azure/machine-learning/concept-workspace) is the top-level resource for Azure Machine Learning, providing a centralized place to work with all the artifacts you create when you use Azure Machine Learning. In this section we will connect to the workspace in which the job will be run.\n", + "\n", + "To connect to a workspace, we need identifier parameters - a subscription, resource group and workspace name. We will use these details in the `MLClient` from `azure.ai.ml` to get a handle to the required Azure Machine Learning workspace. We use the default [default azure authentication](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python) for this tutorial. Check the [configuration notebook](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) for more details on how to configure credentials and connect to a workspace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential does not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ml_client = MLClient.from_config(credential)\n", + "except Exception as ex:\n", + " print(ex)\n", + " # Enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace)\n", + " print(ml_client)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2. Show Azure ML Workspace information" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ws = ml_client.workspaces.get(name=ml_client.workspace_name)\n", + "\n", + "output = {}\n", + "output[\"Workspace\"] = ml_client.workspace_name\n", + "output[\"Subscription ID\"] = ml_client.connections._subscription_id\n", + "output[\"Resource Group\"] = ws.resource_group\n", + "output[\"Location\"] = ws.location\n", + "pd.DataFrame(data=output, index=[\"\"]).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compute \n", + "\n", + "#### Create or Attach existing AmlCompute\n", + "\n", + "You will need to create a compute target for your AutoML run. In this tutorial, you will create AmlCompute as your training compute resource.\n", + "\n", + "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist.\n", + "\n", + "\n", + "Here, we use a 10 node cluster of the `STANDARD_NC6s_v3` series for illustration purposes. You will need to adjust the compute type and the number of nodes based on your needs which can be driven by the speed needed for model selection, data size, etc. \n", + "\n", + "#### Creation of AmlCompute takes approximately 5 minutes. \n", + "If the AmlCompute with that name is already in your workspace, this code will skip the creation process.\n", + "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.core.exceptions import ResourceNotFoundError\n", + "\n", + "amlcompute_cluster_name = \"distributed-tcn-cluster\"\n", + "\n", + "try:\n", + " # Retrieve an already attached Azure Machine Learning Compute.\n", + " compute_target = ml_client.compute.get(amlcompute_cluster_name)\n", + "except ResourceNotFoundError as e:\n", + " compute_target = AmlCompute(\n", + " name=amlcompute_cluster_name,\n", + " size=\"Standard_NC6s_v3\",\n", + " type=\"amlcompute\",\n", + " min_instances=0,\n", + " max_instances=10,\n", + " idle_time_before_scale_down=600,\n", + " # vm_priority=\"LowPriority\"\n", + " )\n", + " poller = ml_client.begin_create_or_update(compute_target)\n", + " poller.wait()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Data \n", + "\n", + "For illustration purposes we use the UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)). The original dataset contains electricity consumption data for 370 consumers measured at 15 minute intervals. In the data set for this demonstrations, we have aggregated to an hourly frequency and convereted to the kilowatt hours (kWh) for 10 customers. Each customer is assigned to one of the two groups as denoted by the entries in the `group_id` column. The following cells read and print the first few rows of the training data as well as print the number of unique time series in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_column_name = \"datetime\"\n", + "target_column_name = \"usage\"\n", + "time_series_id_column_names = [\"group_id\", \"customer_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset_type = \"train\"\n", + "df = pd.read_parquet(f\"./data/{dataset_type}/uci_electro_small_{dataset_type}.parquet\")\n", + "df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nseries = df.groupby(time_series_id_column_names).ngroups\n", + "print(f\"Data contains {nseries} individual time-series\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[time_series_id_column_names].drop_duplicates()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please note that the data used in this experiment is of the Azure Machine Learning Tables (`MLTable`) format. This allows for the creation of a *blueprint* that defines how to load data files into memory as a Pandas or Spark data frame. See the following [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-mltable?view=azureml-api-2&tabs=cli) on more inforamtion on this topic. For documentation on creating your own MLTable assets for jobs beyond this notebook:\n", + "\n", + "- https://learn.microsoft.com/en-us/azure/machine-learning/reference-yaml-mltable details how to write MLTable YAMLs (required for each MLTable asset).\n", + "- https://learn.microsoft.com/en-us/azure/machine-learning/how-to-create-data-assets?tabs=Python-SDK covers how to work with them in the v2 CLI/SDK.\n", + "\n", + "Next, we upload the directory with the train, validation and test set data which will be used in this notebook." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Training MLTable defined locally, with local data to be uploaded\n", + "train_dataset = Input(type=AssetTypes.MLTABLE, path=\"./data/train\")\n", + "valid_dataset = Input(type=AssetTypes.MLTABLE, path=\"./data/valid\")\n", + "test_dataset = Input(type=AssetTypes.URI_FOLDER, path=\"./data/test\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Train Distributed TCN \n", + " \n", + "In this section we will configure and run the AutoML job to train the model." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.1 Configure the AutoML Job\n", + "\n", + "First, we create a set of parameters which will be used to define the `forecasting()` factory function to kick off the model training. Think of this as the bare minimum settings that are necessary to define an AutoML job, and it contains the following properties:\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **task** | forecasting |\n", + "| **target_column_name** | The name of the column to target for predictions. It must always be specified. This parameter is applicable to `training_data`, `validation_data` and `test_data`. |\n", + "| **primary_metric** | This is the metric that you want to optimize. Forecasting supports the following primary metrics
  • `normalized_root_mean_squared_error`
  • `normalized_mean_absolute_error`
  • `spearman_correlation`
  • `r2_score`
We recommend using either the normalized root mean squared error (default metric) or normalized mean absolute error as a primary metric because they measure forecast accuracy. See the [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-automl-forecasting-faq#how-do-i-choose-the-primary-metric) for a more detailed discussion on this topic. |\n", + "\n", + "Please note that the `forecasting()` function also requires a training and/or validation data. We will provide this is section 5.2." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# automl settings\n", + "task = \"forecasting\"\n", + "target_column_name = target_column_name\n", + "primary_metric = \"normalized_root_mean_squared_error\"" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we define the forecasting specific parameters for the experiment. Technically, there are only 2 parameters that are necessary for forecasting tasks (`forecast_horizon` and `time_column_name`). For a greater control over the experiment we also list optional parameters that users can set, they are marked with an asterisk $(*)$ in the table below. See the [forecast settings API doc](https://learn.microsoft.com/en-us/python/api/azure-ai-ml/azure.ai.ml.automl.forecastingjob#azure-ai-ml-automl-forecastingjob-set-forecast-settings) for a complete list of available parameters.\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **time_column_name** | The name of the time column in the data. |\n", + "| **forecast_horizon** | The forecast horizon is how many periods forward you would like to forecast. This integer horizon is in units of the timeseries frequency (e.g. daily, weekly). |\n", + "| **time_series_id_column_names*** | The column names used to uniquely identify the time series in data that has multiple rows with the same timestamp. If the time series identifiers are not defined, AutoML will detect them for you. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# forecast settings\n", + "forecast_horizon = 24\n", + "time_column_name = time_column_name\n", + "time_series_id_column_names = time_series_id_column_names" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we set parameters to configure limits such as timeouts, number of trails, etc.\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **timeout_minutes** | Maximum amount of time in minutes that the whole AutoML job can take before the job terminates. This timeout includes setup, featurization and training runs but does not include the ensembling and model explainability runs at the end of the process since those actions need to happen once all the trials (children jobs) are done. If not specified, the default job's total timeout is 6 days (8,640 minutes). To specify a timeout less than or equal to 1 hour (60 minutes), make sure your dataset's size is not greater than 10,000,000 (rows times column) or an error results. |\n", + "| **max_trials** | Represents the maximum number of trials an Automated ML job can try to run a training algorithm with different combination of hyperparameters. Its default value is set to 1000. If `enable_early_termination` is defined, then the number of trials used to run training algorithms can be smaller. |\n", + "| **max_concurrent_trials** | The maximum number of trials (children jobs) that would be executed in parallel. It's highly recommended to set the number of concurrent runs to the number of nodes in the cluster (aml compute defined in `compute`). The default value is 1. |\n", + "| **max_nodes** | Maximum number of nodes to use in training. This value should be set only for the distirbuted TCN training. We encourage this value to be a multiple of max_concurrent_iterations. The multiple indicates the number of nodes that will be used by each concurrent iteration. Minimum acceptable value to kick off distributed training is 2. |\n", + "| **enable_early_termination** | Represents whether to enable of experiment termination if the loss score doesn't improve after 'x' number of iterations. In an Automated ML job, no early stopping is applied on first 20 iterations. The early stopping window starts only after first 20 iterations. The default value is `True`. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# training limits\n", + "timeout_minutes = 60\n", + "max_concurrent_trials = 5\n", + "max_trials = 15\n", + "max_nodes = 10\n", + "enable_early_termination = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, we set parameters to configure training parameters such as enabling DNN and blocking/alowing specific models.\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **enable_dnn_training** | A flag to turn on or off the inclusion of DNN based models to try out during model selection. The default value is `False`. |\n", + "| **training_mode** |The training mode to use. The possible values are `distributed` and `non_distributed` (default value). When this parameter is set to `distributed` and `enablle_dnn_training=True`, a disitributed TCN run will be kicked off. |\n", + "| **allowed_training_algorithms** | A list of Time Series Forecasting algorithms to try out as base model for model training in an experiment. If it is omitted or set to `None`, then all supported algorithms are used during experiment, except algorithms specified in `blocked_training_algorithms`. The default value is `None`. |\n", + "| **blocked_training_algorithms** | A list of Time Series Forecasting algorithms to not run as base model while model training in an experiment. If it is omitted or set to `None`, then all supported algorithms are used during model training. The default value is `None`.|\n", + "| **enable_model_explainability** | Represents a flag to turn on model explainability like feature importance, of best model evaluated by Automated ML system. The default value is `True`. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# training settings\n", + "enable_dnn_training = True\n", + "training_mode = \"distributed\"\n", + "allowed_training_algorithms = [\"TCNForecaster\"]\n", + "blocked_training_algorithms = None\n", + "enable_model_explainability = True" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.2. Create the AutoML Forecasting Job" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# -- 5.2.1. Create forecasting job\n", + "training_job = automl.forecasting(\n", + " compute=amlcompute_cluster_name,\n", + " training_data=Input(type=\"uri_folder\", path=\"./data/train\"),\n", + " validation_data=Input(type=\"uri_folder\", path=\"./data/valid\"),\n", + " target_column_name=target_column_name,\n", + " primary_metric=primary_metric,\n", + " enable_model_explainability=enable_model_explainability,\n", + " outputs={\"best_model\": Output(type=AssetTypes.CUSTOM_MODEL)},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# -- 5.2.2 Define forecasting settings\n", + "training_job.set_forecast_settings(\n", + " forecast_horizon=forecast_horizon,\n", + " time_column_name=time_column_name,\n", + " time_series_id_column_names=time_series_id_column_names,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# -- 5.2.3 Set training parameters\n", + "training_job.set_training(\n", + " enable_dnn_training=enable_dnn_training,\n", + " training_mode=training_mode,\n", + " enable_model_explainability=enable_model_explainability,\n", + " allowed_training_algorithms=allowed_training_algorithms,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# -- 5.2.4 Set training limits\n", + "training_job.set_limits(\n", + " timeout_minutes=timeout_minutes,\n", + " max_trials=max_trials,\n", + " max_concurrent_trials=max_concurrent_trials,\n", + " max_nodes=max_nodes,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.3. Train the AutoML model" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Submit the AutoML job\n", + "returned_job = ml_client.jobs.create_or_update(training_job)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Wait until AutoML training runs are finished\n", + "ml_client.jobs.stream(returned_job.name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.4. Download Best Model's Artifacts\n", + "\n", + "Next, we download the best TCN model's artifacts which will be used in the evaluation pipeline and batch deployment.\n", + "\n", + "##### Obtain the tracking URI for MLFlow" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import mlflow\n", + "\n", + "# Obtain the tracking URL from MLClient\n", + "MLFLOW_TRACKING_URI = ml_client.workspaces.get(\n", + " name=ml_client.workspace_name\n", + ").mlflow_tracking_uri\n", + "\n", + "print(MLFLOW_TRACKING_URI)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Set the MLFLOW TRACKING URI\n", + "\n", + "mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)\n", + "\n", + "print(\"\\nCurrent tracking uri: {}\".format(mlflow.get_tracking_uri()))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "local_dir = \"./artifact_downloads\"\n", + "os.makedirs(local_dir, exist_ok=True)\n", + "\n", + "for child in ml_client.jobs.list(parent_job_name=returned_job.name):\n", + " print(f\"{child.name}\\n---\")\n", + " if \"_HD\" in child.name:\n", + " print(f'Best child run ID: {child.properties[\"best_child_run_id\"]}\\n---')\n", + " # Download best run's artifacts/outputs\n", + " local_path = mlflow.artifacts.download_artifacts(\n", + " run_id=child.properties[\"best_child_run_id\"],\n", + " artifact_path=\"outputs\",\n", + " dst_path=local_dir,\n", + " )\n", + " break" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Import Components From Registry
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "An Azure Machine Learning component is a self-contained piece of code that does one step in a machine learning pipeline. A component is analogous to a function - it has a name, inputs, outputs, and a body. Components are the building blocks of the Azure Machine Learning pipelines. It's a good engineering practice to build a machine learning pipeline where each step has well-defined inputs and outputs. In Azure Machine Learning, a component represents one reusable step in a pipeline. Components are designed to help improve the productivity of pipeline building. Specifically, components offer:\n", + "\n", + "- Well-defined interface: Components require a well-defined interface (input and output). The interface allows the user to build steps and connect steps easily. The interface also hides the complex logic of a step and removes the burden of understanding how the step is implemented.\n", + "\n", + "- Share and reuse: As the building blocks of a pipeline, components can be easily shared and reused across pipelines, workspaces, and subscriptions. Components built by one team can be discovered and used by another team.\n", + "\n", + "- Version control: Components are versioned. The component producers can keep improving components and publish new versions. Consumers can use specific component versions in their pipelines. This gives them compatibility and reproducibility.\n", + "\n", + "For a more detailed information on this subject, refer to the this [link](https://learn.microsoft.com/en-us/azure/machine-learning/concept-component?view=azureml-api-2).\n", + "\n", + "To import components, we need to get the registry. The following command obtains the public regsitry from which we will import components for our experiment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# get registry for the inference component\n", + "ml_client_registry = MLClient(credential=credential, registry_name=\"azureml\")\n", + "print(ml_client_registry)\n", + "print(\"---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we pull specific components and use them to build a pipeline of steps. For the illustration of the product evaluation workflow we will use the following components:\n", + "\n", + "- Inference componnet: generates forecast for each partition. This can be done on the test and inference sets.\n", + "- Compute metrics component: calculates metrics per time series if the inference component was used on a test set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "inference_component = ml_client_registry.components.get(\n", + " name=\"automl_forecasting_inference\", label=\"latest\"\n", + ")\n", + "print(f\"Inference component version: {inference_component.version}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "compute_metrics_component = ml_client_registry.components.get(\n", + " name=\"compute_metrics\",\n", + " version=\"0.0.10\", # label=\"latest\"\n", + ")\n", + "print(f\"Compute metrics component version: {compute_metrics_component.version}\\n---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Build an evaluation pipeline \n", + "\n", + "Now that we imported the components we will build an evaluation pipeline. This pipeline will allow us to genererate rolling forecast on the test set, and calculate metrics on the test set output.\n", + "\n", + "### 7.1. Set Pipeline Parameters\n", + "\n", + "AzureML components can only receive specific object types such as strings, JSON/YML files, URI Folders and URI Files. Other object types are not accepted. Because of this, we will create the pipeline by utilizing the `pipeline_parameters` dictionary. Most of the parameters in this dictionary will define the settings for the model training step of the pipeline and the remaining ones will be used in inference and compute metrics components. To have a better understanding of what these settings represents, we will build this dictionary in sequential steps. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we set declare the parameters that will be used be the inference and compute metrics components.\n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **forecast_mode** | Type of forecat to perform on the test set. Can be `recursive` or `rolling`. Rolling forecast can be used for the evaluation purpose. The default value is `recursive`. |\n", + "| **forecast_step** | The forecast step used for rolling forecast. See the following [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-auto-train-forecast?view=azureml-api-2#evaluating-model-accuracy-with-a-rolling-forecast) for more details. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pipeline_parameters = dict(forecast_mode=\"rolling\", forecast_step=24)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@pipeline(\n", + " description=\"AutoML Forecasting TCN Evaluation Pipeline\",\n", + ")\n", + "def evaluation_pipeline(\n", + " inference_data: Input(type=AssetTypes.MLTABLE),\n", + " model_path: Input(type=AssetTypes.MLFLOW_MODEL),\n", + "):\n", + " # 0. Extract pipeline parameters from the dictionary\n", + " forecast_mode = pipeline_parameters.get(\"forecast_mode\", \"recursive\")\n", + " forecast_step = pipeline_parameters.get(\"forecast_step\", 1)\n", + "\n", + " # 1. Inferencing step\n", + " inference_node = inference_component(\n", + " test_data=inference_data,\n", + " model_path=model_path,\n", + " target_column_name=target_column_name,\n", + " forecast_mode=forecast_mode,\n", + " forecast_step=forecast_step,\n", + " )\n", + "\n", + " # 3. Metrics calculation step\n", + " compute_metrics_node = compute_metrics_component(\n", + " task=\"tabular-forecasting\",\n", + " prediction=inference_node.outputs.inference_output_file,\n", + " ground_truth=inference_node.outputs.inference_output_file,\n", + " evaluation_config=inference_node.outputs.evaluation_config_output_file,\n", + " )\n", + " compute_metrics_node.compute = (\n", + " amlcompute_cluster_name # compute_name # amlcompute_cluster_name\n", + " )\n", + "\n", + " # 4. Specify pipeline outputs\n", + " return {\n", + " \"output_files\": compute_metrics_node.outputs.evaluation_result,\n", + " \"forecast_output\": inference_node.outputs.inference_output_file,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Kick Off the Evaluation Pipeline Run \n", + " \n", + "Now that the pipeline is defined, we will use it to kick off an experiment which will inference and evaluate the performance for the best AutoML model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline_job = evaluation_pipeline(\n", + " inference_data=Input(type=AssetTypes.URI_FOLDER, path=\"./data/test\"),\n", + " model_path=Input(\n", + " type=AssetTypes.MLFLOW_MODEL, path=\"./artifact_downloads/outputs/mlflow-model\"\n", + " ),\n", + ")\n", + "print(pipeline_job)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# set pipeline level compute\n", + "pipeline_job.settings.default_compute = amlcompute_cluster_name" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "experiment_name = \"tcn-evaluation-\" + datetime.datetime.now().strftime(\"%Y%m%d\")\n", + "\n", + "pipeline_submitted_job = ml_client.jobs.create_or_update(\n", + " pipeline_job,\n", + " experiment_name=experiment_name,\n", + ")\n", + "ml_client.jobs.stream(pipeline_submitted_job.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rehydrate run\n", + "# RUN_ID = \"\"\n", + "# pipeline_submitted_job = ml_client.jobs.get(RUN_ID)\n", + "# pipeline_submitted_job" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 9. Download Pipeline Output \n", + " \n", + "Next, we will download the output files generated by the compute metrics components for each executed pipeline and save them in the corresponfing subfolder of the `output` folder. First, we create corresponding output directories. Then, we execute the `ml_client.jobs.download` command which downloads experiments' outputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create output directories\n", + "automl_output_dir = os.path.join(os.getcwd(), \"output/automl\")\n", + "os.makedirs(automl_output_dir, exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " name=pipeline_submitted_job.name,\n", + " download_path=automl_output_dir,\n", + " output_name=\"output_files\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " name=pipeline_submitted_job.name,\n", + " download_path=automl_output_dir,\n", + " output_name=\"forecast_output\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. Evaluation Results \n", + "\n", + "### 10.1. Examine Metrics\n", + "\n", + "In this section, we compare metrics for the 2 pipeline runs to quantify accuracy improvement of AutoML over the baseline model. First, we compare metrics that are calculated for the entire dataset. Since there are 10 unique time series in the test dataset, these individual metrics are aggregated into a single number. The non-normalized metrics can be misleading due to the difference in scales of each unique time series. The following [article (placeholder)](https://review.learn.microsoft.com/en-us/azure/machine-learning/how-to-understand-automated-ml?view=azureml-api-2&branch=pr-en-us-238443#forecasting-metrics-normalization-and-aggregation) explains this topic in a greater detail.\n", + "\n", + "The code in the next cell loads dataset metrics for each of the experiments." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_artifacts_path = os.path.join(\n", + " \"named-outputs\", \"output_files\", \"evaluationResult\"\n", + ")\n", + "\n", + "with open(os.path.join(automl_output_dir, metrics_artifacts_path, \"metrics.json\")) as f:\n", + " metrics_automl_series = json.load(f)\n", + " metrics_automl = (\n", + " pd.Series(metrics_automl_series).to_frame(name=\"score\").reset_index(drop=False)\n", + " )\n", + "metrics_automl" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 10.1.1. Detailed Metrics\n", + "\n", + "Next, we will load and examine the detailed accuracy metrics since the aggregate metrics may not convey enough information to make a decision about product accuracy. It may be helpful to examine metrics at a more granular level. We will extract metrics per time series. To do this, we create a helper function `extract_specific_metric` which reads the JSON file and returns a specified metric for each time series. Even though the file contains the following metrics, we will we will focus on the normalized root mean squared error (NRMSE) accuracy metric for illustration purposes.
    \n", + "
  • `explained_variance`
  • \n", + "
  • `mean_absolute_error`
  • \n", + "
  • `mean_absolute_percentage_error`
  • \n", + "
  • `median_absolute_error`
  • \n", + "
  • `normalized_median_absolute_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_log_error`
  • \n", + "
  • `r2_score`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
  • `root_mean_squared_error`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_specific_metric(path, metric_name):\n", + " with open(path) as f:\n", + " artifact = json.load(f)\n", + " all_metrics = pd.DataFrame(artifact[\"data\"])\n", + " index_scores = [\"customer_id\"] + [metric_name]\n", + " return all_metrics[index_scores]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_table_relative_path = os.path.join(\n", + " metrics_artifacts_path, \"artifacts\", \"forecast_time_series_id_distribution_table\"\n", + ")\n", + "automl_detailed_metrics = extract_specific_metric(\n", + " os.path.join(automl_output_dir, metrics_table_relative_path),\n", + " \"normalized_root_mean_squared_error\",\n", + ")\n", + "automl_detailed_metrics" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.2. Generate Time Series Plots\n", + "\n", + "Here, we generate forecast versus actuals plot for the test set for both the best model and the baseline. Since we use rolling evaluation with the step size of 24 hours, this mimics the behavior of putting both models in production and monitoring their behavior for the duration of the test set. This step helps you make informed decisions about model performance and saves numerous costs associated with productionalizing the model and monitoring its performance in real life. \n", + "\n", + "In the next block of code, we, load the test set output for each of the runs and merge the data. Then, we generate and save time series plots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "forecast_table_relative_path = os.path.join(\n", + " \"named-outputs\", \"forecast_output\", \"inference_output_file\"\n", + ")\n", + "\n", + "forecast_column_name = \"automl_prediction\"\n", + "actual_column_name = \"automl_actual\"\n", + "forecast_origin_column_name = \"automl_forecast_origin\"\n", + "\n", + "backtest = pd.read_json(\n", + " os.path.join(automl_output_dir, forecast_table_relative_path), lines=True\n", + ")\n", + "print(f\"AutoML backtest table size: {backtest.shape}\\n---\")\n", + "backtest.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from scripts.helper_scripts import draw_one_plot\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib.backends.backend_pdf import PdfPages\n", + "\n", + "plot_filename = \"forecast_vs_actual.pdf\"\n", + "\n", + "pdf = PdfPages(os.path.join(os.getcwd(), \"./output\", plot_filename))\n", + "for _, one_forecast in backtest.groupby(\"customer_id\"):\n", + " one_forecast[time_column_name] = pd.to_datetime(one_forecast[time_column_name])\n", + " one_forecast.sort_values(time_column_name, inplace=True)\n", + " draw_one_plot(\n", + " one_forecast,\n", + " time_column_name,\n", + " target_column_name,\n", + " [\"customer_id\"],\n", + " [actual_column_name, forecast_column_name],\n", + " pdf,\n", + " plot_predictions=True,\n", + " )\n", + "pdf.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "IFrame(os.path.join(\"./output/forecast_vs_actual.pdf\"), width=800, height=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 11. Deployment
\n", + "\n", + "In this section, we will illustrate how to perfrom batch inference using the inference component. Batch endpoints are endpoints that are used to do batch inferencing on large volumes of data in asynchronous way. Batch endpoints receive pointers to data and run jobs asynchronously to process the data in parallel on compute clusters and store outputs to a datastore for further analysis. For more information on batch endpoints see this [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-use-batch-scoring-pipeline?view=azureml-api-2&tabs=python)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.1. Build the pipeline\n", + "\n", + "First, we create a pipeline consisting of one step that invokes the inference componnet. This pipeline takes the inference data set as a parameter, generates a forecast and returns the predictions. The only one named output of this pipeline will be `forecast`. It is a table with predictions, stored in JSONL format. In the current setup, users can generate distribution forecast. To do this, uncomment the `forecast_quantiles` line in the pipeline definition and specify desired quantiles as a string. In the code example below the valuess of 0.1 and 0.9 are entered as `\"0.1,0.9\"`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Define pipeline\n", + "@pipeline(\n", + " description=\"AutoML Inferencing Pipeline\",\n", + ")\n", + "def demand_inference_single_model(\n", + " test_data: Input(type=AssetTypes.MLTABLE),\n", + " model_path: Input(type=AssetTypes.MLFLOW_MODEL),\n", + " target_column_name: Input(type=\"string\"),\n", + " forecast_mode: Input(type=\"string\"),\n", + "):\n", + " inference_node = inference_component(\n", + " test_data=test_data,\n", + " model_path=model_path,\n", + " target_column_name=target_column_name,\n", + " forecast_mode=forecast_mode,\n", + " # forecast_quantiles=\"0.1,0.9\"\n", + " )\n", + " return {\n", + " \"forecast\": inference_node.outputs.inference_output_file,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.2. Create Batch Endpoint\n", + "\n", + "A batch endpoint's name needs to be unique in each region since the name is used to construct the invocation URI. To ensure uniqueness, append any trailing characters to the name specified in the following code." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "import string\n", + "\n", + "# Creating a unique endpoint name by including a random suffix\n", + "allowed_chars = string.ascii_lowercase + string.digits\n", + "endpoint_suffix = \"\".join(random.choice(allowed_chars) for x in range(5))\n", + "endpoint_name = \"sdk-tcn-\" + endpoint_suffix\n", + "\n", + "print(f\"Endpoint name: {endpoint_name}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = BatchEndpoint(\n", + " name=endpoint_name,\n", + " description=\"An endpoint for component deployments\",\n", + " properties={\"ComponentDeployment.Enabled\": True},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the endpoint in the workspace usign the MLClient created earlier. This command will start the endpoint creation and return a confirmation response while the endpoint creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_endpoints.begin_create_or_update(endpoint).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.2. Create the Deployment\n", + "\n", + "A deployment is a set of resources required for hosting the model that does the actual inferencing. Our pipeline is defined in a function. To transform it to a component, you'll use the `build()` method. Pipeline components are reusable compute graphs that can be included in batch deployments or used to compose more complex pipelines." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pipeline_component = demand_inference_single_model._pipeline_builder.build()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can define the deployment" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deployment = PipelineComponentBatchDeployment(\n", + " name=\"sdk-tcn-deployment\",\n", + " description=\"A TCN deployment.\",\n", + " endpoint_name=endpoint.name,\n", + " component=pipeline_component,\n", + " settings={\"default_compute\": amlcompute_cluster_name},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the deployment in the workspace usign the MLClient created earlier. This command will start the deployment creation and return a confirmation response while the deployment creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_deployments.begin_create_or_update(deployment).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.3. Invoke the Endpoint\n", + "\n", + "The next cell contains the command that invokes the endpoint for batch inference job. The `invoke` method contains the `inputs` parameter. This parameter contains the inputs necessary to execute the inference component on the endpoint. To convince yourself this is the case, compare the input parameters for the `inference_component_from_registry` in section 7.1 with the `inputs` we are providing in the next cell. They are identical.\n", + "\n", + "Notice, the the `forecast_mode` is set to `\"recursive\"`. In the evaluation pipeline this component was used to generate rolling forecast to evaluate model performance on the test set. For more details on rolling evaluation, see our [forecasting model evaluation article](placeholder). Here, we are using it to generate a forecast." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "batch_job = ml_client.batch_endpoints.invoke(\n", + " endpoint_name=endpoint.name,\n", + " deployment_name=deployment.name,\n", + " inputs={\n", + " \"test_data\": Input(path=os.path.join(os.getcwd(), \"data\", \"inference\")),\n", + " \"model_path\": Input(\n", + " path=os.path.join(\"./artifact_downloads\", \"outputs\", \"mlflow-model\")\n", + " ),\n", + " \"target_column_name\": Input(type=\"string\", default=target_column_name),\n", + " \"forecast_mode\": Input(type=\"string\", default=\"recursive\"),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will stream the job output to monitor the execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job_name = batch_job.name\n", + "batch_job = ml_client.jobs.get(name=job_name)\n", + "print(f\"Batch job status: {batch_job.status}\\n---\")\n", + "ml_client.jobs.stream(name=job_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.4. Download Forecast Output\n", + "\n", + "Finally, we download the forecast output and print the first few rows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_output_dir = os.path.join(os.getcwd(), \"forecast\")\n", + "\n", + "for child in ml_client.jobs.list(parent_job_name=job_name):\n", + " print(f\"{child.name}\\n---\\nDownloading data ...\\n---\")\n", + " for attempt in range(3):\n", + " print(f\"Attempt: {attempt}\")\n", + " try:\n", + " ml_client.jobs.download(\n", + " child.name,\n", + " download_path=fcst_output_dir,\n", + " output_name=\"inference_output_file\",\n", + " )\n", + " break\n", + " except BaseException:\n", + " sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_df = pd.read_json(\n", + " os.path.join(\n", + " fcst_output_dir,\n", + " \"named-outputs\",\n", + " \"inference_output_file\",\n", + " \"inference_output_file\",\n", + " ),\n", + " orient=\"records\",\n", + " lines=True,\n", + ")\n", + "fcst_df[time_column_name] = pd.to_datetime(fcst_df[time_column_name], unit=\"ms\")\n", + "fcst_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 11.5. [Optional] Delete the Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.online_endpoints.begin_delete(name=endpoint.name).wait()" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python310-sdkv2" + }, + "kernelspec": { + "display_name": "Python 3.10 - SDK v2", + "language": "python", + "name": "python310-sdkv2" + }, + "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.10.9" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/MLTable b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/MLTable new file mode 100644 index 0000000000..99d87d700a --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/MLTable @@ -0,0 +1,7 @@ +paths: +- file: ./uci_electro_small_inference.parquet +transformations: +- read_parquet: + include_path_column: false + path_column: Path +type: mltable \ No newline at end of file diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/uci_electro_small_inference.parquet b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/uci_electro_small_inference.parquet new file mode 100644 index 0000000000..8f888b77c4 Binary files /dev/null and b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/inference/uci_electro_small_inference.parquet differ diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/MLTable b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/MLTable new file mode 100644 index 0000000000..73dde98406 --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/MLTable @@ -0,0 +1,7 @@ +paths: +- file: ./uci_electro_small_test.parquet +transformations: +- read_parquet: + include_path_column: false + path_column: Path +type: mltable \ No newline at end of file diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/uci_electro_small_test.parquet b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/uci_electro_small_test.parquet new file mode 100644 index 0000000000..a111d06d13 Binary files /dev/null and b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/test/uci_electro_small_test.parquet differ diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/MLTable b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/MLTable new file mode 100644 index 0000000000..1f63f5e271 --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/MLTable @@ -0,0 +1,7 @@ +paths: +- file: ./uci_electro_small_train.parquet +transformations: +- read_parquet: + include_path_column: false + path_column: Path +type: mltable \ No newline at end of file diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/uci_electro_small_train.parquet b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/uci_electro_small_train.parquet new file mode 100644 index 0000000000..7901b15381 Binary files /dev/null and b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/train/uci_electro_small_train.parquet differ diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/MLTable b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/MLTable new file mode 100644 index 0000000000..2c71f640bd --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/MLTable @@ -0,0 +1,7 @@ +paths: +- file: ./uci_electro_small_valid.parquet +transformations: +- read_parquet: + include_path_column: false + path_column: Path +type: mltable \ No newline at end of file diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/uci_electro_small_valid.parquet b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/uci_electro_small_valid.parquet new file mode 100644 index 0000000000..2d20a65116 Binary files /dev/null and b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/data/valid/uci_electro_small_valid.parquet differ diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/scripts/helper_scripts.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/scripts/helper_scripts.py new file mode 100644 index 0000000000..e906be85ca --- /dev/null +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-distributed-tcn/scripts/helper_scripts.py @@ -0,0 +1,61 @@ +from typing import Any, Dict, Optional, List + +import argparse +import json +import os +import re +import shutil + +import pandas as pd + +from typing import List, Union, Tuple +from matplotlib import pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages + + +def _format_grain_name(grain: Union[str, Tuple[str], List[str]]) -> str: + """ + Convert grain name to string. + + :param grain: the grain name. + :return: the string representation of the given grain. + """ + if not isinstance(grain, tuple) and not isinstance(grain, list): + return str(grain) + grain = list(map(str, grain)) + return "|".join(grain) + + +def draw_one_plot( + df: pd.DataFrame, + time_column_name: str, + target_column_name: str, + grain_column_names: List[str], + columns_to_plot: List[str], + pdf: PdfPages, + plot_predictions=False, +) -> None: + """ + Draw the single plot. + + :param df: The data frame with the data to build plot. + :param time_column_name: The name of a time column. + :param grain_column_names: The name of grain columns. + :param pdf: The pdf backend used to render the plot. + """ + if isinstance(grain_column_names, str): + grain_column_names = [grain_column_names] + fig, _ = plt.subplots(figsize=(20, 10)) + df = df.set_index(time_column_name) + plt.plot(df[columns_to_plot]) + plt.xticks(rotation=45) + if grain_column_names: + grain_name = [df[grain].iloc[0] for grain in grain_column_names] + plt.title(f"Time series ID: {_format_grain_name(grain_name)}") + plt.legend(columns_to_plot) + plt.close(fig) + pdf.savefig(fig) + + +if __name__ == "__main__": + pass diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb index 8830ce0092..6eca78503e 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb @@ -37,15 +37,14 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- Serverless compute to run the job\n", + "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", "- A python environment\n", "- Installation instructions - [install instructions](../../../README.md)\n", "\n", "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML time-series forecasting Job` with the 'forecasting()' factory-fuction\n", - "- Train the model using serverless compute by submitting/running the AutoML forecasting training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML forecasting training job\n", "- Obtain the model and use it to generate forecast\n", "\n", "**Motivations** - This notebook explains how to setup and run an AutoML forecasting job. This is one of the nine ML-tasks supported by AutoML. Other ML-tasks are 'regression', 'classification', 'image classification', 'image object detection', 'nlp text classification', etc.\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/helpers/forecasting_script.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/helpers/forecasting_script.py index e71630cf2e..5072bcfcfe 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/helpers/forecasting_script.py +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau/helpers/forecasting_script.py @@ -10,7 +10,7 @@ import numpy as np from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset import torch diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.ipynb index d4a9c4f510..8a5b6421fc 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/automl-forecasting-orange-juice-sales-mlflow.ipynb @@ -17,7 +17,7 @@ "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML time-series forecasting Job` with the 'forecasting()' factory-fuction.\n", - "- Train the model using AmlCompute by submitting/running the AutoML forecasting training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML forecasting training job\n", "- Obtaing the model and score predictions with it\n", "\n", "**Motivations** - This notebook explains how to setup and run an AutoML forecasting job. This is one of the nine ML-tasks supported by AutoML. Other ML-tasks are 'regression', 'classification', 'image classification', 'image object detection', 'nlp text classification', etc.\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/forecast/forecasting_script.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/forecast/forecasting_script.py index 9edd3ff4c2..56135869a8 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/forecast/forecasting_script.py +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales/forecast/forecasting_script.py @@ -9,7 +9,7 @@ import pandas as pd from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/automl-forecasting-recipe-univariate-run.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/automl-forecasting-recipe-univariate-run.ipynb index a88b3f2042..f0449f18b2 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/automl-forecasting-recipe-univariate-run.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/automl-forecasting-recipe-univariate-run.ipynb @@ -25,7 +25,7 @@ "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML time-series forecasting Job` with the 'forecasting()' factory-fuction\n", - "- Train the model using AmlCompute by submitting/running the AutoML forecasting training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML forecasting training job\n", "- Obtain the model and use it to generate forecast\n", "\n" ] @@ -95,6 +95,7 @@ "from azure.ai.ml.constants import AssetTypes, InputOutputModes\n", "from azure.ai.ml import automl\n", "from azure.ai.ml import Input\n", + "from azure.ai.ml.entities import ResourceConfiguration\n", "\n", "import json\n", "import pandas as pd\n", @@ -112,9 +113,8 @@ "\n", "As part of the setup you have already created a Workspace. To connect to a workspace, we need identifier parameters - a subscription, resource group and workspace name. We will use these details in the `MLClient` from `azure.ai.ml` to get a handle to the required Azure Machine Learning workspace. We use the default [default azure authentication](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python) for this tutorial. Check the [configuration notebook](../../configuration.ipynb) for more details on how to configure credentials and connect to a workspace.\n", "\n", - " You will also need to create a compute target for your AutoML run. In this tutorial, you create AmlCompute as your training compute resource.\n", - "\n", - "Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist." + " You will also need to create a compute target for your AutoML run. In this tutorial, you will use serverless compute (preview) as your training compute resource.\n", + "\n" ] }, { @@ -563,52 +563,6 @@ "\"\"\"" ] }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## 3. Create or Attach existing AmlCompute\n", - "\n", - "[Azure Machine Learning Compute](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-set-up-training-targets#amlcompute) is a managed-compute infrastructure that allows the user to easily create a single or multi-node compute. In this tutorial, you will create and an AmlCompute cluster as your training compute resource.\n", - "\n", - "Creation of AmlCompute takes approximately 5 minutes.\n", - "\n", - "If the AmlCompute with that name is already in your workspace this code will skip the creation process.\n", - "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "gather": { - "logged": 1684500104600 - } - }, - "outputs": [], - "source": [ - "from azure.core.exceptions import ResourceNotFoundError\n", - "from azure.ai.ml.entities import AmlCompute\n", - "\n", - "cluster_name = \"recipe-cluster\"\n", - "\n", - "try:\n", - " # Retrieve an already attached Azure Machine Learning Compute.\n", - " compute = ml_client.compute.get(cluster_name)\n", - "except ResourceNotFoundError as e:\n", - " compute = AmlCompute(\n", - " name=cluster_name,\n", - " size=\"STANDARD_DS12_V2\",\n", - " type=\"amlcompute\",\n", - " min_instances=0,\n", - " max_instances=4,\n", - " idle_time_before_scale_down=120,\n", - " )\n", - " poller = ml_client.begin_create_or_update(compute)\n", - " poller.wait()" - ] - }, { "attachments": {}, "cell_type": "markdown", @@ -629,7 +583,7 @@ "|**target_column_name**|The name of the label column.|\n", "|**primary_metric**|This is the metric that you want to optimize.
Forecasting supports the following primary metrics
spearman_correlation
normalized_root_mean_squared_error
r2_score
normalized_mean_absolute_error|\n", "|**training_data**|The training data to be used for this experiment. You can use a registered MLTable in the workspace using the format `:` OR you can use a local file or folder as a MLTable. For e.g `Input(mltable='my_mltable:1')` OR `Input(mltable=MLTable(local_path=\"./data\"))` The parameter 'training_data' must always be provided.|\n", - "|**compute**|The compute on which the AutoML job will run. In this example we are using a compute called 'cpu-cluster' present in the workspace. You can replace it with any other compute in the workspace.|\n", + "|**compute**|The compute on which the AutoML job will run. In this example we are using serverless compute so compute does not need to be specified. You can replace it with a compute cluster in the workspace.|\n", "|**n_cross_validations**|Number of cross-validation folds to use for model/pipeline selection. The default value is \"auto\", in which case AutoMl determines the number of cross-validations automatically, if a validation set is not provided. Or, users could specify an integer value.|\n", "|**name**|The name of the Job/Run. This is an optional property. If not specified, a random name will be generated.\n", "|**experiment_name**|The name of the Experiment. An Experiment is like a folder with multiple runs in Azure ML Workspace that should be related to the same logical machine learning experiment. For example, if a user runs this notebook multiple times, there will be multiple runs associated with the same Experiment name.|\n", @@ -715,7 +669,6 @@ "# Create the AutoML forecasting job with the related factory-function.\n", "\n", "forecasting_job = automl.forecasting(\n", - " compute=cluster_name,\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", " target_column_name=TARGET_COLNAME,\n", @@ -753,7 +706,8 @@ ")\n", "\n", "# Training properties are optional\n", - "forecasting_job.set_training(blocked_training_algorithms=BLOCKED_MODELS)" + "forecasting_job.set_training(blocked_training_algorithms=BLOCKED_MODELS)\n", + "forecasting_job.resources = ResourceConfiguration(instance_count=4)" ] }, { @@ -1089,7 +1043,38 @@ "source": [ "Now that we have retrieved the best pipeline/model, it can be used to make predictions on test data. We will do batch inferencing on the test dataset which must have the same schema as training dataset.\n", "\n", - "The inference will run on a remote compute. In this example, it will re-use the training compute." + "The inference will run on a remote compute. In this example, we will create compute cluster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1684500104600 + } + }, + "outputs": [], + "source": [ + "from azure.core.exceptions import ResourceNotFoundError\n", + "from azure.ai.ml.entities import AmlCompute\n", + "\n", + "cluster_name = \"recipe-cluster\"\n", + "\n", + "try:\n", + " # Retrieve an already attached Azure Machine Learning Compute.\n", + " compute = ml_client.compute.get(cluster_name)\n", + "except ResourceNotFoundError as e:\n", + " compute = AmlCompute(\n", + " name=cluster_name,\n", + " size=\"STANDARD_DS12_V2\",\n", + " type=\"amlcompute\",\n", + " min_instances=0,\n", + " max_instances=4,\n", + " idle_time_before_scale_down=120,\n", + " )\n", + " poller = ml_client.begin_create_or_update(compute)\n", + " poller.wait()" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/forecast/forecasting_script.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/forecast/forecasting_script.py index 43daa30322..c38a9dbebc 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/forecast/forecasting_script.py +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate/forecast/forecasting_script.py @@ -9,7 +9,7 @@ import pandas as pd from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/auto-ml-forecasting-bike-share.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/auto-ml-forecasting-bike-share.ipynb index 5c678911b1..495625a6a2 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/auto-ml-forecasting-bike-share.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/auto-ml-forecasting-bike-share.ipynb @@ -35,7 +35,7 @@ "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML time-series forecasting Job` with the 'forecasting()' factory-fuction\n", - "- Train the model using AmlCompute by submitting/running the AutoML forecasting training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML forecasting training job\n", "- Obtain the model and use it to generate forecast\n", "\n", "**Motivations** - This notebook explains how to setup and run an AutoML forecasting job. This is one of the nine ML-tasks supported by AutoML. Other ML-tasks are 'regression', 'classification', 'image classification', 'image object detection', 'nlp text classification', etc.\n", @@ -312,46 +312,6 @@ "- https://learn.microsoft.com/en-us/azure/machine-learning/how-to-create-data-assets?tabs=Python-SDK covers how to work with them in the v2 CLI/SDK." ] }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3 Create or Attach existing AmlCompute.\n", - "[Azure Machine Learning Compute](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-set-up-training-targets#amlcompute) is a managed-compute infrastructure that allows the user to easily create a single or multi-node compute. In this tutorial, you will create and an AmlCompute cluster as your training compute resource.\n", - "\n", - "#### Creation of AmlCompute takes approximately 5 minutes. \n", - "If the AmlCompute with that name is already in your workspace this code will skip the creation process.\n", - "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azure.core.exceptions import ResourceNotFoundError\n", - "from azure.ai.ml.entities import AmlCompute\n", - "\n", - "cluster_name = \"bike-share-v2\"\n", - "\n", - "try:\n", - " # Retrieve an already attached Azure Machine Learning Compute.\n", - " compute = ml_client.compute.get(cluster_name)\n", - "except ResourceNotFoundError as e:\n", - " compute = AmlCompute(\n", - " name=cluster_name,\n", - " size=\"STANDARD_DS12_V2\",\n", - " type=\"amlcompute\",\n", - " min_instances=0,\n", - " max_instances=4,\n", - " idle_time_before_scale_down=120,\n", - " )\n", - " poller = ml_client.begin_create_or_update(compute)\n", - " poller.wait()" - ] - }, { "attachments": {}, "cell_type": "markdown", @@ -371,7 +331,7 @@ "|**target_column_name**|The name of the label column.|\n", "|**primary_metric**|This is the metric that you want to optimize.
Forecasting supports the following primary metrics
spearman_correlation
normalized_root_mean_squared_error
r2_score
normalized_mean_absolute_error|\n", "|**training_data**|The training data to be used for this experiment. You can use a registered MLTable in the workspace using the format `:` OR you can use a local file or folder as a MLTable. For e.g `Input(mltable='my_mltable:1')` OR `Input(mltable=MLTable(local_path=\"./data\"))` The parameter 'training_data' must always be provided.|\n", - "|**compute**|The compute on which the AutoML job will run. In this example we are using a compute called 'cpu-cluster' present in the workspace. You can replace it with any other compute in the workspace.|\n", + "|**compute**|The compute on which the AutoML job will run. In this example we are using serverless compute. You can replace it with a compute cluster in the workspace.|\n", "|**n_cross_validations**|Number of cross-validation folds to use for model/pipeline selection. This can be set to \"auto\", in which case AutoMl determines the number of cross-validations automatically, if a validation set is not provided. Or, users could specify an integer value.|\n", "|**name**|The name of the Job/Run. This is an optional property. If not specified, a random name will be generated.\n", "|**experiment_name**|The name of the Experiment. An Experiment is like a folder with multiple runs in Azure ML Workspace that should be related to the same logical machine learning experiment. For example, if a user runs this notebook multiple times, there will be multiple runs associated with the same Experiment name.|\n", @@ -462,8 +422,7 @@ "outputs": [], "source": [ "# Create the AutoML forecasting job with the related factory-function. Force the target column, to be integer type (To be added in phase 2)\n", - "forecasting_job = automl.forecasting(\n", - " compute=\"bike-share-v2\",\n", + "forecasting_job = automl.forecasting(\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", " target_column_name=target_column_name,\n", @@ -797,7 +756,34 @@ "\n", "Now that we have retrieved the best pipeline/model, it can be used to make predictions on test data. We will do batch inferencing on the test dataset which must have the same schema as training dataset.\n", "\n", - "The inference will run on a remote compute. In this example, it will re-use the training compute." + "The inference will run on a remote compute. In this example, it will create compute cluster." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.core.exceptions import ResourceNotFoundError\n", + "from azure.ai.ml.entities import AmlCompute\n", + "\n", + "cluster_name = \"bike-share-v2\"\n", + "\n", + "try:\n", + " # Retrieve an already attached Azure Machine Learning Compute.\n", + " compute = ml_client.compute.get(cluster_name)\n", + "except ResourceNotFoundError as e:\n", + " compute = AmlCompute(\n", + " name=cluster_name,\n", + " size=\"STANDARD_DS12_V2\",\n", + " type=\"amlcompute\",\n", + " min_instances=0,\n", + " max_instances=4,\n", + " idle_time_before_scale_down=120,\n", + " )\n", + " poller = ml_client.begin_create_or_update(compute)\n", + " poller.wait()" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/forecast/rolling_script.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/forecast/rolling_script.py index 8e065e43a7..2a25f704d8 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/forecast/rolling_script.py +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share/forecast/rolling_script.py @@ -9,7 +9,7 @@ import pandas as pd from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/automl-forecasting-task-energy-demand-advanced.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/automl-forecasting-task-energy-demand-advanced.ipynb index 74eb793a4e..d84f9822ce 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/automl-forecasting-task-energy-demand-advanced.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/automl-forecasting-task-energy-demand-advanced.ipynb @@ -10,15 +10,14 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", + "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section\n", "\n", "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML time-series forecasting Job` with the 'forecasting()' factory-fuction.\n", - "- Train the model using AmlCompute by submitting/running the AutoML forecasting training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML forecasting training job\n", "- Obtaing the model and score predictions with it\n", "\n", "**Motivations** - This notebook explains how to setup and run an AutoML forecasting job. This is one of the nine ML-tasks supported by AutoML. Other ML-tasks are 'regression', 'classification', 'image classification', 'image object detection', 'nlp text classification', etc.\n", @@ -227,7 +226,7 @@ "- `training_data` - The data to be used for training. It should contain both training feature columns and a target column. Optionally, this data can be split for segregating a validation or test dataset. \n", "You can use a registered MLTable in the workspace using the format ':' OR you can use a local file or folder as a MLTable. For e.g Input(mltable='my_mltable:1') OR Input(mltable=MLTable(local_path=\"./data\"))\n", "The parameter 'training_data' must always be provided.\n", - "- `compute` - The compute on which the AutoML job will run. In this example we are using a compute called 'adv-energy-cluster-v2' present in the workspace. You can replace it any other compute in the workspace. \n", + "- `compute` - The compute on which the AutoML job will run. In this example we are using serverless compute. You can alternatively use a compute cluster in the workspace. \n", "- `name` - The name of the Job/Run. This is an optional property. If not specified, a random name will be generated.\n", "- `experiment_name` - The name of the Experiment. An Experiment is like a folder with multiple runs in Azure ML Workspace that should be related to the same logical machine learning experiment.\n", "\n", @@ -284,8 +283,7 @@ }, "outputs": [], "source": [ - "# general job parameters\n", - "compute_name = \"adv-energy-cluster-v2\"\n", + "# general job parameters\n", "max_trials = 5\n", "exp_name = \"dpv2-forecasting-experiment\"" ] @@ -312,8 +310,7 @@ "source": [ "# Create the AutoML forecasting job with the related factory-function.\n", "\n", - "forecasting_job = automl.forecasting(\n", - " compute=compute_name,\n", + "forecasting_job = automl.forecasting(\n", " # name=\"dpv2-forecasting-job-02\",\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/forecast/forecasting_script.py b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/forecast/forecasting_script.py index ea56b5cc29..5c10c29763 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/forecast/forecasting_script.py +++ b/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/forecast/forecasting_script.py @@ -9,7 +9,7 @@ import pandas as pd from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multiclass-task-fridge-items/automl-image-classification-multiclass-task-fridge-items.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multiclass-task-fridge-items/automl-image-classification-multiclass-task-fridge-items.ipynb index 796c263c10..5846616896 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multiclass-task-fridge-items/automl-image-classification-multiclass-task-fridge-items.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multiclass-task-fridge-items/automl-image-classification-multiclass-task-fridge-items.ipynb @@ -448,7 +448,7 @@ "from azure.ai.ml.entities import AmlCompute\n", "from azure.core.exceptions import ResourceNotFoundError\n", "\n", - "compute_name = \"gpu-cluster-nc6\"\n", + "compute_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " _ = ml_client.compute.get(compute_name)\n", @@ -458,7 +458,7 @@ " compute_config = AmlCompute(\n", " name=compute_name,\n", " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", + " size=\"Standard_NC6s_v3\",\n", " idle_time_before_scale_down=120,\n", " min_instances=0,\n", " max_instances=4,\n", @@ -1107,7 +1107,7 @@ " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", " # use GPU instance type like Standard_NC6s_v3 for faster explanations\n", - " instance_type=\"Standard_DS3_V2\",\n", + " instance_type=\"Standard_DS4_V2\",\n", " instance_count=1,\n", " request_settings=req_timeout,\n", " liveness_probe=ProbeSettings(\n", @@ -1376,7 +1376,7 @@ "# visualize explanations of the first image against one of the class\n", "img_bytes = base64_to_img(predictions[0][\"visualizations\"])\n", "image = Image.open(BytesIO(img_bytes))\n", - "display(image)" + "plt.imshow(image)" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multilabel-task-fridge-items/automl-image-classification-multilabel-task-fridge-items.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multilabel-task-fridge-items/automl-image-classification-multilabel-task-fridge-items.ipynb index b8f549d972..45f5c43565 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multilabel-task-fridge-items/automl-image-classification-multilabel-task-fridge-items.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-image-classification-multilabel-task-fridge-items/automl-image-classification-multilabel-task-fridge-items.ipynb @@ -437,7 +437,7 @@ " compute_config = AmlCompute(\n", " name=compute_name,\n", " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", + " size=\"Standard_NC6s_v3\",\n", " idle_time_before_scale_down=120,\n", " min_instances=0,\n", " max_instances=4,\n", @@ -1088,7 +1088,7 @@ " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", " # use GPU instance type like Standard_NC6s_v3 for faster explanations\n", - " instance_type=\"Standard_DS3_V2\",\n", + " instance_type=\"Standard_DS4_V2\",\n", " instance_count=1,\n", " request_settings=req_timeout,\n", " liveness_probe=ProbeSettings(\n", @@ -1364,7 +1364,7 @@ "# visualize explanations of the first image against one of the classes\n", "img_bytes = base64_to_img(predictions[0][\"visualizations\"][0])\n", "image = Image.open(BytesIO(img_bytes))\n", - "display(image)" + "plt.imshow(image)" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-image-instance-segmentation-task-fridge-items/automl-image-instance-segmentation-task-fridge-items.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-image-instance-segmentation-task-fridge-items/automl-image-instance-segmentation-task-fridge-items.ipynb index fd7267c5f4..0f3b9b19de 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-image-instance-segmentation-task-fridge-items/automl-image-instance-segmentation-task-fridge-items.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-image-instance-segmentation-task-fridge-items/automl-image-instance-segmentation-task-fridge-items.ipynb @@ -537,7 +537,7 @@ " compute_config = AmlCompute(\n", " name=compute_name,\n", " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", + " size=\"Standard_NC6s_v3\",\n", " idle_time_before_scale_down=120,\n", " min_instances=0,\n", " max_instances=4,\n", @@ -1200,7 +1200,7 @@ " name=\"is-fridge-items-mlflow-dpl\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_V2\",\n", + " instance_type=\"Standard_DS4_V2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-image-object-detection-task-fridge-items/automl-image-object-detection-task-fridge-items.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-image-object-detection-task-fridge-items/automl-image-object-detection-task-fridge-items.ipynb index 25c354ea58..f68ca9ac1c 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-image-object-detection-task-fridge-items/automl-image-object-detection-task-fridge-items.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-image-object-detection-task-fridge-items/automl-image-object-detection-task-fridge-items.ipynb @@ -1202,7 +1202,7 @@ " name=\"od-fridge-items-mlflow-deploy\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_V2\",\n", + " instance_type=\"Standard_DS4_V2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment-mlflow.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment-mlflow.ipynb index a94f98270e..8dbabf2265 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment-mlflow.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment-mlflow.ipynb @@ -10,7 +10,6 @@ "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section" ] @@ -42,7 +41,8 @@ "from azure.identity import DefaultAzureCredential\n", "from azure.ai.ml.constants import AssetTypes\n", "from azure.ai.ml import automl, Input, MLClient\n", - "from pprint import pprint" + "from pprint import pprint\n", + "from azure.ai.ml.entities import ResourceConfiguration" ] }, { @@ -190,40 +190,6 @@ "In this section we will configure and run the AutoML job, for training the model. " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "# general job parameters\n", - "from azure.ai.ml.entities import AmlCompute\n", - "from azure.core.exceptions import ResourceNotFoundError\n", - "\n", - "compute_name = \"gpu-cluster\"\n", - "\n", - "try:\n", - " _ = ml_client.compute.get(compute_name)\n", - " print(\"Found existing compute target.\")\n", - "except ResourceNotFoundError:\n", - " print(\"Creating a new compute target...\")\n", - " compute_config = AmlCompute(\n", - " name=compute_name,\n", - " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", - " idle_time_before_scale_down=120,\n", - " min_instances=0,\n", - " max_instances=4,\n", - " )\n", - " ml_client.begin_create_or_update(compute_config).result()\n", - "exp_name = \"dpv2-nlp-text-classification-experiment\"\n", - "dataset_language_code = \"eng\"" - ] - }, { "cell_type": "code", "execution_count": null, @@ -246,8 +212,9 @@ "source": [ "# Create the AutoML job with the related factory-function.\n", "\n", + "exp_name = \"dpv2-nlp-text-classification-experiment\"\n", + "dataset_language_code = \"eng\"\n", "text_classification_job = automl.text_classification(\n", - " compute=compute_name,\n", " # name=\"dpv2-nlp-text-classification-multiclass-job-01\",\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", @@ -257,7 +224,10 @@ " tags={\"my_custom_tag\": \"My custom value\"},\n", ")\n", "\n", - "text_classification_job.set_limits(timeout_minutes=120)" + "text_classification_job.set_limits(timeout_minutes=120)\n", + "text_classification_job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\"\n", + ")" ] }, { @@ -690,7 +660,7 @@ " name=\"nlp-multiclass-deploy\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_v2\",\n", + " instance_type=\"Standard_DS4_v2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment.ipynb index 9d3963fdcc..b565cb685d 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multiclass-task-sentiment-analysis/automl-nlp-multiclass-sentiment.ipynb @@ -10,7 +10,6 @@ "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section" ] @@ -44,7 +43,8 @@ "from azure.ai.ml.constants import AssetTypes\n", "from azure.ai.ml import Input\n", "\n", - "from azure.ai.ml import automl" + "from azure.ai.ml import automl\n", + "from azure.ai.ml.entities import ResourceConfiguration" ] }, { @@ -195,7 +195,6 @@ "outputs": [], "source": [ "# general job parameters\n", - "compute_name = \"gpu-cluster\"\n", "exp_name = \"dpv2-nlp-text-classification-experiment\"\n", "dataset_language_code = \"eng\"" ] @@ -223,7 +222,6 @@ "# Create the AutoML job with the related factory-function.\n", "\n", "text_classification_job = automl.text_classification(\n", - " compute=compute_name,\n", " # name=\"dpv2-nlp-text-classification-multiclass-job-01\",\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", @@ -233,7 +231,10 @@ " tags={\"my_custom_tag\": \"My custom value\"},\n", ")\n", "\n", - "text_classification_job.set_limits(timeout_minutes=120)" + "text_classification_job.set_limits(timeout_minutes=120)\n", + "text_classification_job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\"\n", + ")" ] }, { diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multilabel-task-paper-categorization/automl-nlp-multilabel-paper-cat.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multilabel-task-paper-categorization/automl-nlp-multilabel-paper-cat.ipynb index 1d37899a76..0845fb007d 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multilabel-task-paper-categorization/automl-nlp-multilabel-paper-cat.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-classification-multilabel-task-paper-categorization/automl-nlp-multilabel-paper-cat.ipynb @@ -10,7 +10,6 @@ "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section\n", "\n", @@ -46,7 +45,8 @@ "from azure.identity import DefaultAzureCredential\n", "from azure.ai.ml.constants import AssetTypes\n", "from azure.ai.ml import automl, Input, MLClient\n", - "from pprint import pprint" + "from pprint import pprint\n", + "from azure.ai.ml.entities import ResourceConfiguration" ] }, { @@ -141,40 +141,6 @@ "In this section we will configure and run the AutoML job, for training the model. " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "# general job parameters\n", - "from azure.ai.ml.entities import AmlCompute\n", - "from azure.core.exceptions import ResourceNotFoundError\n", - "\n", - "compute_name = \"gpu-cluster\"\n", - "\n", - "try:\n", - " _ = ml_client.compute.get(compute_name)\n", - " print(\"Found existing compute target.\")\n", - "except ResourceNotFoundError:\n", - " print(\"Creating a new compute target...\")\n", - " compute_config = AmlCompute(\n", - " name=compute_name,\n", - " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", - " idle_time_before_scale_down=120,\n", - " min_instances=0,\n", - " max_instances=4,\n", - " )\n", - " ml_client.begin_create_or_update(compute_config).result()\n", - "exp_name = \"dpv2-nlp-multilabel\"\n", - "exp_timeout = 120" - ] - }, { "cell_type": "code", "execution_count": null, @@ -197,8 +163,9 @@ "source": [ "# Create the AutoML job with the related factory-function.\n", "\n", + "exp_name = \"dpv2-nlp-multilabel\"\n", + "exp_timeout = 120\n", "text_classification_multilabel_job = automl.text_classification_multilabel(\n", - " compute=compute_name,\n", " # name=\"dpv2-nlp-text-classification-multilabel-job-02\",\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", @@ -208,7 +175,10 @@ " tags={\"my_custom_tag\": \"My custom value\"},\n", ")\n", "\n", - "text_classification_multilabel_job.set_limits(timeout_minutes=exp_timeout)" + "text_classification_multilabel_job.set_limits(timeout_minutes=exp_timeout)\n", + "text_classification_multilabel_job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\"\n", + ")" ] }, { @@ -703,7 +673,7 @@ " name=\"nlp-multilabel-deploy\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_v2\",\n", + " instance_type=\"Standard_DS4_v2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task-distributed-sweeping/automl-nlp-text-ner-task-distributed-with-sweeping.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task-distributed-sweeping/automl-nlp-text-ner-task-distributed-with-sweeping.ipynb index b2acfa109d..68b5bfe3b6 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task-distributed-sweeping/automl-nlp-text-ner-task-distributed-with-sweeping.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task-distributed-sweeping/automl-nlp-text-ner-task-distributed-with-sweeping.ipynb @@ -189,7 +189,7 @@ "from azure.ai.ml.entities import AmlCompute\n", "from azure.core.exceptions import ResourceNotFoundError\n", "\n", - "compute_name = \"gpu-cluster\"\n", + "compute_name = \"gpu-cluster-nc6s-v3\"\n", "\n", "try:\n", " _ = ml_client.compute.get(compute_name)\n", @@ -199,7 +199,7 @@ " compute_config = AmlCompute(\n", " name=compute_name,\n", " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", + " size=\"Standard_NC6s_v3\",\n", " idle_time_before_scale_down=120,\n", " min_instances=0,\n", " max_instances=4,\n", @@ -765,7 +765,7 @@ " name=\"conll-ner-mlflow-dpl\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_V2\",\n", + " instance_type=\"Standard_DS4_V2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task/automl-nlp-text-ner-task.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task/automl-nlp-text-ner-task.ipynb index 51094cc845..0935ec1da3 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task/automl-nlp-text-ner-task.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-nlp-text-named-entity-recognition-task/automl-nlp-text-ner-task.ipynb @@ -10,7 +10,6 @@ "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section\n", "\n", @@ -46,6 +45,7 @@ "from azure.identity import DefaultAzureCredential\n", "from azure.ai.ml import automl, Input, MLClient\n", "from azure.ai.ml.constants import AssetTypes\n", + "from azure.ai.ml.entities import ResourceConfiguration\n", "\n", "from pprint import pprint" ] @@ -145,40 +145,6 @@ "In this section we will configure and run the AutoML job, for training the model. " ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "# general job parameters\n", - "from azure.ai.ml.entities import AmlCompute\n", - "from azure.core.exceptions import ResourceNotFoundError\n", - "\n", - "compute_name = \"gpu-cluster\"\n", - "\n", - "try:\n", - " _ = ml_client.compute.get(compute_name)\n", - " print(\"Found existing compute target.\")\n", - "except ResourceNotFoundError:\n", - " print(\"Creating a new compute target...\")\n", - " compute_config = AmlCompute(\n", - " name=compute_name,\n", - " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", - " idle_time_before_scale_down=120,\n", - " min_instances=0,\n", - " max_instances=4,\n", - " )\n", - " ml_client.begin_create_or_update(compute_config).result()\n", - "exp_name = \"dpv2-nlp-text-ner-experiment\"\n", - "exp_timeout = 60" - ] - }, { "cell_type": "code", "execution_count": null, @@ -202,8 +168,9 @@ "source": [ "# Create the AutoML job with the related factory-function.\n", "\n", + "exp_name = \"dpv2-nlp-text-ner-experiment\"\n", + "exp_timeout = 60\n", "text_ner_job = automl.text_ner(\n", - " compute=compute_name,\n", " # name=\"dpv2-nlp-text-ner-job-01\",\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", @@ -211,7 +178,8 @@ " tags={\"my_custom_tag\": \"My custom value\"},\n", ")\n", "\n", - "text_ner_job.set_limits(timeout_minutes=exp_timeout)" + "text_ner_job.set_limits(timeout_minutes=exp_timeout)\n", + "text_ner_job.resources = ResourceConfiguration(instance_type=\"Standard_NC6s_v3\")" ] }, { @@ -707,7 +675,7 @@ " name=\"ner-deploy\",\n", " endpoint_name=online_endpoint_name,\n", " model=registered_model.id,\n", - " instance_type=\"Standard_DS3_v2\",\n", + " instance_type=\"Standard_DS4_v2\",\n", " instance_count=1,\n", " liveness_probe=ProbeSettings(\n", " failure_threshold=30,\n", diff --git a/sdk/python/jobs/automl-standalone-jobs/automl-regression-task-hardware-performance/automl-regression-task-hardware-performance.ipynb b/sdk/python/jobs/automl-standalone-jobs/automl-regression-task-hardware-performance/automl-regression-task-hardware-performance.ipynb index 42eb267610..9bb054e64b 100644 --- a/sdk/python/jobs/automl-standalone-jobs/automl-regression-task-hardware-performance/automl-regression-task-hardware-performance.ipynb +++ b/sdk/python/jobs/automl-standalone-jobs/automl-regression-task-hardware-performance/automl-regression-task-hardware-performance.ipynb @@ -9,15 +9,14 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", - "- A Compute Cluster. [Check this notebook to create a compute cluster](../../../resources/compute/compute.ipynb)\n", + "- An Azure ML workspace. [Check this notebook for creating a workspace](../../../resources/workspace/workspace.ipynb) \n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../README.md) - check the getting started section\n", "\n", "**Learning Objectives** - By the end of this tutorial, you should be able to:\n", "- Connect to your AML workspace from the Python SDK\n", "- Create an `AutoML regression Job` with the 'regression()' factory-function.\n", - "- Train the model using AmlCompute by submitting/running the AutoML regression training job\n", + "- Train the model using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) by submitting/running the AutoML regression training job\n", "- Obtaing the model and score predictions with it\n", "\n", "**Motivations** - This notebook explains how to setup and run an AutoML regression job. This is one of the nine ML-tasks supported by AutoML. Other ML-tasks are 'forecasting', 'classification', 'image classification', 'image object detection', 'nlp text classification', etc.\n", @@ -148,49 +147,6 @@ "# my_training_data_input = Input(type=AssetTypes.MLTABLE, path=\"azureml://datastores/workspaceblobstore/paths/my-regression-mltable\")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# 3. Compute target setup\n", - "\n", - "### Create or Attach existing AmlCompute\n", - "A compute target is required to execute the Automated ML run. In this tutorial, you create AmlCompute as your training compute resource.\n", - "\n", - "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist.\n", - "\n", - "#### Creation of AmlCompute takes approximately 5 minutes. \n", - "If the AmlCompute with that name is already in your workspace this code will skip the creation process.\n", - "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azure.ai.ml.entities import AmlCompute\n", - "from azure.core.exceptions import ResourceNotFoundError\n", - "\n", - "compute_name = \"cpu-cluster\"\n", - "\n", - "try:\n", - " _ = ml_client.compute.get(compute_name)\n", - " print(\"Found existing compute target.\")\n", - "except ResourceNotFoundError:\n", - " print(\"Creating a new compute target...\")\n", - " compute_config = AmlCompute(\n", - " name=compute_name,\n", - " type=\"amlcompute\",\n", - " size=\"STANDARD_DS12_V2\",\n", - " idle_time_before_scale_down=120,\n", - " min_instances=0,\n", - " max_instances=6,\n", - " )\n", - " ml_client.begin_create_or_update(compute_config).result()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -209,7 +165,7 @@ "- `training_data` - The data to be used for training. It should contain both training feature columns and a target column. Optionally, this data can be split for segregating a validation or test dataset. \n", "You can use a registered MLTable in the workspace using the format ':' OR you can use a local file or folder as a MLTable. For e.g Input(mltable='my_mltable:1') OR Input(mltable=MLTable(local_path=\"./data\"))\n", "The parameter 'training_data' must always be provided.\n", - "- `compute` - The compute on which the AutoML job will run. In this example we are using a compute called 'cpu-cluster' present in the workspace. You can replace it any other compute in the workspace. \n", + "- `compute` - The compute on which the AutoML job will run. In this example we are using serverless compute. You can alternatively use a compute cluster as well. \n", "- `name` - The name of the Job/Run. This is an optional property. If not specified, a random name will be generated.\n", "- `experiment_name` - The name of the Experiment. An Experiment is like a folder with multiple runs in Azure ML Workspace that should be related to the same logical machine learning experiment.\n", "\n", @@ -265,8 +221,7 @@ "source": [ "# Create the AutoML regression job with the related factory-function.\n", "\n", - "regression_job = automl.regression(\n", - " compute=compute_name,\n", + "regression_job = automl.regression(\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", " target_column_name=\"ERP\",\n", diff --git a/sdk/python/jobs/configuration.ipynb b/sdk/python/jobs/configuration.ipynb index 5791d39250..fc186491bb 100644 --- a/sdk/python/jobs/configuration.ipynb +++ b/sdk/python/jobs/configuration.ipynb @@ -173,7 +173,10 @@ "except Exception:\n", " print(\"Creating a new gpu compute target...\")\n", " compute = AmlCompute(\n", - " name=gpu_compute_target, size=\"STANDARD_NC6\", min_instances=0, max_instances=4\n", + " name=gpu_compute_target,\n", + " size=\"STANDARD_NC6s_v3\",\n", + " min_instances=0,\n", + " max_instances=4,\n", " )\n", " ml_client.compute.begin_create_or_update(compute).result()" ] diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline/register.py index d473107a2d..b08dbba36d 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-classification-bankmarketing-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model/".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multiclass-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multiclass-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multiclass-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multiclass-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multilabel-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multilabel-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multilabel-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-classification-multilabel-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-instance-segmentation-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-instance-segmentation-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-instance-segmentation-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-instance-segmentation-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-object-detection-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-object-detection-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-object-detection-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-image-object-detection-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-regression-house-pricing-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-regression-house-pricing-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-regression-house-pricing-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-regression-house-pricing-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-multilabel-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-multilabel-in-pipeline/register.py index d473107a2d..515e7744eb 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-multilabel-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-classification-multilabel-in-pipeline/register.py @@ -57,7 +57,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-ner-named-entity-recognition-in-pipeline/register.py b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-ner-named-entity-recognition-in-pipeline/register.py index 097041975e..b2e83c8cf3 100644 --- a/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-ner-named-entity-recognition-in-pipeline/register.py +++ b/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-text-ner-named-entity-recognition-in-pipeline/register.py @@ -58,7 +58,7 @@ def main(args): runid = line.split(":")[1].strip() # Construct Model URI from run ID extract previously - model_uri = "runs:/{}/outputs/".format(runid) + model_uri = "runs:/{}/outputs/mlflow-model".format(runid) print("Model URI: " + model_uri) # Register the model with Model URI and Name of choice diff --git a/sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb b/sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb index 8cd85ca3b4..209a74ef62 100644 --- a/sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb +++ b/sdk/python/jobs/pipelines/1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -21,6 +22,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -56,6 +58,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -85,6 +88,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -114,6 +118,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -142,6 +147,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -165,7 +171,7 @@ " kmeans_clustering = spark_kmeans(file_input=train_data)\n", " kmeans_clustering.resources = {\n", " \"instance_type\": \"Standard_E8S_V3\",\n", - " \"runtime_version\": \"3.1.0\",\n", + " \"runtime_version\": \"3.2.0\",\n", " }\n", " kmeans_clustering.outputs.output.mode = InputOutputModes.DIRECT\n", "\n", @@ -192,6 +198,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -225,6 +232,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb new file mode 100644 index 0000000000..a0743efa5e --- /dev/null +++ b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb @@ -0,0 +1,1394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Automated Machine Learning\n", + "\n", + "\n", + "## Demand Forecasting Using HTS (preview)\n", + "\n", + "> [!IMPORTANT]\n", + "> Items marked (preview) in this article are currently in public preview.\n", + "> The preview version is provided without a service level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities.\n", + "> For more information, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/).\n", + "\n", + "## Contents\n", + "1. [Introduction](#Introduction)\n", + "1. [Setup](#Setup)\n", + "1. [Compute](#Compute)\n", + "1. [Data](#Data)\n", + "1. [Import Components From Registry](#ImportComponents)\n", + "1. [Create a Pipeline](#CreatePipeline)\n", + "1. [Kick Off Pipeline Runs](#PipelineRuns)\n", + "1. [Download Output](#DownloadOutput)\n", + "1. [Compare Evaluation Results](#CompareResults)\n", + "1. [Deployment](#Deployment)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Introduction
\n", + "\n", + "The objective of this notebook is to illustrate how to use the component-based AutoML hierarchical time series solution for demand forecasting tasks. It walks you through all stages of model evaluation and production process starting with data ingestion and concluding with batch endpoint deployment for production. Please see the following [link](placeholder) for a detailed description of the hierarchical time series modeling.\n", + "\n", + "We use a subset of UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)) with the objective of predicting electricity demand per consumer 24 hours ahead. The data was preprocessed using the [data prep notebook](https://github.com/Azure/azureml-examples/blob/main/v1/python-sdk/tutorials/automl-with-azureml/forecasting-data-preparation/auto-ml-forecasting-data-preparation.ipynb). Please refer to it for illustration on how to download the data from the source, aggregate to an hourly frequency, convert from wide to long format and upload to the Datastore. Here, we will work with the data that has been pre-processed and saved locally in the parquet format.\n", + "\n", + "There are a number of steps you need to take before you can put a model into production. A user needs to prepare the data, partition it into appropriate sets, select the best model, evaluate it against a baseline, and monitor the model in real life to collect enough observations on how it would perform had it been put in production. Some of these steps are time consuming, some require certain expertise in writing code. The steps shown in this notebook follow a typical thought process one follows before the model is put in production.\n", + "\n", + "Make sure you have executed the [configuration](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) before running this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setup " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1682992408484 + } + }, + "outputs": [], + "source": [ + "# Import required libraries\n", + "import os\n", + "import datetime\n", + "import json\n", + "import yaml\n", + "import azure.ai.ml\n", + "\n", + "import pandas as pd\n", + "\n", + "from time import sleep\n", + "\n", + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "from azure.ai.ml import MLClient, Input, Output\n", + "from azure.ai.ml import load_component\n", + "from azure.ai.ml.constants import AssetTypes\n", + "from azure.ai.ml.dsl import pipeline\n", + "from azure.ai.ml.entities import (\n", + " BatchEndpoint,\n", + " BatchDeployment,\n", + " AmlCompute,\n", + " PipelineComponentBatchDeployment,\n", + ")\n", + "\n", + "print(f\"SDK version: {azure.ai.ml.__version__}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1. Configure workspace details and get a handle to the workspace\n", + "\n", + "The [workspace](https://docs.microsoft.com/en-us/azure/machine-learning/concept-workspace) is the top-level resource for Azure Machine Learning, providing a centralized place to work with all the artifacts you create when you use Azure Machine Learning. In this section we will connect to the workspace in which the job will be run.\n", + "\n", + "To connect to a workspace, we need identifier parameters - a subscription, resource group and workspace name. We will use these details in the `MLClient` from `azure.ai.ml` to get a handle to the required Azure Machine Learning workspace. We use the default [default azure authentication](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python) for this tutorial. Check the [configuration notebook](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) for more details on how to configure credentials and connect to a workspace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential does not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ml_client = MLClient.from_config(credential)\n", + "except Exception as ex:\n", + " print(ex)\n", + " # Enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace)\n", + " print(ml_client)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2. Show Azure ML Workspace information" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ws = ml_client.workspaces.get(name=ml_client.workspace_name)\n", + "\n", + "output = {}\n", + "output[\"Workspace\"] = ml_client.workspace_name\n", + "output[\"Subscription ID\"] = ml_client.connections._subscription_id\n", + "output[\"Resource Group\"] = ws.resource_group\n", + "output[\"Location\"] = ws.location\n", + "pd.DataFrame(data=output, index=[\"\"]).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compute \n", + "\n", + "#### Create or Attach existing AmlCompute\n", + "\n", + "You will need to create a compute target for your AutoML run. In this tutorial, you will create AmlCompute as your training compute resource.\n", + "\n", + "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist.\n", + "\n", + "\n", + "Here, we use a 5 node cluster of the `STANDARD_DS15_V2` series for illustration purposes. You will need to adjust the compute type and the number of nodes based on your needs which can be driven by the speed needed for model selection, data size, etc. \n", + "\n", + "#### Creation of AmlCompute takes approximately 5 minutes. \n", + "If the AmlCompute with that name is already in your workspace, this code will skip the creation process.\n", + "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.core.exceptions import ResourceNotFoundError\n", + "\n", + "amlcompute_cluster_name = \"demand-fcst-hts-cluster\"\n", + "\n", + "try:\n", + " # Retrieve an already attached Azure Machine Learning Compute.\n", + " compute_target = ml_client.compute.get(amlcompute_cluster_name)\n", + "except ResourceNotFoundError as e:\n", + " compute_target = AmlCompute(\n", + " name=amlcompute_cluster_name,\n", + " size=\"STANDARD_DS15_V2\",\n", + " type=\"amlcompute\",\n", + " min_instances=0,\n", + " max_instances=5,\n", + " idle_time_before_scale_down=600,\n", + " )\n", + " poller = ml_client.begin_create_or_update(compute_target)\n", + " poller.wait()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Data \n", + "\n", + "For illustration purposes we use the UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)). The original dataset contains electricity consumption data for 370 consumers measured at 15 minute intervals. In the data set for this demonstrations, we have aggregated to an hourly frequency and convereted to the kilowatt hours (kWh) for 10 customers. Each customer is assigned to one of the two groups as denoted by the entries in the `group_id` column. \n", + "\n", + "The data for this notebook is located in the `automl-sample-notebook-data` container in the datastore and is publicly available. In the next few cells, we will download the train, test and inference datasets from the public datastore and store them locally." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-hts/train/uci_electro_small_hts_train.parquet\"\n", + "test_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-hts/test/uci_electro_small_hts_test.parquet\"\n", + "inference_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-hts/inference/uci_electro_small_hts_inference.parquet\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_column_name = \"datetime\"\n", + "target_column_name = \"usage\"\n", + "hierarchy_column_names = [\"group_id\", \"customer_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def create_folder_and_save_as_parquet(file_uri, output_folder):\n", + " os.makedirs(output_folder, exist_ok=True)\n", + " data_frame = pd.read_parquet(file_uri)\n", + " file_name = os.path.split(file_uri)[-1]\n", + " data_path = os.path.join(output_folder, file_name)\n", + " data_frame.to_parquet(data_path, index=False)\n", + " return None\n", + "\n", + "\n", + "create_folder_and_save_as_parquet(train_data_path, \"./data/train\")\n", + "create_folder_and_save_as_parquet(test_data_path, \"./data/test\")\n", + "create_folder_and_save_as_parquet(inference_data_path, \"./data/inference\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells read and print the first few rows of the training data as well as the number of unique time series in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dataset_type = \"train\"\n", + "df = pd.read_parquet(f\"./data/{dataset_type}\")\n", + "df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nseries = df.groupby(hierarchy_column_names).ngroups\n", + "print(f\"Data contains {nseries} individual time-series\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df[hierarchy_column_names].drop_duplicates()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Import Components From Registry \n", + "\n", + "An Azure Machine Learning component is a self-contained piece of code that does one step in a machine learning pipeline. A component is analogous to a function - it has a name, inputs, outputs, and a body. Components are the building blocks of the Azure Machine Learning pipelines. It's a good engineering practice to build a machine learning pipeline where each step has well-defined inputs and outputs. In Azure Machine Learning, a component represents one reusable step in a pipeline. Components are designed to help improve the productivity of pipeline building. Specifically, components offer:\n", + "- Well-defined interface: Components require a well-defined interface (input and output). The interface allows the user to build steps and connect steps easily. The interface also hides the complex logic of a step and removes the burden of understanding how the step is implemented.\n", + "\n", + "- Share and reuse: As the building blocks of a pipeline, components can be easily shared and reused across pipelines, workspaces, and subscriptions. Components built by one team can be discovered and used by another team.\n", + "\n", + "- Version control: Components are versioned. The component producers can keep improving components and publish new versions. Consumers can use specific component versions in their pipelines. This gives them compatibility and reproducibility.\n", + "\n", + "For a more detailed information on this subject, refer to the this [link](https://learn.microsoft.com/en-us/azure/machine-learning/concept-component?view=azureml-api-2).\n", + "\n", + "To import components, we need to get the registry. The following command obtains the public regsitry from which we will import components for our experiment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682992409837 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# get registry for all components\n", + "ml_client_registry = MLClient(credential=credential, registry_name=\"azureml\")\n", + "print(ml_client_registry)\n", + "print(\"---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we pull specific components and use them to build a pipeline of steps. For the illustration of the product evaluation workflow we will use the following components:\n", + "- HTS training component: trains the best model per partition specified by users.\n", + "- HTS inference componnet: generates forecast for each partition. This can be done on the test and inference sets.\n", + "- Compute metrics component: calculates metrics per time series if the inference component was used on a test set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682992443218 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "train_component_from_registry = ml_client_registry.components.get(\n", + " name=\"automl_hts_training\", label=\"latest\"\n", + ")\n", + "print(f\"HTS training component version: {train_component_from_registry.version}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996405805 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "inference_component_from_registry = ml_client_registry.components.get(\n", + " name=\"automl_hts_inference\", label=\"latest\"\n", + ")\n", + "print(f\"HTS inference component version: {train_component_from_registry.version}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996406713 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "compute_metrics_component = ml_client_registry.components.get(\n", + " name=\"compute_metrics\",\n", + " version=\"0.0.10\", # label=\"latest\"\n", + ")\n", + "print(f\"Compute metrics component version: {compute_metrics_component.version}\\n---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "gather": { + "logged": 1682996406974 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "source": [ + "## 6. Create a Pipeline \n", + "\n", + "Now that we imported the components we will build an evaluation pipeline. This pipeline will allow us to partition the data, train best models for each partition, genererate rolling forecasts on the test set, and, finally, calculate metrics on the test set output." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.1. Create a YML\n", + "\n", + "AzureML components can only receive specific object types such as strings, JSON/YML files, URI Folders and URI Files. Other object types are not accepted. Because of this, the settings needs to be passed into the training component in YML format.\n", + "\n", + "The following are the bare-minimum parameters needed to successfully train hierarchical time series. For a finer control of the experiment a user may add other parameters to the config file. See the [forecast settings API doc](https://learn.microsoft.com/en-us/python/api/azure-ai-ml/azure.ai.ml.automl.forecastingjob#azure-ai-ml-automl-forecastingjob-set-forecast-settings) for a complete list of available parameters. \n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **task** | forecasting |\n", + "| **primary_metric** | This is the metric that you want to optimize. Forecasting supports the following primary metrics
  • `normalized_root_mean_squared_error`
  • `normalized_mean_absolute_error`
  • `spearman_correlation`
  • `r2_score`
We recommend using either the normalized root mean squared error or normalized mean absolute erorr as a primary metric because they measure forecast accuracy. See the [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-automl-forecasting-faq#how-do-i-choose-the-primary-metric) for a more detailed discussion on this topic. |\n", + "| **forecast_horizon** | The forecast horizon is how many periods forward you would like to forecast. This integer horizon is in units of the timeseries frequency (e.g. daily, weekly). |\n", + "| **label_column_name** | The name of the target column we are trying to predict. |\n", + "| **time_column_name** | The name of your time column. |\n", + "| **hierarchy_column_names** | The names of columns that define the hierarchical structure of the data from highest level to most granular. |\n", + "| **hierarchy_training_level** | The level of the hierarchy to be used for training models. |\n", + "| **enable_early_stopping** | Flag to enable early termination if the primary metric is no longer improving. |\n", + "| **track_child_runs** | Flag to disable tracking of child runs. Only best run is tracked if the flag is set to False (this includes the model and metrics of the run). |\n", + "| **enable_early_stopping** | Flag to enable early termination if the primary metric is no longer improving. |\n", + "| **max_trials** | Represents the maximum number of trials an Automated ML job can try to run a training algorithm with different combination of hyperparameters. Its default value is set to 1000. If `enable_early_stopping` is defined, then the number of trials used to run training algorithms can be smaller. |\n", + "| **timeout_minutes** | Maximum amount of time in minutes that the whole AutoML job can take before the job terminates. This timeout includes setup, featurization and training runs but does not include the ensembling and model explainability runs at the end of the process since those actions need to happen once all the trials (children jobs) are done. If not specified, the default job's total timeout is 6 days (8,640 minutes). To specify a timeout less than or equal to 1 hour (60 minutes), make sure your dataset's size is not greater than 10,000,000 (rows times column) or an error results. |\n", + "| **trial_timeout_minutes** | Maximum time in minutes that each trial (child job) can run for before it terminates. If not specified, a value of 1 month or 43200 minutes is used. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "max_horizon = 24\n", + "hierarchy_column_names = [\"group_id\", \"customer_id\"]\n", + "hierarchy_training_level = \"customer_id\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Required parameters\n", + "automl_settings = dict(\n", + " task=\"forecasting\",\n", + " primary_metric=\"normalized_root_mean_squared_error\",\n", + " debug_log=\"debug.txt\",\n", + " label_column_name=target_column_name,\n", + " time_column_name=time_column_name,\n", + " forecast_horizon=max_horizon,\n", + " max_trials=25,\n", + " timeout_minutes=60,\n", + " trial_timeout_minutes=5,\n", + " n_cross_validations=2,\n", + " forecast_step=max_horizon,\n", + " track_child_runs=False,\n", + " enable_early_stopping=True,\n", + " hierarchy_training_level=hierarchy_training_level,\n", + " hierarchy_column_names=hierarchy_column_names,\n", + ")\n", + "print(json.dumps(automl_settings, indent=4), \"\\n---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we save these settings as the `automl_settings.yml` file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"automl_settings.yml\", \"w\") as file:\n", + " yaml.dump(automl_settings, file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.2. Provide additional pipeline parameters\n", + "\n", + "The next set of parameters is necessary to build the pipeline of components. These parameters are specific to the HTS training and/or inference components. Since both of these components rely on the Parallel run step (PRS) to train/inference multiple models at once, you will need to determine the appropriate number of workers and nodes for your use case. The `max_concurrency_per_node` is based off the number of cores of the compute VM. The `max_nodes` will determine the number of nodes to use, increasing the node count will speed up the training process.\n", + "\n", + "|Property|Description|\n", + "|:-|:-|\n", + "| **max_nodes** | The number of compute nodes in a cluster to be used for training and inferencing steps. We recommend to start with 3 and increase the node count if the training time is taking too long. |\n", + "| **max_concurrency_per_node** | Process count per node. We recommend a 2:1 ratio for number of cores to the number of processes per node. For example, if a node has 16 cores then configure 8 **or less** process counts per node for optimal performance. |\n", + "|**retrain_failed_model**| If training a model for any partition fails, should AutoML kick off a new child run for that partition? Possible values are `True` or `False`.|\n", + "|**forecast_mode**| Type of forecat to perform on the test set. Can be `recursive` or `rolling`. Rolling forecast can be used for the evaluation purposes |\n", + "|**forecast_step**| The forecast step used for rolling forecast. See this [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-auto-train-forecast?view=azureml-api-2#evaluating-model-accuracy-with-a-rolling-forecast) for more details on this parameter. |\n", + "| **parallel_step_timeout_in_seconds** | Maximum amount of time in seconds that the `ParallelRunStep` class is allowed. This is optional but provides customers with greater control on exit criteria. This must be greater than `experiment_timeout_hours` by at least 300 seconds. |\n", + "|**compute_name**| Name of the compute to execute the pipeline on. |\n", + "|**enable_event_logger**| Set this value to `True` to enable event logger. |\n", + "| **forecast_level** | Specify the level of the hierarchy for which you are interested in obtaining the forecast for. This parameter will be used by the inference component. |\n", + "| **allocation_method** | Method that allocates forecasts within a hierarchy. Possible values are `average_historical_proportions` and `proportions_of_historical_average`. This parameter will be used by the inference component. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Pipeline parameters\n", + "pipeline_parameters = dict(\n", + " max_nodes=1,\n", + " max_concurrency_per_node=10,\n", + " retrain_failed_model=True,\n", + " forecast_mode=\"rolling\",\n", + " forecast_step=max_horizon,\n", + " parallel_step_timeout_in_seconds=3700,\n", + " compute_name=amlcompute_cluster_name,\n", + " enable_event_logger=True,\n", + " forecast_level=\"customer_id\",\n", + " allocation_method=\"proportions_of_historical_average\",\n", + ")\n", + "print(\"Pipeline parameters\\n---\")\n", + "pd.DataFrame(data=pipeline_parameters, index=[\"\"]).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.3. Build a Pipeline\n", + "\n", + "Next, we build a pipeline from the imported components. Since this notebook is designed to illustrate the evaluation flow, we will string these components in the following fashion. First, we train the best model for each partition. Then, we generate a rolling forecast with the step size of 24 (hours) on the test set. This is done to mimic the evaluation process when a customer is tracking model's performance in real time and generates forecasts every 24 hours. Finally, we compute metrics based on the rolling forecast output from the previous step. You do not have to modify anything in the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1682996407118 + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "@pipeline(description=\"AutoML Forecasting HTS Evaluation Pipeline\")\n", + "def evaluation_pipeline(raw_data, inference_data, automl_config):\n", + " # 0. Extract pipeline parameters from the dictionary\n", + " compute_name = pipeline_parameters.get(\"compute_name\")\n", + " max_concurrency_per_node = pipeline_parameters.get(\"max_concurrency_per_node\")\n", + " parallel_step_timeout_in_seconds = pipeline_parameters.get(\n", + " \"parallel_step_timeout_in_seconds\", 3700\n", + " )\n", + " max_nodes = pipeline_parameters.get(\"max_nodes\", 1)\n", + " enable_event_logger = pipeline_parameters.get(\"enable_event_logger\", True)\n", + " retrain_failed_model = pipeline_parameters.get(\"retrain_failed_model\", True)\n", + " forecast_mode = pipeline_parameters.get(\"forecast_mode\", \"recursive\")\n", + " forecast_step = pipeline_parameters.get(\"forecast_step\", 1)\n", + " forecast_level = pipeline_parameters.get(\"forecast_level\", None)\n", + " input_type = pipeline_parameters.get(\"input_type\", \"csv\")\n", + " allocation_method = pipeline_parameters.get(\n", + " \"allocation_method\", \"proportions_of_historical_average\"\n", + " )\n", + "\n", + " # 1. Model training step\n", + " training_node = train_component_from_registry(\n", + " raw_data=raw_data,\n", + " automl_config=automl_config,\n", + " compute_name=compute_name,\n", + " max_nodes=max_nodes,\n", + " max_concurrency_per_node=max_concurrency_per_node,\n", + " parallel_step_timeout_in_seconds=parallel_step_timeout_in_seconds,\n", + " )\n", + "\n", + " # 2. Inferencing step\n", + " inference_node = inference_component_from_registry(\n", + " raw_data=inference_data,\n", + " compute_name=compute_name,\n", + " max_nodes=max_nodes,\n", + " max_concurrency_per_node=max_concurrency_per_node,\n", + " parallel_step_timeout_in_seconds=parallel_step_timeout_in_seconds,\n", + " optional_train_metadata=training_node.outputs.run_output,\n", + " forecast_mode=forecast_mode,\n", + " forecast_step=forecast_step,\n", + " allocation_method=allocation_method,\n", + " forecast_level=forecast_level,\n", + " )\n", + "\n", + " # 3. Metrics calculation step\n", + " compute_metrics_node = compute_metrics_component(\n", + " task=\"tabular-forecasting\",\n", + " prediction=inference_node.outputs.evaluation_data,\n", + " ground_truth=inference_node.outputs.evaluation_data,\n", + " evaluation_config=inference_node.outputs.evaluation_configs,\n", + " )\n", + " compute_metrics_node.compute = compute_name\n", + "\n", + " # 4. Specify pipeline outputs\n", + " return {\n", + " \"output_files\": compute_metrics_node.outputs.evaluation_result,\n", + " \"forecast_output\": inference_node.outputs.run_output,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Kick Off Pipeline Runs
\n", + "\n", + "Now that the pipeline is defined, we will use it to kick off several runs. First, we will kick off an experiment which will train, inference and evaluate the performance for the best AutoML model for each `hierarchy_training_level`. Next, we will kick off the same pipeline which will only use the naive model for the same training level of the hierarchy. This will allow us to establish a baseline and compare performance results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.1. Kick Off Best HTS Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996407285 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline_job = evaluation_pipeline(\n", + " raw_data=Input(type=\"uri_folder\", path=\"./data/train\"),\n", + " inference_data=Input(type=\"uri_folder\", path=\"./data/test\"),\n", + " automl_config=Input(type=\"uri_file\", path=\"./automl_settings.yml\"),\n", + ")\n", + "print(pipeline_job)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682997237524 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "evaluation_experiment_name = \"hts-experiment-\" + datetime.datetime.now().strftime(\n", + " \"%Y%m%d\"\n", + ")\n", + "\n", + "pipeline_submitted_job = ml_client.jobs.create_or_update(\n", + " pipeline_job,\n", + " experiment_name=evaluation_experiment_name,\n", + " skip_validation=True,\n", + ")\n", + "ml_client.jobs.stream(pipeline_submitted_job.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rehydrate run\n", + "# RUN_ID = \"\"\n", + "# pipeline_submitted_job = ml_client.jobs.get(RUN_ID)\n", + "# pipeline_submitted_job" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.2. Kick Off the Baseline Experiment\n", + "\n", + "To establish a baseline, we will use the same pipeline as before with one minore change. We will add Naive model to the allowed model list and change the number of rolling origin cross validations (ROCV) to 2. Reducing the ROCV speeds up the runtime and is needed for model selection only, while in this run we have only one model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "baseline_settings = automl_settings.copy()\n", + "baseline_settings.update(\n", + " {\"allowed_training_algorithms\": [\"Naive\"], \"n_cross_validations\": 2}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly to what we have done in section 6.3, we save the baseline experiment settings to as a YAML file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"automl_settings_base.yml\", \"w\") as file:\n", + " yaml.dump(baseline_settings, file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline_job_base = evaluation_pipeline(\n", + " raw_data=Input(type=\"uri_folder\", path=\"./data/train\"),\n", + " inference_data=Input(type=\"uri_folder\", path=\"./data/test\"),\n", + " automl_config=Input(type=\"uri_file\", path=\"./automl_settings_base.yml\"),\n", + ")\n", + "print(pipeline_job_base)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "base_experiment_name = \"hts-experiment-base-\" + datetime.datetime.now().strftime(\n", + " \"%Y%m%d\"\n", + ")\n", + "\n", + "pipeline_submitted_job_base = ml_client.jobs.create_or_update(\n", + " pipeline_job_base,\n", + " experiment_name=base_experiment_name,\n", + " skip_validation=True,\n", + ")\n", + "ml_client.jobs.stream(pipeline_submitted_job_base.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rehydrate baseline run\n", + "# RUN_ID = \"\"\n", + "# pipeline_submitted_job_base = ml_client.jobs.get(RUN_ID)\n", + "# pipeline_submitted_job_base" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Download Pipeline Output \n", + "Next, we will download the output files generated by the compute metrics components for each executed pipeline and save them in the corresponfing subfolder of the `output` folder. First, we create corresponding output directories. Then, we execute the `ml_client.jobs.download` command which downloads experiments' outputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create output directories\n", + "automl_output_dir = os.path.join(os.getcwd(), \"output/hts\")\n", + "base_output_dir = os.path.join(os.getcwd(), \"output/base\")\n", + "\n", + "os.makedirs(automl_output_dir, exist_ok=True)\n", + "os.makedirs(base_output_dir, exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " pipeline_submitted_job.name,\n", + " download_path=automl_output_dir,\n", + " output_name=\"output_files\",\n", + ")\n", + "ml_client.jobs.download(\n", + " pipeline_submitted_job_base.name,\n", + " download_path=base_output_dir,\n", + " output_name=\"output_files\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " pipeline_submitted_job.name,\n", + " download_path=automl_output_dir,\n", + " output_name=\"forecast_output\",\n", + ")\n", + "\n", + "ml_client.jobs.download(\n", + " pipeline_submitted_job_base.name,\n", + " download_path=base_output_dir,\n", + " output_name=\"forecast_output\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## 9. Compare Evaluation Results \n", + "\n", + "### 9.1. Examine Metrics\n", + "\n", + "In this section, we compare metrics for the 2 pipeline runs to quantify accuracy improvement of AutoML over the baseline model. First, we compare metrics that are calculated for the entire dataset. Since there are 10 unique time series in the test dataset, these individual metrics are aggregated into a single number. The non-normalized metrics can be misleading due to the difference in scales of each unique time series. The following [article (placeholder)](https://review.learn.microsoft.com/en-us/azure/machine-learning/how-to-understand-automated-ml?view=azureml-api-2&branch=pr-en-us-238443#forecasting-metrics-normalization-and-aggregation) explains this topic in a greater detail.\n", + "\n", + "The code in the next cell loads dataset metrics for each of the experiments." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_artifacts_path = os.path.join(\n", + " \"named-outputs\", \"output_files\", \"evaluationResult\"\n", + ")\n", + "\n", + "with open(os.path.join(automl_output_dir, metrics_artifacts_path, \"metrics.json\")) as f:\n", + " metrics_automl_series = json.load(f)\n", + "\n", + "with open(os.path.join(base_output_dir, metrics_artifacts_path, \"metrics.json\")) as f:\n", + " metrics_base_series = json.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we merge two dataframes to examine metrics side by side. The `metrics_all` data frame contains two columns which correspond to the scores from the best HTS and the baseline experiments, respectively. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_automl = (\n", + " pd.Series(metrics_automl_series).to_frame(name=\"score\").reset_index(drop=False)\n", + ")\n", + "metrics_base = (\n", + " pd.Series(metrics_base_series).to_frame(name=\"score\").reset_index(drop=False)\n", + ")\n", + "metrics_all = pd.DataFrame(\n", + " [metrics_automl_series, metrics_base_series], index=[\"score_automl\", \"score_base\"]\n", + ").T\n", + "metrics_all" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 9.1.1 Detailed Metrics\n", + "\n", + "Next, we will load and examine the detailed accuracy metrics since the aggregate metrics may not convey enough information to make a decision about product accuracy. It may be helpful to examine metrics at a more granular level. We will extract metrics per time series. To do this, we create a helper function `extract_specific_metric` which reads the JSON file and returns a specified metric for each time series. Even though the file contains the following metrics, we will we will focus on the normalized root mean squared error (NRMSE) accuracy metric for illustration purposes.
    \n", + "
  • `explained_variance`
  • \n", + "
  • `mean_absolute_error`
  • \n", + "
  • `mean_absolute_percentage_error`
  • \n", + "
  • `median_absolute_error`
  • \n", + "
  • `normalized_median_absolute_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_log_error`
  • \n", + "
  • `r2_score`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
  • `root_mean_squared_error`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_specific_metric(path, metric_name):\n", + " with open(path) as f:\n", + " artifact = json.load(f)\n", + " all_metrics = pd.DataFrame(artifact[\"data\"])\n", + " index_scores = hierarchy_column_names + [metric_name]\n", + " return all_metrics[index_scores]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_table_relative_path = os.path.join(\n", + " metrics_artifacts_path, \"artifacts\", \"forecast_time_series_id_distribution_table\"\n", + ")\n", + "automl_metric = extract_specific_metric(\n", + " os.path.join(automl_output_dir, metrics_table_relative_path),\n", + " \"normalized_root_mean_squared_error\",\n", + ")\n", + "\n", + "base_metric = extract_specific_metric(\n", + " os.path.join(base_output_dir, metrics_table_relative_path),\n", + " \"normalized_root_mean_squared_error\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_df = automl_metric.merge(\n", + " base_metric,\n", + " left_index=True,\n", + " right_index=True,\n", + " how=\"inner\",\n", + " suffixes=[\"_automl\", \"_base\"],\n", + ")\n", + "metrics_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 9.2 Generate Time Series Plots\n", + "\n", + "Here, we generate forecast versus actuals plot for the test set for both HTS and the baseline experiments. Since we use rolling evaluation with the step size of 24 hours, this mimics the behavior of putting both models in production and monitoring their behavior for the duration of the test set. This step helps you make informed decisions about model performance and saves numerous costs associated with productionalizing the model and monitoring its performance in real life. \n", + "\n", + "In the next block of code, we, load the test set output for each of the runs and merge the data. Then, we generate and save time series plots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "forecast_table_relative_path = os.path.join(\n", + " \"named-outputs\", \"forecast_output\", \"raw_forecast\"\n", + ")\n", + "\n", + "forecast_column_name = \"automl_prediction\"\n", + "base_forecast_column_name = \"base_prediction\"\n", + "actual_column_name = \"automl_actual\"\n", + "forecast_origin_column_name = \"forecast_origin\"\n", + "\n", + "automl_fcst = pd.read_parquet(\n", + " os.path.join(automl_output_dir, forecast_table_relative_path)\n", + ")\n", + "base_fcst = pd.read_parquet(os.path.join(base_output_dir, forecast_table_relative_path))\n", + "\n", + "merge_columns = hierarchy_column_names + [actual_column_name]\n", + "merge_columns.extend([time_column_name, forecast_origin_column_name])\n", + "\n", + "backtest = automl_fcst.merge(\n", + " base_fcst.rename(columns={forecast_column_name: base_forecast_column_name}),\n", + " on=merge_columns,\n", + " how=\"inner\",\n", + ")\n", + "\n", + "print(f\"AutoML forecast table size: {automl_fcst.shape}\\n---\")\n", + "print(f\"Base forecast table size: {base_fcst.shape}\\n---\")\n", + "print(f\"Merged forecast table size: {backtest.shape}\\n---\")\n", + "backtest.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from scripts.helper_scripts import draw_one_plot\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib.backends.backend_pdf import PdfPages\n", + "\n", + "plot_filename = \"forecast_vs_actual.pdf\"\n", + "\n", + "pdf = PdfPages(os.path.join(os.getcwd(), \"./output\", plot_filename))\n", + "for _, one_forecast in backtest.groupby(hierarchy_column_names):\n", + " one_forecast[time_column_name] = pd.to_datetime(one_forecast[time_column_name])\n", + " one_forecast.sort_values(time_column_name, inplace=True)\n", + " draw_one_plot(\n", + " one_forecast,\n", + " time_column_name,\n", + " target_column_name,\n", + " hierarchy_column_names,\n", + " [actual_column_name, forecast_column_name, base_forecast_column_name],\n", + " pdf,\n", + " plot_predictions=True,\n", + " )\n", + "pdf.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "IFrame(os.path.join(\"./output/forecast_vs_actual.pdf\"), width=800, height=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. Deployment
\n", + "\n", + "In this section, we will illustrate how to deploy and inference models using batch endpoint. Batch endpoints are endpoints that are used to do batch inferencing on large volumes of data in asynchronous way. Batch endpoints receive pointers to data and run jobs asynchronously to process the data in parallel on compute clusters and store outputs to a datastore for further analysis. For more information on batch endpoints see this [link](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-batch?view=azureml-api-2).\n", + "\n", + "### 10.1. Create Batch Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "import string\n", + "\n", + "# Creating a unique endpoint name by including a random suffix\n", + "allowed_chars = string.ascii_lowercase + string.digits\n", + "endpoint_suffix = \"\".join(random.choice(allowed_chars) for x in range(5))\n", + "endpoint_name = \"sdk-hts-\" + endpoint_suffix\n", + "\n", + "print(f\"Endpoint name: {endpoint_name}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = BatchEndpoint(\n", + " name=endpoint_name,\n", + " description=\"HTS endpoint for component deployments\",\n", + " properties={\"ComponentDeployment.Enabled\": True},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the Endpoint in the workspace usign the MLClient created earlier. This command will start the endpoint creation and return a confirmation response while the endpoint creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_endpoints.begin_create_or_update(endpoint).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.2. Create the Deployment\n", + "\n", + "A deployment is a set of resources required for hosting the model that does the actual inferencing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deployment = PipelineComponentBatchDeployment(\n", + " name=\"sdk-hts-deployment\",\n", + " description=\"HTS deployment.\",\n", + " endpoint_name=endpoint_name,\n", + " component=inference_component_from_registry.id,\n", + " settings={\"default_compute\": amlcompute_cluster_name},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the deployment in the workspace usign the MLClient created earlier. This command will start the deployment creation and return a confirmation response while the deployment creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_deployments.begin_create_or_update(deployment).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.3. Invoke the Endpoint\n", + "\n", + "The next cell contians the command that invokes the endpoint for batch inference job. The `invoke` method contains the `inputs` parameter. This parameter contains the inputs necessary to execute the inference component on the endpoint. To convince yourself this is the case, compare the input parameters for the `inference_component_from_registry` in section 6.3 with the `inputs` we are proving in the next cell. They are identical.\n", + "\n", + "Notice, the the `forecast_mode` is set to `\"recursive\"`. In the evaluation pipeline this component was used to generate rolling forecast to evalaute model performance on the test set. For more details on rolling evaluation, see our [forecasting model evaluation article](placeholder). Here, we are using it to generate a forecast." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = ml_client.batch_endpoints.invoke(\n", + " endpoint_name=endpoint.name,\n", + " deployment_name=deployment.name,\n", + " inputs={\n", + " \"raw_data\": Input(type=AssetTypes.URI_FOLDER, path=\"./data/inference\"),\n", + " \"train_experiment_name\": Input(\n", + " type=\"string\", default=evaluation_experiment_name\n", + " ),\n", + " \"max_nodes\": Input(type=\"integer\", default=1),\n", + " \"max_concurrency_per_node\": Input(type=\"integer\", default=5),\n", + " \"compute_name\": Input(type=\"string\", default=amlcompute_cluster_name),\n", + " \"forecast_mode\": Input(type=\"string\", default=\"recursive\"),\n", + " \"forecast_level\": Input(type=\"string\", default=\"customer_id\"),\n", + " \"parallel_step_timeout_in_seconds\": Input(type=\"integer\", default=3700),\n", + " \"allocation_method\": Input(\n", + " type=\"string\", default=\"average_historical_proportions\"\n", + " ),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will stream the job output to monitor the execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job_name = job.name\n", + "batch_job = ml_client.jobs.get(name=job_name)\n", + "print(f\"Batch job status: {batch_job.status}\\n---\")\n", + "ml_client.jobs.stream(name=job_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.4. Download Forecast Output\n", + "\n", + "Finally, we download the forecast output and print the first few rows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Check that the run result was posted on Azure\n", + "final_state = (\"Completed\", \"Failed\")\n", + "while (\n", + " batch_job.status not in final_state\n", + " or len(list(ml_client.jobs.list(parent_job_name=batch_job.name))) < 3\n", + "):\n", + " print(\"The runs were not posted... Re-trying in 10 seconds.\\n---\")\n", + " batch_job = ml_client.jobs.get(name=job_name)\n", + " sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_output_dir = os.path.join(os.getcwd(), \"forecast\")\n", + "\n", + "for child in ml_client.jobs.list(parent_job_name=job.name):\n", + " print(f\"{child.name}\\n---\")\n", + " if child.properties[\"azureml.moduleName\"] == \"automl_hts_inference_collect_step\":\n", + " print(\"Downloading data ...\\n---\")\n", + " for attempt in range(3):\n", + " print(f\"Attempt: {attempt}\")\n", + " try:\n", + " ml_client.jobs.download(\n", + " child.name, download_path=fcst_output_dir, output_name=\"metadata\"\n", + " )\n", + " break\n", + " except BaseException:\n", + " sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_df = pd.read_parquet(\n", + " os.path.join(fcst_output_dir, \"named-outputs\", \"metadata\", \"raw_forecast\")\n", + ")\n", + "fcst_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.5. [Optional] Delete the Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.online_endpoints.begin_delete(name=endpoint.name).wait()" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python310-sdkv2" + }, + "kernelspec": { + "display_name": "Python 3.10 - SDK v2", + "language": "python", + "name": "python310-sdkv2" + }, + "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.10.9" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/scripts/helper_scripts.py b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/scripts/helper_scripts.py new file mode 100644 index 0000000000..80c76e8756 --- /dev/null +++ b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/scripts/helper_scripts.py @@ -0,0 +1,53 @@ +import pandas as pd + +from typing import Any, Dict, List, Optional, Tuple, Union +from matplotlib import pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages + + +def _format_grain_name(grain: Union[str, Tuple[str], List[str]]) -> str: + """ + Convert grain name to string. + + :param grain: the grain name. + :return: the string representation of the given grain. + """ + if not isinstance(grain, tuple) and not isinstance(grain, list): + return str(grain) + grain = list(map(str, grain)) + return "|".join(grain) + + +def draw_one_plot( + df: pd.DataFrame, + time_column_name: str, + target_column_name: str, + grain_column_names: List[str], + columns_to_plot: List[str], + pdf: PdfPages, + plot_predictions=False, +) -> None: + """ + Draw the single plot. + + :param df: The data frame with the data to build plot. + :param time_column_name: The name of a time column. + :param grain_column_names: The name of grain columns. + :param pdf: The pdf backend used to render the plot. + """ + if isinstance(grain_column_names, str): + grain_column_names = [grain_column_names] + fig, _ = plt.subplots(figsize=(20, 10)) + df = df.set_index(time_column_name) + plt.plot(df[columns_to_plot]) + plt.xticks(rotation=45) + if grain_column_names: + grain_name = [df[grain].iloc[0] for grain in grain_column_names] + plt.title(f"Time series ID: {_format_grain_name(grain_name)}") + plt.legend(columns_to_plot) + plt.close(fig) + pdf.savefig(fig) + + +if __name__ == "__main__": + pass diff --git a/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb new file mode 100644 index 0000000000..d91310240e --- /dev/null +++ b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb @@ -0,0 +1,1493 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Automated Machine Learning\n", + "\n", + "## Demand Forecasting Using Many Models (preview)\n", + "\n", + "> [!IMPORTANT]\n", + "> Items marked (preview) in this article are currently in public preview.\n", + "> The preview version is provided without a service level agreement, and it's not recommended for production workloads. Certain features might not be supported or might have constrained capabilities.\n", + "> For more information, see [Supplemental Terms of Use for Microsoft Azure Previews](https://azure.microsoft.com/support/legal/preview-supplemental-terms/).\n", + "\n", + "## Contents\n", + "1. [Introduction](#Introduction)\n", + "1. [Setup](#Setup)\n", + "1. [Compute](#Compute)\n", + "1. [Data](#Data)\n", + "1. [Import Components From Registry](#ImportComponents)\n", + "1. [Create a Pipeline](#CreatePipeline)\n", + "1. [Kick Off Pipeline Runs](#PipelineRuns)\n", + "1. [Download Output](#DownloadOutput)\n", + "1. [Compare Evaluation Results](#CompareResults)\n", + "1. [Deployment](#Deployment)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Introduction \n", + "\n", + "The objective of this notebook is to illustrate how to use the component-based AutoML many models solution for demand forecasting tasks. It walks you through all stages of model evaluation and production process starting with data ingestion and concluding with batch endpoint deployment for production.\n", + "\n", + "We use a subset of UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)) with the objective of predicting electricity demand per consumer 24 hours ahead. The data was preprocessed using the [data prep notebook](https://github.com/Azure/azureml-examples/blob/main/v1/python-sdk/tutorials/automl-with-azureml/forecasting-data-preparation/auto-ml-forecasting-data-preparation.ipynb). Please refer to it for illustration on how to download the data from the source, aggregate to an hourly frequency, convert from wide to long format and upload to the Datastore. Here, we will work with the data that has been pre-processed and saved the public datastore in the csv format.\n", + "\n", + "There are a number of steps you need to take before you can put a model into production. A user needs to prepare the data, partition it into appropriate sets, select the best model, evaluate it against a baseline, and monitor the model in real life to collect enough observations on how it would perform had it been put in production. Some of these steps are time consuming, some require certain expertise in writing code. The steps shown in this notebook follow a typical thought process one follows before the model is put in production.\n", + "\n", + "Make sure you have executed the [configuration](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) before running this notebook." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Setup " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "gather": { + "logged": 1682992408484 + } + }, + "outputs": [], + "source": [ + "# Import required libraries\n", + "import os\n", + "import datetime\n", + "import json\n", + "import yaml\n", + "import azure.ai.ml\n", + "\n", + "import pandas as pd\n", + "\n", + "from time import sleep\n", + "\n", + "from azure.identity import DefaultAzureCredential, InteractiveBrowserCredential\n", + "\n", + "from azure.ai.ml import MLClient, Input, Output\n", + "from azure.ai.ml import load_component\n", + "from azure.ai.ml.constants import AssetTypes\n", + "from azure.ai.ml.dsl import pipeline\n", + "from azure.ai.ml.entities import (\n", + " BatchEndpoint,\n", + " BatchDeployment,\n", + " AmlCompute,\n", + " PipelineComponentBatchDeployment,\n", + ")\n", + "\n", + "print(f\"SDK version: {azure.ai.ml.__version__}\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1. Configure workspace details and get a handle to the workspace\n", + "\n", + "The [workspace](https://docs.microsoft.com/en-us/azure/machine-learning/concept-workspace) is the top-level resource for Azure Machine Learning, providing a centralized place to work with all the artifacts you create when you use Azure Machine Learning. In this section we will connect to the workspace in which the job will be run.\n", + "\n", + "To connect to a workspace, we need identifier parameters - a subscription, resource group and workspace name. We will use these details in the `MLClient` from `azure.ai.ml` to get a handle to the required Azure Machine Learning workspace. We use the default [default azure authentication](https://docs.microsoft.com/en-us/python/api/azure-identity/azure.identity.defaultazurecredential?view=azure-python) for this tutorial. Check the [configuration notebook](https://github.com/Azure/MachineLearningNotebooks/blob/master/configuration.ipynb) for more details on how to configure credentials and connect to a workspace." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " credential = DefaultAzureCredential()\n", + " # Check if given credential can get token successfully.\n", + " credential.get_token(\"https://management.azure.com/.default\")\n", + "except Exception as ex:\n", + " # Fall back to InteractiveBrowserCredential in case DefaultAzureCredential does not work\n", + " credential = InteractiveBrowserCredential()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "try:\n", + " ml_client = MLClient.from_config(credential)\n", + "except Exception as ex:\n", + " print(ex)\n", + " # Enter details of your AML workspace\n", + " subscription_id = \"\"\n", + " resource_group = \"\"\n", + " workspace = \"\"\n", + " ml_client = MLClient(credential, subscription_id, resource_group, workspace)\n", + " print(ml_client)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 2.2. Show Azure ML Workspace information" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ws = ml_client.workspaces.get(name=ml_client.workspace_name)\n", + "\n", + "output = {}\n", + "output[\"Workspace\"] = ml_client.workspace_name\n", + "output[\"Subscription ID\"] = ml_client.connections._subscription_id\n", + "output[\"Resource Group\"] = ws.resource_group\n", + "output[\"Location\"] = ws.location\n", + "pd.DataFrame(data=output, index=[\"\"]).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Compute \n", + "\n", + "#### Create or Attach existing AmlCompute\n", + "\n", + "You will need to create a compute target for your AutoML run. In this tutorial, you will create AmlCompute as your training compute resource.\n", + "\n", + "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist.\n", + "\n", + "\n", + "Here, we use a 5 node cluster of the `STANDARD_DS15_V2` series for illustration purposes. You will need to adjust the compute type and the number of nodes based on your needs which can be driven by the speed needed for model selection, data size, etc. \n", + "\n", + "#### Creation of AmlCompute takes approximately 5 minutes. \n", + "If the AmlCompute with that name is already in your workspace, this code will skip the creation process.\n", + "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.core.exceptions import ResourceNotFoundError\n", + "\n", + "amlcompute_cluster_name = \"demand-fcst-mm-cluster\"\n", + "\n", + "try:\n", + " # Retrieve an already attached Azure Machine Learning Compute.\n", + " compute_target = ml_client.compute.get(amlcompute_cluster_name)\n", + "except ResourceNotFoundError as e:\n", + " compute_target = AmlCompute(\n", + " name=amlcompute_cluster_name,\n", + " size=\"STANDARD_DS15_V2\",\n", + " type=\"amlcompute\",\n", + " min_instances=0,\n", + " max_instances=5,\n", + " idle_time_before_scale_down=600,\n", + " )\n", + " poller = ml_client.begin_create_or_update(compute_target)\n", + " poller.wait()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Data \n", + "\n", + "For illustration purposes we use the UCI electricity data ([link](https://archive.ics.uci.edu/ml/datasets/ElectricityLoadDiagrams20112014#)). The original dataset contains electricity consumption data for 370 consumers measured at 15 minute intervals. In the data set for this demonstrations, we have aggregated to an hourly frequency and converted to the kilowatt hours (kWh) for 10 customers.\n", + "\n", + "The data for this notebook is located in the `automl-sample-notebook-data` container in the datastore and is publicly available. In the next few cells, we will download the train, test and inference datasets from the public datastore and store them locally in the _parquet_ format." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "train_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-mm/train/uci_electro_small_mm_train.parquet\"\n", + "test_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-mm/test/uci_electro_small_mm_test.parquet\"\n", + "inference_data_path = \"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/uci-demand-pipeline-data-mm/inference/uci_electro_small_mm_inference.parquet\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_column_name = \"datetime\"\n", + "target_column_name = \"usage\"\n", + "time_series_id_column_names = [\"customer_id\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def create_folder_and_save_as_parquet(file_uri, output_folder):\n", + " os.makedirs(output_folder, exist_ok=True)\n", + " data_frame = pd.read_parquet(file_uri)\n", + " file_name = os.path.split(file_uri)[-1]\n", + " data_path = os.path.join(output_folder, file_name)\n", + " data_frame.to_parquet(data_path, index=False)\n", + " return None\n", + "\n", + "\n", + "create_folder_and_save_as_parquet(train_data_path, \"./data/train\")\n", + "create_folder_and_save_as_parquet(test_data_path, \"./data/test\")\n", + "create_folder_and_save_as_parquet(inference_data_path, \"./data/inference\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following cells read and print the first few rows of the training data as well as the number of unique time series in the dataset." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_parquet(\"./data/train/\")\n", + "df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "nseries = df.groupby(time_series_id_column_names).ngroups\n", + "print(f\"Data contains {nseries} individual time series\\n---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 5. Import Components From Registry \n", + "\n", + "An Azure Machine Learning component is a self-contained piece of code that does one step in a machine learning pipeline. A component is analogous to a function - it has a name, inputs, outputs, and a body. Components are the building blocks of the Azure Machine Learning pipelines. It's a good engineering practice to build a machine learning pipeline where each step has well-defined inputs and outputs. In Azure Machine Learning, a component represents one reusable step in a pipeline. Components are designed to help improve the productivity of pipeline building. Specifically, components offer:\n", + "- Well-defined interface: Components require a well-defined interface (input and output). The interface allows the user to build steps and connect steps easily. The interface also hides the complex logic of a step and removes the burden of understanding how the step is implemented.\n", + "\n", + "- Share and reuse: As the building blocks of a pipeline, components can be easily shared and reused across pipelines, workspaces, and subscriptions. Components built by one team can be discovered and used by another team.\n", + "\n", + "- Version control: Components are versioned. The component producers can keep improving components and publish new versions. Consumers can use specific component versions in their pipelines. This gives them compatibility and reproducibility.\n", + "\n", + "For a more detailed information on this subject, refer to the this [link](https://learn.microsoft.com/en-us/azure/machine-learning/concept-component?view=azureml-api-2).\n", + "\n", + "To import components, we need to get the registry. The following command obtains the public regsitry from which we will import components for our experiment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682992409837 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "# get registry for all components\n", + "ml_client_registry = MLClient(credential=credential, registry_name=\"azureml\")\n", + "print(ml_client_registry)\n", + "print(\"---\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we pull specific components and use them to build a pipeline of steps. For the illustration of the product evaluation workflow we will use the following components:\n", + "- Data partitioning component: allows users to partion the data for many models runs, both, training and inference.\n", + "- Many models training component: trains the best model per partition specified by users.\n", + "- Many moodels inference componnet: generates forecast for each partition. This can be done on the test and inference sets.\n", + "- Compute metrics component: calculates metrics per time series if the inference component was used on a test set." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "partition_component_from_registry = ml_client_registry.components.get(\n", + " name=\"automl_tabular_data_partitioning\", label=\"latest\"\n", + ")\n", + "print(\n", + " f\"Data partitioning component version: {partition_component_from_registry.version}\\n---\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682992443218 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "train_component_from_registry = ml_client_registry.components.get(\n", + " name=\"automl_many_models_training\",\n", + " label=\"latest\",\n", + ")\n", + "print(\n", + " f\"Many models training component version: {train_component_from_registry.version}\\n---\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996405805 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "outputs": [], + "source": [ + "inference_component_from_registry = ml_client_registry.components.get(\n", + " name=\"automl_many_models_inference\", label=\"latest\"\n", + ")\n", + "print(\n", + " f\"Many models inference component version: {train_component_from_registry.version}\\n---\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996406713 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "compute_metrics_component = ml_client_registry.components.get(\n", + " name=\"compute_metrics\",\n", + " version=\"0.0.10\", # label=\"latest\"\n", + ")\n", + "print(\n", + " f\"Many models inference component version: {compute_metrics_component.version}\\n---\"\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "gather": { + "logged": 1682996406974 + }, + "jupyter": { + "outputs_hidden": false, + "source_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "tags": [] + }, + "source": [ + "## 6. Create a Pipeline \n", + "\n", + "Now that we imported the components we will build an evaluation pipeline. This pipeline will allow us to partition the data, train best models for each partition, genererate rolling forecasts on the test set, and, finally, calculate metrics on the test set output." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.1. Create a YML\n", + "\n", + "AzureML components can only receive specific object types such as strings, JSON/YML files, URI Folders and URI Files. Other object types are not accepted. Because of this, the settings needs to be passed into the training component in YML format.\n", + "\n", + "The following are the bare-minimum parameters needed to successfully train many models. For a finer control of the experiment a user may add other parameters to the config file. See the [forecast settings API doc](https://learn.microsoft.com/en-us/python/api/azure-ai-ml/azure.ai.ml.automl.forecastingjob#azure-ai-ml-automl-forecastingjob-set-forecast-settings) for a complete list of available parameters. \n", + "\n", + "|Property|Description|\n", + "|-|-|\n", + "| **task** | forecasting |\n", + "| **primary_metric** | This is the metric that you want to optimize. Forecasting supports the following primary metrics
  • `normalized_root_mean_squared_error`
  • `normalized_mean_absolute_error`
  • `spearman_correlation`
  • `r2_score`
We recommend using either the normalized root mean squared error or normalized mean absolute erorr as a primary metric because they measure forecast accuracy. See the [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-automl-forecasting-faq#how-do-i-choose-the-primary-metric) for a more detailed discussion on this topic. |\n", + "| **forecast_horizon** | The forecast horizon is how many periods forward you would like to forecast. This integer horizon is in units of the timeseries frequency (e.g. daily, weekly). |\n", + "| **label_column_name** | The name of the target column we are trying to predict. |\n", + "| **time_column_name** | The name of your time column. |\n", + "| **time_series_id_column_names** | The column names used to uniquely identify timeseries in data that has multiple rows with the same timestamp. |\n", + "| **enable_early_stopping** | Flag to enable early termination if the primary metric is no longer improving. |\n", + "| **partition_column_names** | The names of columns used to group your models. For timeseries, the groups must not split up individual time-series. That is, each group must contain one or more whole time-series. |\n", + "| **allow_multi_partitions** | A flag that allows users to train one model per partition when each partition contians more than one unique time series. The dafault value is `False`. |\n", + "| **track_child_runs** | Flag to disable tracking of child runs. Only best run is tracked if the flag is set to False (this includes the model and metrics of the run). |\n", + "| **enable_early_stopping** | Flag to enable early termination if the primary metric is no longer improving. |\n", + "| **max_trials** | Represents the maximum number of trials an Automated ML job can try to run a training algorithm with different combination of hyperparameters. Its default value is set to 1000. If `enable_early_stopping` is defined, then the number of trials used to run training algorithms can be smaller.|\n", + "| **timeout_minutes** | Maximum amount of time in minutes that the whole AutoML job can take before the job terminates. This timeout includes setup, featurization and training runs but does not include the ensembling and model explainability runs at the end of the process since those actions need to happen once all the trials (children jobs) are done. If not specified, the default job's total timeout is 6 days (8,640 minutes). To specify a timeout less than or equal to 1 hour (60 minutes), make sure your dataset's size is not greater than 10,000,000 (rows times column) or an error results. |\n", + "| **trial_timeout_minutes** | Maximum time in minutes that each trial (child job) can run for before it terminates. If not specified, a value of 1 month or 43200 minutes is used. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "max_horizon = 24\n", + "partition_column_names = [\"customer_id\"]\n", + "allow_multi_partitions = False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "# Required parameters\n", + "automl_settings = dict(\n", + " task=\"forecasting\",\n", + " primary_metric=\"normalized_root_mean_squared_error\",\n", + " debug_log=\"debug.txt\",\n", + " label_column_name=target_column_name,\n", + " time_column_name=time_column_name,\n", + " forecast_horizon=max_horizon,\n", + " time_series_id_column_names=time_series_id_column_names,\n", + " partition_column_names=partition_column_names,\n", + " max_trials=25,\n", + " timeout_minutes=60,\n", + " trial_timeout_minutes=5,\n", + " n_cross_validations=2,\n", + " forecast_step=max_horizon,\n", + " track_child_runs=False,\n", + " enable_early_stopping=True,\n", + " allow_multi_partitions=allow_multi_partitions,\n", + ")\n", + "pd.DataFrame(data=automl_settings, index=[\"\"]).T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we save these settings as the `automl_settings.yml` file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"automl_settings.yml\", \"w\") as file:\n", + " yaml.dump(automl_settings, file)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.2. Provide additional pipeline parameters\n", + "\n", + "The next set of parameters is necessary to build the pipeline of components. These parameters are specific to the many models training and/or inference components. Since both of these components rely on the Parallel run step (PRS) to train/inference multiple models at once, you will need to determine the appropriate number of workers and nodes for your use case. The `max_concurrency_per_node` is based off the number of cores of the compute VM. The `max_nodes` will determine the number of nodes to use, increasing the node count will speed up the training process.\n", + "\n", + "|Property|Description|\n", + "|:-|:-|\n", + "| **max_nodes** | The number of compute nodes in a cluster to be used for training and inferencing steps. We recommend to start with 3 and increase the node_count if the training time is taking too long. |\n", + "| **max_concurrency_per_node** | Process count per node. We recommend a 2:1 ratio for number of cores to the number of processes per node. For example, if a node has 16 cores then configure 8 **or less** process counts per node for optimal performance. |\n", + "|**retrain_failed_model**| If training a model for any partition fails, should AutoML kick off a new child run for that partition? Possible values are `True` or `False`.|\n", + "|**forecast_mode**| Type of forecat to perform on the test set. Can be `recursive` or `rolling`. Rolling forecast can be used for the evaluation purposes. |\n", + "|**forecast_step**| The forecast step used for rolling forecast. See this [link](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-auto-train-forecast?view=azureml-api-2#evaluating-model-accuracy-with-a-rolling-forecast) for more details on this parameter. |\n", + "| **parallel_step_timeout_in_seconds** | Maximum amount of time in seconds that the `ParallelRunStep` class is allowed. This is optional but provides customers with greater control on exit criteria. This must be greater than `experiment_timeout_hours` by at least 300 seconds. |\n", + "|**partition_column_names**| The names of columns used to group your models. For timeseries, the groups must not split up individual time-series. That is, each group must contain one or more whole time-series. This parameter is identical to the one in the `automl_config` object.|\n", + "|**compute_name**| Name of the compute to execute the pipeline on. |\n", + "|**enable_event_logger**| Set this value to `True` to enable event logger. |\n", + "| **input_type** | Type of file format for the input data. Supported options are `csv` and `parquet`. |" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Pipeline parameters\n", + "pipeline_parameters = dict(\n", + " max_nodes=1,\n", + " max_concurrency_per_node=10,\n", + " retrain_failed_model=True,\n", + " forecast_mode=\"rolling\",\n", + " forecast_step=max_horizon,\n", + " parallel_step_timeout_in_seconds=3700,\n", + " partition_column_names=partition_column_names,\n", + " compute_name=amlcompute_cluster_name,\n", + " enable_event_logger=True,\n", + " input_type=\"parquet\",\n", + ")\n", + "print(\"Pipeline parameters\\n---\")\n", + "display(pd.DataFrame(data=pipeline_parameters, index=[\"\"]).T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The data partitioning component allows us to partition the large datasets and should be used when the data is too large to be partitioned on a single node. If your dataset is small relative to the RAM of a single node in your cluster, you most likely do not need this component since both training and inference components perform data partitionining as part of their internal work flow. The partitioning that takes place inside these components is done on a single node of the cluster the pipeline is executed on. \n", + "\n", + "If the data is too big to be handled internally (we are talking about size that are large than 2GB of data and the compute RAM of 28GB or less), you may want to use the partitioning component which uses spark cluster for the job. Since the data we are working with is is not big, we do not need the partitioning component. However, this notebook is written to handle both scenarios. If you choose to run a spark job, you need to specify a separate set of parameters to the pipeline builder which must incude the following:\n", + "\n", + "|Property|Description|\n", + "|:-|:-|\n", + "| **instance_type** | A key that defines the compute instance type to be used for the serverless Spark compute. The following instance types are currently supported:
  • `Standard_E4S_V3`
  • `Standard_E8S_V3`
  • `Standard_E16S_V3`
  • `Standard_E32S_V3`
  • `Standard_E64S_V3`
|\n", + "| **runtime_version** | A key that defines the Spark runtime version. The following Spark runtime versions are currently supported:
  • `3.1.0`
  • `3.2.0`
|\n", + "| **driver_cores** | The he number of cores allocated for the Spark driver. |\n", + "| **driver_memory** | The allocated memory for the Spark exedriver, with a size unit suffix `k`, `m`, `g` or `t` (for example, `512m`, `2g`). |\n", + "| **executor_cores** | The number of cores allocated for the Spark executor. |\n", + "| **executor_memory** | The allocated memory for the Spark executor, with a size unit suffix `k`, `m`, `g` or `t` (for example, `512m`, `2g`). |\n", + "| **executor_instances** | The number of Spark executor instances|\n", + "\n", + "All of these parameters are described in [this document](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-submit-spark-jobs?view=azureml-api-2&tabs=sdk). In this notebook we are using the serverless spark cluster, so we may not have the attached spark workspace." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To distinguish whether the pipeline uses the partitioning component, we use the `USE_PARTITIONING_COMPONENT` parameter. When it is set to `True`, partitioning component is added the pipeline in section 6.3. Since the dataset we are working with is small, there is no need for this component, so we set the parameter value to `False` in the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "USE_PARTITIONING_COMPONENT = False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display\n", + "\n", + "# Spark parameters (optional)\n", + "if USE_PARTITIONING_COMPONENT:\n", + " spark_parameters = dict(\n", + " instance_type=\"Standard_E4S_V3\",\n", + " runtime_version=\"3.2.0\",\n", + " driver_cores=1,\n", + " driver_memory=\"2g\",\n", + " executor_cores=2,\n", + " executor_memory=\"2g\",\n", + " executor_instances=2,\n", + " )\n", + " print(\"Spark parameters\\n---\")\n", + " display(pd.DataFrame(data=spark_parameters, index=[\"\"]).T)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.3. Build a Pipeline\n", + "\n", + "Next, we build a pipeline from the imported components. Since this notebook is designed to illustrate the evaluation flow, we will string these components in the following fashion. First, we train the best model for each partition. Then, we generate a rolling forecast with the step size of 24 (hours) on the test set. This is done to mimic the evaluation process when a customer is tracking model's performance in real time and generates forecasts every 24 hours. Finally, we compute metrics based on the rolling forecast output from the previous step. You do not have to modify anything in the next cell." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996407118 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], + "source": [ + "@pipeline(description=\"AutoML Forecasting Many Models Evaluation Pipeline\")\n", + "def evaluation_pipeline(raw_data, inference_data, automl_config):\n", + " # 0. Extract pipeline parameters from the dictionary\n", + " partition_column_names = \" \".join(pipeline_parameters.get(\"partition_column_names\"))\n", + " compute_name = pipeline_parameters.get(\"compute_name\")\n", + " max_concurrency_per_node = pipeline_parameters.get(\"max_concurrency_per_node\")\n", + " parallel_step_timeout_in_seconds = pipeline_parameters.get(\n", + " \"parallel_step_timeout_in_seconds\", 3700\n", + " )\n", + " max_nodes = pipeline_parameters.get(\"max_nodes\", 1)\n", + " enable_event_logger = pipeline_parameters.get(\"enable_event_logger\", True)\n", + " retrain_failed_model = pipeline_parameters.get(\"retrain_failed_model\", True)\n", + " forecast_mode = pipeline_parameters.get(\"forecast_mode\", \"recursive\")\n", + " forecast_step = pipeline_parameters.get(\"forecast_step\", 1)\n", + " input_type = pipeline_parameters.get(\"input_type\", \"csv\")\n", + "\n", + " if USE_PARTITIONING_COMPONENT:\n", + " # 1. Data partitioning step\n", + " partition_step = partition_component_from_registry(\n", + " raw_data=raw_data,\n", + " partition_column_names=partition_column_names,\n", + " input_type=pipeline_parameters.get(\"input_type\", \"csv\"),\n", + " )\n", + "\n", + " partition_step.resources = {\n", + " \"instance_type\": spark_parameters.get(\"instance_type\", \"Standard_E4S_V3\"),\n", + " \"runtime_version\": str(spark_parameters.get(\"runtime_version\", \"3.2.0\")),\n", + " }\n", + " partition_step.conf = {\n", + " \"spark.driver.cores\": spark_parameters.get(\"driver_cores\", 1),\n", + " \"spark.driver.memory\": str(spark_parameters.get(\"driver_memory\", \"2g\")),\n", + " \"spark.executor.cores\": spark_parameters.get(\"executor_cores\", 2),\n", + " \"spark.executor.memory\": str(spark_parameters.get(\"executor_memory\", \"2g\")),\n", + " \"spark.executor.instances\": spark_parameters.get(\"executor_instances\", 2),\n", + " }\n", + " partition_step.outputs.partitioned_data.mode = \"direct\"\n", + "\n", + " # 2. Model training step\n", + " training_node = train_component_from_registry(\n", + " raw_data=partition_step.outputs.partitioned_data,\n", + " automl_config=automl_config,\n", + " max_concurrency_per_node=max_concurrency_per_node,\n", + " parallel_step_timeout_in_seconds=parallel_step_timeout_in_seconds,\n", + " max_nodes=max_nodes,\n", + " retrain_failed_model=retrain_failed_model,\n", + " compute_name=compute_name,\n", + " )\n", + " else:\n", + " # 2. Model training step\n", + " training_node = train_component_from_registry(\n", + " raw_data=raw_data,\n", + " automl_config=automl_config,\n", + " max_concurrency_per_node=max_concurrency_per_node,\n", + " parallel_step_timeout_in_seconds=parallel_step_timeout_in_seconds,\n", + " max_nodes=max_nodes,\n", + " retrain_failed_model=retrain_failed_model,\n", + " compute_name=compute_name,\n", + " )\n", + "\n", + " # 3. Inferencing step\n", + " inference_node = inference_component_from_registry(\n", + " raw_data=inference_data,\n", + " max_nodes=max_nodes,\n", + " max_concurrency_per_node=max_concurrency_per_node,\n", + " parallel_step_timeout_in_seconds=parallel_step_timeout_in_seconds,\n", + " optional_train_metadata=training_node.outputs.run_output,\n", + " forecast_mode=forecast_mode,\n", + " forecast_step=forecast_step,\n", + " compute_name=compute_name,\n", + " )\n", + "\n", + " # 4. Metrics calculation step\n", + " compute_metrics_node = compute_metrics_component(\n", + " task=\"tabular-forecasting\",\n", + " prediction=inference_node.outputs.evaluation_data,\n", + " ground_truth=inference_node.outputs.evaluation_data,\n", + " evaluation_config=inference_node.outputs.evaluation_configs,\n", + " )\n", + " compute_metrics_node.compute = compute_name\n", + "\n", + " # 5. Specify pipeline outputs\n", + " return {\n", + " \"output_files\": compute_metrics_node.outputs.evaluation_result,\n", + " \"forecast_output\": inference_node.outputs.raw_predictions,\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7. Kick Off Pipeline Runs
\n", + "\n", + "Now that the pipeline is defined, we will use it to kick off several runs. First, we will kick off an experiment which will train, inference and evaluate the performance for the best AutoML model for each partition. Next, we will kick off the same pipeline which will only use the naive model for the same partitions. This will allow us to establish a baseline and compare performance results." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.1. Kick Off Best Many Model Pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682996407285 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline_job = evaluation_pipeline(\n", + " raw_data=Input(type=AssetTypes.URI_FOLDER, path=\"./data/train\"),\n", + " inference_data=Input(type=AssetTypes.URI_FOLDER, path=\"./data/test\"),\n", + " automl_config=Input(type=AssetTypes.URI_FILE, path=\"./automl_settings.yml\"),\n", + ")\n", + "if not USE_PARTITIONING_COMPONENT:\n", + " pipeline_job.settings.default_compute = amlcompute_cluster_name\n", + "print(pipeline_job)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "gather": { + "logged": 1682997237524 + }, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + }, + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "evaluation_experiment_name = \"mm-experiment-\" + datetime.datetime.now().strftime(\n", + " \"%Y%m%d\"\n", + ")\n", + "\n", + "pipeline_submitted_job = ml_client.jobs.create_or_update(\n", + " pipeline_job,\n", + " experiment_name=evaluation_experiment_name,\n", + " skip_validation=True,\n", + ")\n", + "ml_client.jobs.stream(pipeline_submitted_job.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rehydrate run\n", + "# RUN_ID = \"\"\n", + "# pipeline_submitted_job = ml_client.jobs.get(RUN_ID)\n", + "# pipeline_submitted_job" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.2. Kick Off the Baseline Experiment\n", + "\n", + "To establish a baseline, we will use the same pipeline as before with one minore change. We will add Naive model to the allowed model list and change the number of rolling origin cross validations (ROCV) to 2. Reducing the ROCV speeds up the runtime and is needed for model selection only, while in this run we have only one model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "baseline_settings = automl_settings.copy()\n", + "baseline_settings.update(\n", + " {\"allowed_training_algorithms\": [\"Naive\"], \"n_cross_validations\": 2}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Similarly to what we have done in section 6.3, we save the baseline experiment settings to as a YAML file." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"automl_settings_base.yml\", \"w\") as file:\n", + " yaml.dump(baseline_settings, file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "scrolled": true, + "tags": [] + }, + "outputs": [], + "source": [ + "pipeline_job_base = evaluation_pipeline(\n", + " raw_data=Input(type=AssetTypes.URI_FOLDER, path=\"./data/train\"),\n", + " inference_data=Input(type=AssetTypes.URI_FOLDER, path=\"./data/test\"),\n", + " automl_config=Input(type=\"uri_file\", path=\"./automl_settings_base.yml\"),\n", + ")\n", + "if not USE_PARTITIONING_COMPONENT:\n", + " pipeline_job_base.settings.default_compute = amlcompute_cluster_name\n", + "print(pipeline_job_base)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "base_experiment_name = \"mm-experiment-base-\" + datetime.datetime.now().strftime(\n", + " \"%Y%m%d\"\n", + ")\n", + "\n", + "pipeline_submitted_job_base = ml_client.jobs.create_or_update(\n", + " pipeline_job_base,\n", + " experiment_name=base_experiment_name,\n", + " skip_validation=True,\n", + ")\n", + "ml_client.jobs.stream(pipeline_submitted_job_base.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# To rehydrate baseline run\n", + "# RUN_ID = \"\"\n", + "# pipeline_submitted_job_base = ml_client.jobs.get(RUN_ID)\n", + "# pipeline_submitted_job_base" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 8. Download Pipeline Output \n", + "Next, we will download the output files generated by the compute metrics components for each executed pipeline and save them in the corresponfing subfolder of the `output` folder. First, we create corresponding output directories. Then, we execute the `ml_client.jobs.download` command which downloads experiments' outputs." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create output directories\n", + "mm_output_dir = os.path.join(os.getcwd(), \"output/many-models\")\n", + "base_output_dir = os.path.join(os.getcwd(), \"output/base\")\n", + "\n", + "os.makedirs(mm_output_dir, exist_ok=True)\n", + "os.makedirs(base_output_dir, exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " pipeline_submitted_job.name, download_path=mm_output_dir, output_name=\"output_files\"\n", + ")\n", + "ml_client.jobs.download(\n", + " pipeline_submitted_job_base.name,\n", + " download_path=base_output_dir,\n", + " output_name=\"output_files\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.jobs.download(\n", + " pipeline_submitted_job.name,\n", + " download_path=mm_output_dir,\n", + " output_name=\"forecast_output\",\n", + ")\n", + "\n", + "ml_client.jobs.download(\n", + " pipeline_submitted_job_base.name,\n", + " download_path=base_output_dir,\n", + " output_name=\"forecast_output\",\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "source": [ + "## 9. Compare Evaluation Results \n", + "\n", + "### 9.1. Examine Metrics\n", + "\n", + "In this section, we compare metrics for the 2 pipeline runs to quantify accuracy improvement of AutoML over the baseline model. First, we compare metrics that are calculated for the entire dataset. Since there are 10 unique time series in the test dataset, these individual metrics are aggregated into a single number. The non-normalized metrics can be misleading due to the difference in scales of each unique time series. The following [article (placeholder)](https://review.learn.microsoft.com/en-us/azure/machine-learning/how-to-understand-automated-ml?view=azureml-api-2&branch=pr-en-us-238443#forecasting-metrics-normalization-and-aggregation) explains this topic in a greater detail.\n", + "\n", + "The code in the next cell loads dataset metrics for each of the experiments." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_artifacts_path = os.path.join(\n", + " \"named-outputs\", \"output_files\", \"evaluationResult\"\n", + ")\n", + "\n", + "with open(os.path.join(mm_output_dir, metrics_artifacts_path, \"metrics.json\")) as f:\n", + " metrics_automl_series = json.load(f)\n", + "\n", + "with open(os.path.join(base_output_dir, metrics_artifacts_path, \"metrics.json\")) as f:\n", + " metrics_base_series = json.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we merge two dataframes to examine metrics side by side. The `metrics_all` data frame contains two columns which correspond to the scores from the many models and the baseline experiments, respectively. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_automl = (\n", + " pd.Series(metrics_automl_series).to_frame(name=\"score\").reset_index(drop=False)\n", + ")\n", + "metrics_base = (\n", + " pd.Series(metrics_base_series).to_frame(name=\"score\").reset_index(drop=False)\n", + ")\n", + "metrics_all = pd.DataFrame(\n", + " [metrics_automl_series, metrics_base_series], index=[\"score_automl\", \"score_base\"]\n", + ").T\n", + "metrics_all" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 9.1.1 Detailed Metrics\n", + "\n", + "Next, we will load and examine the detailed accuracy metrics since the aggregate metrics may not convey enough information to make a decision about product accuracy. It may be helpful to examine metrics at a more granular level. We will extract metrics per time series. To do this, we create a helper function `extract_specific_metric` which reads the JSON file and returns a specified metric for each time series. Even though the file contains the following metrics, we will we will focus on the normalized root mean squared error (NRMSE) accuracy metric for illustration purposes.
    \n", + "
  • `explained_variance`
  • \n", + "
  • `mean_absolute_error`
  • \n", + "
  • `mean_absolute_percentage_error`
  • \n", + "
  • `median_absolute_error`
  • \n", + "
  • `normalized_median_absolute_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_error`
  • \n", + "
  • `normalized_root_mean_squared_log_error`
  • \n", + "
  • `r2_score`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
  • `root_mean_squared_error`
  • \n", + "
  • `root_mean_squared_log_error`
  • \n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def extract_specific_metric(path, metric_name):\n", + " with open(path) as f:\n", + " artifact = json.load(f)\n", + " all_metrics = pd.DataFrame(artifact[\"data\"])\n", + " index_scores = time_series_id_column_names + [metric_name]\n", + " return all_metrics[index_scores]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_table_relative_path = os.path.join(\n", + " metrics_artifacts_path, \"artifacts\", \"forecast_time_series_id_distribution_table\"\n", + ")\n", + "automl_metric = extract_specific_metric(\n", + " os.path.join(mm_output_dir, metrics_table_relative_path),\n", + " \"normalized_root_mean_squared_error\",\n", + ")\n", + "\n", + "base_metric = extract_specific_metric(\n", + " os.path.join(base_output_dir, metrics_table_relative_path),\n", + " \"normalized_root_mean_squared_error\",\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "metrics_df = automl_metric.merge(\n", + " base_metric,\n", + " left_index=True,\n", + " right_index=True,\n", + " how=\"inner\",\n", + " suffixes=[\"_automl\", \"_base\"],\n", + ")\n", + "metrics_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 9.2 Generate Time Series Plots\n", + "\n", + "Here, we generate forecast versus actuals plot for the test set for both the best many models and the baseline. Since we use rolling evaluation with the step size of 24 hours, this mimics the behavior of putting both models in production and monitoring their behavior for the duration of the test set. This step helps you make informed decisions about model performance and saves numerous costs associated with productionalizing the model and monitoring its performance in real life. \n", + "\n", + "In the next block of code, we, load the test set output for each of the runs and merge the data. Then, we generate and save time series plots." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "forecast_table_relative_path = os.path.join(\"named-outputs\", \"forecast_output\")\n", + "\n", + "forecast_column_name = \"automl_prediction\"\n", + "base_forecast_column_name = \"base_predictions\"\n", + "actual_column_name = \"automl_actual\"\n", + "forecast_origin_column_name = \"forecast_origin\"\n", + "\n", + "automl_fcst = pd.read_parquet(os.path.join(mm_output_dir, forecast_table_relative_path))\n", + "base_fcst = pd.read_parquet(os.path.join(base_output_dir, forecast_table_relative_path))\n", + "\n", + "merge_columns = time_series_id_column_names + [actual_column_name]\n", + "merge_columns.extend([time_column_name, forecast_origin_column_name])\n", + "\n", + "backtest = automl_fcst.merge(\n", + " base_fcst.rename(columns={forecast_column_name: base_forecast_column_name}),\n", + " on=merge_columns,\n", + " how=\"inner\",\n", + ")\n", + "\n", + "print(f\"AutoML forecast table size: {automl_fcst.shape}\\n---\")\n", + "print(f\"Base forecast table size: {base_fcst.shape}\\n---\")\n", + "print(f\"Merged forecast table size: {backtest.shape}\\n---\")\n", + "backtest.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from scripts.helper_scripts import draw_one_plot\n", + "from matplotlib import pyplot as plt\n", + "from matplotlib.backends.backend_pdf import PdfPages\n", + "\n", + "plot_filename = \"forecast_vs_actual.pdf\"\n", + "\n", + "pdf = PdfPages(os.path.join(os.getcwd(), \"./output\", plot_filename))\n", + "for _, one_forecast in backtest.groupby(time_series_id_column_names):\n", + " one_forecast[time_column_name] = pd.to_datetime(one_forecast[time_column_name])\n", + " one_forecast.sort_values(time_column_name, inplace=True)\n", + " draw_one_plot(\n", + " one_forecast,\n", + " time_column_name,\n", + " target_column_name,\n", + " time_series_id_column_names,\n", + " [actual_column_name, forecast_column_name, base_forecast_column_name],\n", + " pdf,\n", + " plot_predictions=True,\n", + " )\n", + "pdf.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import IFrame\n", + "\n", + "IFrame(os.path.join(\"./output/forecast_vs_actual.pdf\"), width=800, height=300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 10. Deployment
\n", + "\n", + "In this section, we will illustrate how to deploy and inference models using batch endpoint. Batch endpoints are endpoints that are used to do batch inferencing on large volumes of data in asynchronous way. Batch endpoints receive pointers to data and run jobs asynchronously to process the data in parallel on compute clusters and store outputs to a datastore for further analysis. For more information on batch endpoints see this [link](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-batch?view=azureml-api-2).\n", + "\n", + "### 10.1. Create Batch Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import random\n", + "import string\n", + "\n", + "# Creating a unique endpoint name by including a random suffix\n", + "allowed_chars = string.ascii_lowercase + string.digits\n", + "endpoint_suffix = \"\".join(random.choice(allowed_chars) for x in range(5))\n", + "endpoint_name = \"sdk-many-models-\" + endpoint_suffix\n", + "\n", + "print(f\"Endpoint name: {endpoint_name}\\n---\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "endpoint = BatchEndpoint(\n", + " name=endpoint_name,\n", + " description=\"A many models endpoint for component deployments\",\n", + " properties={\"ComponentDeployment.Enabled\": True},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the Endpoint in the workspace usign the MLClient created earlier. This command will start the endpoint creation and return a confirmation response while the endpoint creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_endpoints.begin_create_or_update(endpoint).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.2. Create the Deployment\n", + "\n", + "A deployment is a set of resources required for hosting the model that does the actual inferencing." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "deployment = PipelineComponentBatchDeployment(\n", + " name=\"sdk-many-models-deployment\",\n", + " description=\"A many models deployment.\",\n", + " endpoint_name=endpoint_name,\n", + " component=inference_component_from_registry.id,\n", + " settings={\"default_compute\": amlcompute_cluster_name},\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following command creates the deployment in the workspace usign the MLClient created earlier. This command will start the deployment creation and return a confirmation response while the deployment creation continues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.batch_deployments.begin_create_or_update(deployment).result()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.3. Invoke the Endpoint\n", + "\n", + "The next cell contians the command that invokes the endpoint for batch inference job. The `invoke` method contains the `inputs` parameter. This parameter contains the inputs necessary to execute the inference component on the endpoint. To convince yourself this is the case, compare the input parameters for the `inference_component_from_registry` in section 6.3 with the `inputs` we are proving in the next cell. They are identical.\n", + "\n", + "Notice, the the `forecast_mode` is set to `\"recursive\"`. In the evaluation pipeline this component was used to generate rolling forecast to evalaute model performance on the test set. For more details on rolling evaluation, see our [forecasting model evaluation article](placeholder). Here, we are using it to generate a forecast." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job = ml_client.batch_endpoints.invoke(\n", + " endpoint_name=endpoint.name,\n", + " deployment_name=deployment.name,\n", + " inputs={\n", + " \"raw_data\": Input(type=AssetTypes.URI_FOLDER, path=\"./data/inference\"),\n", + " \"training_experiment_name\": Input(\n", + " type=\"string\", default=evaluation_experiment_name\n", + " ),\n", + " \"max_nodes\": Input(type=\"integer\", default=1),\n", + " \"max_concurrency_per_node\": Input(type=\"integer\", default=5),\n", + " \"compute_name\": Input(type=\"string\", default=amlcompute_cluster_name),\n", + " \"forecast_mode\": Input(type=\"string\", default=\"recursive\"),\n", + " \"parallel_step_timeout_in_seconds\": Input(type=\"integer\", default=3700),\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will stream the job output to monitor the execution." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "job_name = job.name\n", + "batch_job = ml_client.jobs.get(name=job_name)\n", + "print(f\"Batch job status: {batch_job.status}\\n---\")\n", + "ml_client.jobs.stream(name=job_name)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.4. Download Forecast Output\n", + "\n", + "Finally, we download the forecast output and print the first few rows." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Check that the run result was posted on Azure\n", + "final_state = (\"Completed\", \"Failed\")\n", + "while (\n", + " batch_job.status not in final_state\n", + " or len(list(ml_client.jobs.list(parent_job_name=batch_job.name))) < 3\n", + "):\n", + " print(\"The runs were not posted... Re-trying in 10 seconds.\\n---\")\n", + " batch_job = ml_client.jobs.get(name=job_name)\n", + " sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_output_dir = os.path.join(os.getcwd(), \"forecast\")\n", + "\n", + "for child in ml_client.jobs.list(parent_job_name=job.name):\n", + " print(f\"{child.name}\\n---\")\n", + " if (\n", + " child.properties[\"azureml.moduleName\"]\n", + " == \"automl_many_models_inference_collect_step\"\n", + " ):\n", + " print(\"Downloading data ...\\n---\")\n", + " for attempt in range(3):\n", + " print(f\"Attempt: {attempt}\")\n", + " try:\n", + " ml_client.jobs.download(\n", + " child.name, download_path=fcst_output_dir, output_name=\"metadata\"\n", + " )\n", + " break\n", + " except BaseException:\n", + " sleep(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "fcst_df = pd.read_parquet(\n", + " os.path.join(fcst_output_dir, \"named-outputs\", \"metadata\", \"raw_forecast\")\n", + ")\n", + "fcst_df.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 10.5. [Optional] Delete the Endpoint" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ml_client.online_endpoints.begin_delete(name=endpoint.name).wait()" + ] + } + ], + "metadata": { + "kernel_info": { + "name": "python310-sdkv2" + }, + "kernelspec": { + "display_name": "Python 3.10 - SDK v2", + "language": "python", + "name": "python310-sdkv2" + }, + "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.10.9" + }, + "microsoft": { + "host": { + "AzureML": { + "notebookHasBeenCompleted": true + } + }, + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/scripts/helper_scripts.py b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/scripts/helper_scripts.py new file mode 100644 index 0000000000..80c76e8756 --- /dev/null +++ b/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/scripts/helper_scripts.py @@ -0,0 +1,53 @@ +import pandas as pd + +from typing import Any, Dict, List, Optional, Tuple, Union +from matplotlib import pyplot as plt +from matplotlib.backends.backend_pdf import PdfPages + + +def _format_grain_name(grain: Union[str, Tuple[str], List[str]]) -> str: + """ + Convert grain name to string. + + :param grain: the grain name. + :return: the string representation of the given grain. + """ + if not isinstance(grain, tuple) and not isinstance(grain, list): + return str(grain) + grain = list(map(str, grain)) + return "|".join(grain) + + +def draw_one_plot( + df: pd.DataFrame, + time_column_name: str, + target_column_name: str, + grain_column_names: List[str], + columns_to_plot: List[str], + pdf: PdfPages, + plot_predictions=False, +) -> None: + """ + Draw the single plot. + + :param df: The data frame with the data to build plot. + :param time_column_name: The name of a time column. + :param grain_column_names: The name of grain columns. + :param pdf: The pdf backend used to render the plot. + """ + if isinstance(grain_column_names, str): + grain_column_names = [grain_column_names] + fig, _ = plt.subplots(figsize=(20, 10)) + df = df.set_index(time_column_name) + plt.plot(df[columns_to_plot]) + plt.xticks(rotation=45) + if grain_column_names: + grain_name = [df[grain].iloc[0] for grain in grain_column_names] + plt.title(f"Time series ID: {_format_grain_name(grain_name)}") + plt.legend(columns_to_plot) + plt.close(fig) + pdf.savefig(fig) + + +if __name__ == "__main__": + pass diff --git a/sdk/python/jobs/pipelines/README.md b/sdk/python/jobs/pipelines/README.md index 237b6b011c..5495646352 100644 --- a/sdk/python/jobs/pipelines/README.md +++ b/sdk/python/jobs/pipelines/README.md @@ -9,6 +9,7 @@ Test Status is for branch - **_main_** |Area|Sub-Area|Notebook|Description|Status| |--|--|--|--|--| |jobs|pipelines|[pipeline_with_components_from_yaml](1a_pipeline_with_components_from_yaml/pipeline_with_components_from_yaml.ipynb)|Create pipeline with CommandComponents from local YAML file|[![pipeline_with_components_from_yaml](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1a_pipeline_with_components_from_yaml-pipeline_with_components_from_yaml.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1a_pipeline_with_components_from_yaml-pipeline_with_components_from_yaml.yml)| +|jobs|pipelines|[pipeline_with_components_from_yaml_serverless](1a_pipeline_with_components_from_yaml/pipeline_with_components_from_yaml_serverless.ipynb)|Create pipeline with CommandComponents from local YAML file|[![pipeline_with_components_from_yaml_serverless](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1a_pipeline_with_components_from_yaml-pipeline_with_components_from_yaml_serverless.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1a_pipeline_with_components_from_yaml-pipeline_with_components_from_yaml_serverless.yml)| |jobs|pipelines|[pipeline_with_python_function_components](1b_pipeline_with_python_function_components/pipeline_with_python_function_components.ipynb)|Create pipeline with command_component decorator|[![pipeline_with_python_function_components](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1b_pipeline_with_python_function_components-pipeline_with_python_function_components.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1b_pipeline_with_python_function_components-pipeline_with_python_function_components.yml)| |jobs|pipelines|[pipeline_with_hyperparameter_sweep](1c_pipeline_with_hyperparameter_sweep/pipeline_with_hyperparameter_sweep.ipynb)|Use sweep (hyperdrive) in pipeline to train mnist model using tensorflow|[![pipeline_with_hyperparameter_sweep](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1c_pipeline_with_hyperparameter_sweep-pipeline_with_hyperparameter_sweep.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1c_pipeline_with_hyperparameter_sweep-pipeline_with_hyperparameter_sweep.yml)| |jobs|pipelines|[pipeline_with_non_python_components](1d_pipeline_with_non_python_components/pipeline_with_non_python_components.ipynb)|Create a pipeline with command function|[![pipeline_with_non_python_components](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1d_pipeline_with_non_python_components-pipeline_with_non_python_components.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1d_pipeline_with_non_python_components-pipeline_with_non_python_components.yml)| @@ -24,9 +25,11 @@ Test Status is for branch - **_main_** |jobs|pipelines|[automl-text-classification-in-pipeline](1h_automl_in_pipeline/automl-text-classification-in-pipeline/automl-text-classification-in-pipeline.ipynb)|Create pipeline with automl node|[![automl-text-classification-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-classification-in-pipeline-automl-text-classification-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-classification-in-pipeline-automl-text-classification-in-pipeline.yml)| |jobs|pipelines|[automl-text-classification-multilabel-in-pipeline](1h_automl_in_pipeline/automl-text-classification-multilabel-in-pipeline/automl-text-classification-multilabel-in-pipeline.ipynb)|Create pipeline with automl node|[![automl-text-classification-multilabel-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-classification-multilabel-in-pipeline-automl-text-classification-multilabel-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-classification-multilabel-in-pipeline-automl-text-classification-multilabel-in-pipeline.yml)| |jobs|pipelines|[automl-text-ner-named-entity-recognition-in-pipeline](1h_automl_in_pipeline/automl-text-ner-named-entity-recognition-in-pipeline/automl-text-ner-named-entity-recognition-in-pipeline.ipynb)|Create pipeline with automl node|[![automl-text-ner-named-entity-recognition-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-ner-named-entity-recognition-in-pipeline-automl-text-ner-named-entity-recognition-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1h_automl_in_pipeline-automl-text-ner-named-entity-recognition-in-pipeline-automl-text-ner-named-entity-recognition-in-pipeline.yml)| -|jobs|pipelines|[pipeline_with_spark_nodes](1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb)|Create pipeline with spark node - _This sample is excluded from automated tests_|[![pipeline_with_spark_nodes](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml)| +|jobs|pipelines|[pipeline_with_spark_nodes](1i_pipeline_with_spark_nodes/pipeline_with_spark_nodes.ipynb)|Create pipeline with spark node|[![pipeline_with_spark_nodes](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1i_pipeline_with_spark_nodes-pipeline_with_spark_nodes.yml)| |jobs|pipelines|[nyc_taxi_data_regression_with_pipeline_component](1j_pipeline_with_pipeline_component/nyc_taxi_data_regression_with_pipeline_component/nyc_taxi_data_regression_with_pipeline_component.ipynb)|Create pipeline with CommandComponents from local YAML file|[![nyc_taxi_data_regression_with_pipeline_component](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component-nyc_taxi_data_regression_with_pipeline_component.yml)| |jobs|pipelines|[pipeline_with_train_eval_pipeline_component](1j_pipeline_with_pipeline_component/pipeline_with_train_eval_pipeline_component/pipeline_with_train_eval_pipeline_component.ipynb)|Create pipeline with CommandComponents from local YAML file|[![pipeline_with_train_eval_pipeline_component](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-pipeline_with_train_eval_pipeline_component-pipeline_with_train_eval_pipeline_component.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1j_pipeline_with_pipeline_component-pipeline_with_train_eval_pipeline_component-pipeline_with_train_eval_pipeline_component.yml)| +|jobs|pipelines|[automl-forecasting-demand-hierarchical-timeseries-in-pipeline](1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline/automl-forecasting-demand-hierarchical-timeseries-in-pipeline.ipynb)|*no description*|[![automl-forecasting-demand-hierarchical-timeseries-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-hierarchical-timeseries-in-pipeline-automl-forecasting-demand-hierarchical-timeseries-in-pipeline.yml)| +|jobs|pipelines|[automl-forecasting-demand-many-models-in-pipeline](1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline/automl-forecasting-demand-many-models-in-pipeline.ipynb)|*no description*|[![automl-forecasting-demand-many-models-in-pipeline](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-1k_demand_forecasting_with_pipeline_components-automl-forecasting-demand-many-models-in-pipeline-automl-forecasting-demand-many-models-in-pipeline.yml)| |jobs|pipelines|[train_mnist_with_tensorflow](2a_train_mnist_with_tensorflow/train_mnist_with_tensorflow.ipynb)|Create pipeline using components to run a distributed job with tensorflow|[![train_mnist_with_tensorflow](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2a_train_mnist_with_tensorflow-train_mnist_with_tensorflow.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2a_train_mnist_with_tensorflow-train_mnist_with_tensorflow.yml)| |jobs|pipelines|[train_cifar_10_with_pytorch](2b_train_cifar_10_with_pytorch/train_cifar_10_with_pytorch.ipynb)|Get data, train and evaluate a model in pipeline with Components|[![train_cifar_10_with_pytorch](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2b_train_cifar_10_with_pytorch-train_cifar_10_with_pytorch.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2b_train_cifar_10_with_pytorch-train_cifar_10_with_pytorch.yml)| |jobs|pipelines|[nyc_taxi_data_regression](2c_nyc_taxi_data_regression/nyc_taxi_data_regression.ipynb)|Build pipeline with components for 5 jobs - prep data, transform data, train model, predict results and evaluate model performance|[![nyc_taxi_data_regression](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2c_nyc_taxi_data_regression-nyc_taxi_data_regression.yml/badge.svg?branch=main)](https://github.com/Azure/azureml-examples/actions/workflows/sdk-jobs-pipelines-2c_nyc_taxi_data_regression-nyc_taxi_data_regression.yml)| diff --git a/sdk/python/jobs/single-step/debug-and-monitor/debug-and-monitor.ipynb b/sdk/python/jobs/single-step/debug-and-monitor/debug-and-monitor.ipynb index 7fc2b1bca9..edb69918fb 100644 --- a/sdk/python/jobs/single-step/debug-and-monitor/debug-and-monitor.ipynb +++ b/sdk/python/jobs/single-step/debug-and-monitor/debug-and-monitor.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -20,7 +20,7 @@ "- Use a local file as an `input` to the Command\n", "- Enable live debugging & monitoring by specifying `services` to the Command job\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used to run the training job. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -104,8 +104,7 @@ "- `code` - This is the path where the code to run the command is located\n", "- `command` - This is the command that needs to be run. If you need to reserve your cluster for debugging or monitoring purposes, you can use the `sleep` command.\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", - "\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment\n", "- `services` - Specify the applications (or SSH) that you need to interact with the live running job. You can specify `vs_code`, `tensor_board` (needs log directory), `jupyter_lab` or `SSH` (needs public key). For distributed jobs, you can specify the specific compute `nodes` index you would like to interact with. If `nodes` are not specified, interactive services are enabled only on the head node by default." @@ -133,8 +132,7 @@ "job = command(\n", " code=\"./src\", # local path where the code is stored\n", " command=\"python tfevents.py && sleep 2000\", # the sleep command allows you to reserve your compute -- recommended if you are using interactive services\n", - " environment=\"AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu@latest\",\n", - " compute=\"cpu-cluster\",\n", + " environment=\"AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu@latest\",\n", " display_name=\"debug-and-monitor-example\",\n", " services={\n", " \"My_jupyterlab\": JupyterLabJobService(),\n", diff --git a/sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/objectdetectionAzureML.ipynb b/sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/objectdetectionAzureML.ipynb index 22a6760c46..8b868e1290 100644 --- a/sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/objectdetectionAzureML.ipynb +++ b/sdk/python/jobs/single-step/pytorch/distributed-training-yolov5/objectdetectionAzureML.ipynb @@ -75,6 +75,7 @@ "from azure.ai.ml import Output\n", "from azure.ai.ml.constants import AssetTypes\n", "from azure.identity import DefaultAzureCredential\n", + "from azure.ai.ml.entities import ResourceConfiguration\n", "\n", "credential = DefaultAzureCredential()\n", "\n", @@ -116,7 +117,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `gpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed " ] }, @@ -164,13 +165,15 @@ " \"weights\": \"yolov5n.pt\",\n", " },\n", " environment=\"AzureML-pytorch-1.8-ubuntu18.04-py37-cuda11-gpu@latest\",\n", - " compute=\"gpu-cluster\", # name of your cluster\n", - " instance_count=2, # In this, only 2 node cluster was created.\n", + " instance_count=2,\n", " distribution={\n", " \"type\": \"PyTorch\",\n", " \"process_count_per_instance\": 1, # number of GPus per node\n", " },\n", - ")" + ")\n", + "job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\", instance_count=2\n", + ") # Serverless compute resources" ] }, { diff --git a/sdk/python/jobs/single-step/pytorch/distributed-training/distributed-cifar10.ipynb b/sdk/python/jobs/single-step/pytorch/distributed-training/distributed-cifar10.ipynb index 18abb8072b..aa9efef534 100644 --- a/sdk/python/jobs/single-step/pytorch/distributed-training/distributed-cifar10.ipynb +++ b/sdk/python/jobs/single-step/pytorch/distributed-training/distributed-cifar10.ipynb @@ -119,28 +119,7 @@ } }, "source": [ - "## 1.3 Get handle to workspace and retrieve the attached compute cluster" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "jupyter": { - "outputs_hidden": false, - "source_hidden": false - }, - "nteract": { - "transient": { - "deleting": false - } - } - }, - "outputs": [], - "source": [ - "## Provide the name of the CPU compute cluster in your Azure Machine Learning Compute.\n", - "cluster_name = \"cpu-cluster\"\n", - "##print(ml_client.compute.get(cluster_name))" + "## 1.3 Get handle to workspace" ] }, { @@ -214,7 +193,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed \n" ] }, @@ -276,7 +255,6 @@ " inputs=inputs,\n", " outputs=outputs,\n", " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu:1\",\n", - " compute=\"cpu-cluster\",\n", ")\n", "\n", "# submit the command\n", @@ -370,20 +348,24 @@ " \"output\": \"./outputs\",\n", "}\n", "\n", + "from azure.ai.ml.entities import ResourceConfiguration\n", + "\n", "job = command(\n", " code=\"./src\", # local path where the code is stored\n", " command=\"python train.py --data-dir ${{inputs.cifar}} --epochs ${{inputs.epoch}} --batch-size ${{inputs.batchsize}} --workers ${{inputs.workers}} --learning-rate ${{inputs.lr}} --momentum ${{inputs.momen}} --print-freq ${{inputs.prtfreq}} --model-dir ${{inputs.output}}\",\n", " inputs=inputs,\n", " environment=\"azureml:AzureML-pytorch-1.9-ubuntu18.04-py37-cuda11-gpu:6\",\n", - " compute=\"gpu-cluster\", # Change the name to the gpu cluster of your workspace.\n", " instance_count=2, # In this, only 2 node cluster was created.\n", " distribution={\n", " \"type\": \"PyTorch\",\n", " # set process count to the number of gpus per node\n", - " # NV6 has only 1 GPU\n", + " # NC6s_v3 has only 1 GPU\n", " \"process_count_per_instance\": 1,\n", " },\n", - ")" + ")\n", + "job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\", instance_count=2\n", + ") # Serverless compute resources" ] }, { diff --git a/sdk/python/jobs/single-step/pytorch/iris/pytorch-iris.ipynb b/sdk/python/jobs/single-step/pytorch/iris/pytorch-iris.ipynb index 1d2189ce81..7d242ec191 100644 --- a/sdk/python/jobs/single-step/pytorch/iris/pytorch-iris.ipynb +++ b/sdk/python/jobs/single-step/pytorch/iris/pytorch-iris.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -19,7 +19,7 @@ "- Create and run a `Command` which executes a Python command\n", "- Use a local file as an `input` to the Command\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used to run the training job. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -96,7 +96,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed training. The allowed values are `PyTorch`, `TensorFlow` or `Mpi`.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment" @@ -119,8 +119,7 @@ " \"epochs\": 10,\n", " \"lr\": 0.1,\n", " },\n", - " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " compute=\"cpu-cluster\",\n", + " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", " display_name=\"pytorch-iris-example\",\n", " description=\"Train a neural network with PyTorch on the Iris dataset.\",\n", ")" diff --git a/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch/train-hyperparameter-tune-deploy-with-pytorch.ipynb b/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch/train-hyperparameter-tune-deploy-with-pytorch.ipynb index f90450a46c..3be8b2e4e0 100644 --- a/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch/train-hyperparameter-tune-deploy-with-pytorch.ipynb +++ b/sdk/python/jobs/single-step/pytorch/train-hyperparameter-tune-deploy-with-pytorch/train-hyperparameter-tune-deploy-with-pytorch.ipynb @@ -159,7 +159,7 @@ " # Azure ML Compute is the on-demand VM service\n", " type=\"amlcompute\",\n", " # VM Family\n", - " size=\"STANDARD_NC6\",\n", + " size=\"STANDARD_NC6s_v3\",\n", " # Minimum running nodes when there is no job running\n", " min_instances=0,\n", " # Nodes in cluster\n", diff --git a/sdk/python/jobs/single-step/scikit-learn/diabetes/sklearn-diabetes.ipynb b/sdk/python/jobs/single-step/scikit-learn/diabetes/sklearn-diabetes.ipynb index 979180623a..e29a143638 100644 --- a/sdk/python/jobs/single-step/scikit-learn/diabetes/sklearn-diabetes.ipynb +++ b/sdk/python/jobs/single-step/scikit-learn/diabetes/sklearn-diabetes.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -19,7 +19,7 @@ "- Create and run a `Command` which executes a Python command\n", "- Use a local file as an `input` to the Command\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used to run the training job. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -127,7 +127,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed training. The allowed values are `PyTorch`, `TensorFlow` or `Mpi`.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment\n" @@ -163,8 +163,7 @@ " path=\"https://azuremlexamples.blob.core.windows.net/datasets/diabetes.csv\",\n", " )\n", " },\n", - " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " compute=\"cpu-cluster\",\n", + " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", " display_name=\"sklearn-diabetes-example\",\n", " # description,\n", " # experiment_name\n", diff --git a/sdk/python/jobs/single-step/scikit-learn/iris/iris-scikit-learn.ipynb b/sdk/python/jobs/single-step/scikit-learn/iris/iris-scikit-learn.ipynb index 375c03306d..845228561f 100644 --- a/sdk/python/jobs/single-step/scikit-learn/iris/iris-scikit-learn.ipynb +++ b/sdk/python/jobs/single-step/scikit-learn/iris/iris-scikit-learn.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -19,7 +19,7 @@ "- Create and run a `Command` which executes a Python command\n", "- Use a local file as an `input` to the Command\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used to run the training job. The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -127,8 +127,8 @@ " - `path` - The path to the file or folder. These can be local or remote files or folders. For remote files - http/https, wasb are supported. \n", " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", - "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed training. The allowed values are `PyTorch`, `TensorFlow` or `Mpi`.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment" @@ -177,8 +177,7 @@ " # }\n", " # ) # uncomment add SSH Public Key to access job container via SSH\n", " },\n", - " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " compute=\"cpu-cluster\",\n", + " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", " display_name=\"sklearn-iris-example\",\n", " # experiment_name\n", " # description\n", diff --git a/sdk/python/jobs/single-step/scikit-learn/mnist/sklearn-mnist.ipynb b/sdk/python/jobs/single-step/scikit-learn/mnist/sklearn-mnist.ipynb index 6b5d611563..1a7b951b11 100644 --- a/sdk/python/jobs/single-step/scikit-learn/mnist/sklearn-mnist.ipynb +++ b/sdk/python/jobs/single-step/scikit-learn/mnist/sklearn-mnist.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -19,7 +19,7 @@ "- Create and run a `Command` which executes a Python command\n", "- Use a local file as an `input` to the Command\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used for the training job. The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -107,7 +107,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed training. The allowed values are `PyTorch`, `TensorFlow` or `Mpi`.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment" @@ -128,8 +128,7 @@ " code=\"./src\", # local path where the code is stored\n", " command=\"pip install -r requirements.txt && python main.py --C ${{inputs.C}} --penalty ${{inputs.penalty}}\",\n", " inputs={\"C\": 0.8, \"penalty\": \"l2\"},\n", - " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " compute=\"cpu-cluster\",\n", + " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", " display_name=\"sklearn-mnist-example\"\n", " # experiment_name: sklearn-mnist-example\n", " # description: Train a scikit-learn LogisticRegression model on the MNSIT dataset.\n", diff --git a/sdk/python/jobs/single-step/tensorflow/mnist-distributed/tensorflow-mnist-distributed.ipynb b/sdk/python/jobs/single-step/tensorflow/mnist-distributed/tensorflow-mnist-distributed.ipynb index 01f0989af6..a0ddaf8b34 100644 --- a/sdk/python/jobs/single-step/tensorflow/mnist-distributed/tensorflow-mnist-distributed.ipynb +++ b/sdk/python/jobs/single-step/tensorflow/mnist-distributed/tensorflow-mnist-distributed.ipynb @@ -118,10 +118,10 @@ "cell_type": "code", "execution_count": null, "metadata": { - "name": "job", "gather": { "logged": 1634855420019 - } + }, + "name": "job" }, "outputs": [], "source": [ @@ -134,12 +134,12 @@ " compute=\"cpu-cluster\",\n", " instance_count=2,\n", " # distribution = {\"type\": \"mpi\", \"process_count_per_instance\": 1},\n", - " distribution={\n", - " \"type\": \"tensorflow\",\n", - " \"parameter_server_count\": 1,\n", - " \"worker_count\": 2,\n", - " \"added_property\": 7,\n", - " },\n", + " # distribution={\n", + " # \"type\": \"tensorflow\",\n", + " # \"parameter_server_count\": 1, # for legacy TensorFlow 1.x\n", + " # \"worker_count\": 2,\n", + " # \"added_property\": 7,\n", + " # },\n", " # distribution = {\n", " # \"type\": \"pytorch\",\n", " # \"process_count_per_instance\": 4,\n", @@ -151,7 +151,7 @@ ")\n", "\n", "# can also set the distribution in a separate step and using the typed objects instead of a dict\n", - "job.distribution = TensorFlowDistribution(parameter_server_count=1, worker_count=2)" + "job.distribution = TensorFlowDistribution(worker_count=2)" ] }, { @@ -183,6 +183,16 @@ "returned_job = ml_client.create_or_update(job)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Wait until the job completes\n", + "ml_client.jobs.stream(returned_job.name)" + ] + }, { "cell_type": "markdown", "metadata": {}, diff --git a/sdk/python/jobs/single-step/tensorflow/mnist/tensorflow-mnist.ipynb b/sdk/python/jobs/single-step/tensorflow/mnist/tensorflow-mnist.ipynb index 493bf4ae2b..def0ce0a3f 100644 --- a/sdk/python/jobs/single-step/tensorflow/mnist/tensorflow-mnist.ipynb +++ b/sdk/python/jobs/single-step/tensorflow/mnist/tensorflow-mnist.ipynb @@ -9,7 +9,7 @@ "**Requirements** - In order to benefit from this tutorial, you will need:\n", "- A basic understanding of Machine Learning\n", "- An Azure account with an active subscription. [Create an account for free](https://azure.microsoft.com/free/?WT.mc_id=A261C142F)\n", - "- An Azure ML workspace with computer cluster - [Configure workspace](../../../configuration.ipynb) \n", + "- An Azure ML workspace - [Configure workspace](../../../configuration.ipynb) \n", "\n", "- A python environment\n", "- Installed Azure Machine Learning Python SDK v2 - [install instructions](../../../../README.md) - check the getting started section\n", @@ -19,7 +19,7 @@ "- Create and run a `Command` which executes a Python command\n", "- Use a local file as an `input` to the Command\n", "\n", - "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." + "**Motivations** - This notebook explains how to setup and run a Command. The Command is a fundamental construct of Azure Machine Learning. It can be used to run a task on a specified compute (either local or on the cloud). Alternatively, [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) can also be used for the training job. The Command accepts `environment` and `compute` to setup required infrastructure. You can define a `command` to run on this infrastructure with `inputs`." ] }, { @@ -46,7 +46,8 @@ "# import required libraries\n", "from azure.ai.ml import MLClient\n", "from azure.ai.ml import command\n", - "from azure.identity import DefaultAzureCredential" + "from azure.identity import DefaultAzureCredential\n", + "from azure.ai.ml.entities import ResourceConfiguration" ] }, { @@ -107,7 +108,7 @@ " - Azure ML `data`/`dataset` or `datastore` are of type `uri_folder`. To use `data`/`dataset` as input, you can use registered dataset in the workspace using the format ':'. For e.g Input(type='uri_folder', path='my_dataset:1')\n", " - `mode` - \tMode of how the data should be delivered to the compute target. Allowed values are `ro_mount`, `rw_mount` and `download`. Default is `ro_mount`\n", "- `environment` - This is the environment needed for the command to run. Curated or custom environments from the workspace can be used. Or a custom environment can be created and used as well. Check out the [environment](../../../../assets/environment/environment.ipynb) notebook for more examples.\n", - "- `compute` - The compute on which the command will run. In this example we are using a compute called `cpu-cluster` present in the workspace. You can replace it any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", + "- `compute` - The compute on which the command will run. In this example we are using [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) so there is no need to specify any compute. You can also replace serverless with any other compute in the workspace. You can run it on the local machine by using `local` for the compute. This will run the command on the local machine and all the run details and output of the job will be uploaded to the Azure ML workspace.\n", "- `distribution` - Distribution configuration for distributed training scenarios. Azure Machine Learning supports PyTorch, TensorFlow, and MPI-based distributed training. The allowed values are `PyTorch`, `TensorFlow` or `Mpi`.\n", "- `display_name` - The display name of the Job\n", "- `description` - The description of the experiment" @@ -128,11 +129,13 @@ " code=\"./src\", # local path where the code is stored\n", " command=\"python main.py\",\n", " environment=\"AzureML-tensorflow-2.7-ubuntu20.04-py38-cuda11-gpu@latest\",\n", - " compute=\"gpu-cluster\",\n", " display_name=\"tensorflow-mnist-example\"\n", " # experiment_name: tensorflow-mnist-example\n", " # description: Train a basic neural network with TensorFlow on the MNIST dataset.\n", - ")" + ")\n", + "job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\", instance_count=2\n", + ") # Serverless compute resources" ] }, { diff --git a/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb b/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb index dd36c5ac70..57816e9d9a 100644 --- a/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb +++ b/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-keras/train-hyperparameter-tune-deploy-with-keras.ipynb @@ -163,7 +163,7 @@ " # Azure ML Compute is the on-demand VM service\n", " type=\"amlcompute\",\n", " # VM Family\n", - " size=\"STANDARD_NC6\",\n", + " size=\"STANDARD_NC6s_v3\",\n", " # Minimum running nodes when there is no job running\n", " min_instances=0,\n", " # Nodes in cluster\n", diff --git a/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-tensorflow/train-hyperparameter-tune-deploy-with-tensorflow.ipynb b/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-tensorflow/train-hyperparameter-tune-deploy-with-tensorflow.ipynb index ed60da397c..11ea39ec68 100644 --- a/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-tensorflow/train-hyperparameter-tune-deploy-with-tensorflow.ipynb +++ b/sdk/python/jobs/single-step/tensorflow/train-hyperparameter-tune-deploy-with-tensorflow/train-hyperparameter-tune-deploy-with-tensorflow.ipynb @@ -160,7 +160,7 @@ " # Azure ML Compute is the on-demand VM service\n", " type=\"amlcompute\",\n", " # VM Family\n", - " size=\"STANDARD_NC6\",\n", + " size=\"STANDARD_NC6s_v3\",\n", " # Minimum running nodes when there is no job running\n", " min_instances=0,\n", " # Nodes in cluster\n", diff --git a/sdk/python/jobs/spark/automation/create_credential_less_data_store.yml b/sdk/python/jobs/spark/automation/create_credential_less_data_store.yml new file mode 100644 index 0000000000..4c56659dcb --- /dev/null +++ b/sdk/python/jobs/spark/automation/create_credential_less_data_store.yml @@ -0,0 +1,6 @@ +$schema: https://azuremlschemas.azureedge.net/latest/azureBlob.schema.json +name: +type: azure_blob +description: Credential-less datastore pointing to a blob container. +account_name: +container_name: \ No newline at end of file diff --git a/sdk/python/jobs/spark/automation/run_interactive_session_notebook.ipynb b/sdk/python/jobs/spark/automation/run_interactive_session_notebook.ipynb new file mode 100644 index 0000000000..1d87178f33 --- /dev/null +++ b/sdk/python/jobs/spark/automation/run_interactive_session_notebook.ipynb @@ -0,0 +1,79 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Use a serverless Spark compute" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You should have an attached Synapse Spark pool available in your workspace. Please see documentation page: [Attach and manage a Synapse Spark pool in Azure Machine Learning (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-manage-synapse-spark-pool) for more details.\n", + "\n", + "**Note** - To ensure successful execution of Spark job, the identity being used for the Spark job should be assigned **Contributor** and **Storage Blob Data Contributor** roles on the Azure storage account used for data input and output." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from azure.ai.ml import MLClient, spark, Input, Output\n", + "from azure.identity import DefaultAzureCredential\n", + "\n", + "subscription_id = \"\"\n", + "resource_group = \"\"\n", + "workspace = \"\"\n", + "ml_client = MLClient(\n", + " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", + ")\n", + "\n", + "spark_job = spark(\n", + " display_name=\"interactive_data_wrangling\",\n", + " code=\"../../../data-wrangling\",\n", + " entry={\"file\": \"interactive_data_wrangling.py\"},\n", + " driver_cores=1,\n", + " driver_memory=\"2g\",\n", + " executor_cores=2,\n", + " executor_memory=\"2g\",\n", + " executor_instances=2,\n", + " resources={\n", + " \"instance_type\": \"Standard_E8S_V3\",\n", + " \"runtime_version\": \"3.2.0\",\n", + " },\n", + ")\n", + "\n", + "returned_spark_job = ml_client.jobs.create_or_update(spark_job)\n", + "\n", + "print(returned_spark_job.id)\n", + "# Wait until the job completes\n", + "ml_client.jobs.stream(returned_spark_job.name)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.10 - SDK V2", + "language": "python", + "name": "python310-sdkv2" + }, + "language_info": { + "name": "python", + "version": "3.7.10" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "6aeff17a1aa7735c2f7cb3a6d691fe1b4d4c3b8d2d650f644ad0f24e1b8e3f3f" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sdk/python/jobs/spark/automation/user-assigned-identity.yml b/sdk/python/jobs/spark/automation/user-assigned-identity.yml new file mode 100644 index 0000000000..3ab321fb5c --- /dev/null +++ b/sdk/python/jobs/spark/automation/user-assigned-identity.yml @@ -0,0 +1,7 @@ +# user-assigned-identity.yml +identity: + type: "system_assigned,user_assigned" + user_assigned_identities: + "/subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/" : {} + + \ No newline at end of file diff --git a/sdk/python/jobs/spark/setup_spark.sh b/sdk/python/jobs/spark/setup_spark.sh new file mode 100644 index 0000000000..adb717346e --- /dev/null +++ b/sdk/python/jobs/spark/setup_spark.sh @@ -0,0 +1,203 @@ +# +SUBSCRIPTION_ID=$(az account show --query id -o tsv) +LOCATION=$(az ml workspace show --query location -o tsv) +RESOURCE_GROUP=$(az group show --query name -o tsv) +AML_WORKSPACE_NAME=$(az configure -l --query "[?name=='workspace'].value" -o tsv) +API_VERSION="2022-05-01" +TOKEN=$(az account get-access-token --query accessToken -o tsv) +AML_USER_MANAGED_ID=${RESOURCE_GROUP}-uai +ATTACHED_SPARK_POOL_NAME="myattachedspark" +ATTACHED_SPARK_POOL_NAME_UAI="myattacheduai" +ATTACH_SPARK_PY="resources/compute/attach_managed_spark_pools.py" +GEN2_STORAGE_NAME=${RESOURCE_GROUP}gen2 +GEN2_FILE_SYSTEM=${RESOURCE_GROUP}file +SYNAPSE_WORKSPACE_NAME=${AML_WORKSPACE_NAME}-syws +SQL_ADMIN_LOGIN_USER="automation" +SQL_ADMIN_LOGIN_PASSWORD="auto123!" +SPARK_POOL_NAME="automationpool" +SPARK_POOL_ADMIN_ROLE_ID="6e4bf58a-b8e1-4cc3-bbf9-d73143322b78" +USER_IDENTITY_YML=$1"automation/user-assigned-identity.yml" +CREAT_CREDENTIAL_LESS_DS_YML=$1"automation/create_credential_less_data_store.yml" +AZURE_REGION_NAME=${LOCATION} +OUTBOUND_RULE_NAME="automationtestrule" +OUTBOUND_RULE_NAME_GEN2="automationtestrulegen2" +# + +if [[ "$2" == *"resources/compute"* ]] +then + ATTACHED_SPARK_POOL_NAME=${ATTACHED_SPARK_POOL_NAME}2 + ATTACHED_SPARK_POOL_NAME_UAI=${ATTACHED_SPARK_POOL_NAME_UAI}2 +fi + +# +response=$(curl --location --request GET "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.MachineLearningServices/workspaces/$AML_WORKSPACE_NAME/datastores?api-version=$API_VERSION&isDefault=true" \ +--header "Authorization: Bearer $TOKEN") +AZUREML_DEFAULT_CONTAINER=$(echo $response | jq -r '.value[0].properties.containerName') +export AZURE_STORAGE_ACCOUNT=$(echo $response | jq -r '.value[0].properties.accountName') +# + +# +az storage blob upload-batch -s $1 --pattern *.csv -d $AZUREML_DEFAULT_CONTAINER --account-name $AZURE_STORAGE_ACCOUNT --overwrite true +# + +# +az identity create --name $AML_USER_MANAGED_ID --resource-group $RESOURCE_GROUP --location $LOCATION +AML_USER_MANAGED_ID_OID=$(az identity show --resource-group $RESOURCE_GROUP -n $AML_USER_MANAGED_ID --query principalId -o tsv) +# + +# +if [[ "$2" == *"managed_vnet"* ]] +then + AML_WORKSPACE_NAME=${AML_WORKSPACE_NAME}-vnet + AZURE_STORAGE_ACCOUNT="blobstoragevnet" + BLOB_CONTAINER_NAME="blobstoragevnetcontainer" + GEN2_STORAGE_ACCOUNT_NAME="gen2storagevnet" + ADLS_CONTAINER_NAME="gen2containervnet" + az storage account create -n $AZURE_STORAGE_ACCOUNT -g $RESOURCE_GROUP -l $LOCATION --sku Standard_LRS + az storage container create -n $BLOB_CONTAINER_NAME --account-name $AZURE_STORAGE_ACCOUNT + + az storage account create --name $GEN2_STORAGE_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true + az storage container create -n $ADLS_CONTAINER_NAME --account-name $GEN2_STORAGE_ACCOUNT_NAME + + ACCOUNT_KEY=$(az storage account keys list --account-name $AZURE_STORAGE_ACCOUNT --query "[0].value" -o tsv) + ACCESS_KEY_SECRET_NAME="autotestaccountkey" + KEY_VAULT=$(az ml workspace show -g $RESOURCE_GROUP -n $AML_WORKSPACE_NAME --query key_vault -o tsv) + KEY_VAULT_NAME=$(basename "$KEY_VAULT") + az keyvault secret set --name $ACCESS_KEY_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $ACCOUNT_KEY + + # + sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_WORKSPACE_NAME/g; + s//$AZURE_REGION_NAME/g; + s//$AZURE_STORAGE_ACCOUNT/g; + s//$OUTBOUND_RULE_NAME/g; + s//$OUTBOUND_RULE_NAME_GEN2/g; + s//$KEY_VAULT_NAME/g; + s//$ACCESS_KEY_SECRET_NAME/g; + s//$BLOB_CONTAINER_NAME/g; + s//$GEN2_STORAGE_ACCOUNT_NAME/g; + s//$ADLS_CONTAINER_NAME/g;" $2 +# +# +elif [[ "$2" == *"run_interactive_session_notebook"* ]] +then + #NOTEBOOK_TO_CONVERT="../../data-wrangling/interactive_data_wrangling.ipynb" + #ipython nbconvert $NOTEBOOK_TO_CONVERT --to script + + ACCOUNT_KEY=$(az storage account keys list --account-name $AZURE_STORAGE_ACCOUNT --query "[0].value" -o tsv) + ACCESS_KEY_SECRET_NAME="autotestaccountkey" + + KEY_VAULT_NAME=${RESOURCE_GROUP}-kv + az keyvault create -n $KEY_VAULT_NAME -g $RESOURCE_GROUP + + NOTEBOOK_PY="./data-wrangling/interactive_data_wrangling.py" + az keyvault secret set --name $ACCESS_KEY_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $ACCOUNT_KEY + + END_TIME=`date -u -d "60 minutes" '+%Y-%m-%dT%H:%MZ'` + SAS_TOKEN=`az storage container generate-sas -n $AZUREML_DEFAULT_CONTAINER --account-name $AZURE_STORAGE_ACCOUNT --https-only --permissions dlrw --expiry $END_TIME -o tsv` + SAS_TOKEN_SECRET_NAME="autotestsastoken" + az keyvault secret set --name $SAS_TOKEN_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $SAS_TOKEN + + GEN2_STORAGE_ACCOUNT_NAME=${RESOURCE_GROUP}gen2 + FILE_SYSTEM_NAME=${RESOURCE_GROUP}file + az storage account create --name $GEN2_STORAGE_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true + az storage fs create -n $FILE_SYSTEM_NAME --account-name $GEN2_STORAGE_ACCOUNT_NAME + az role assignment create --role "Storage Blob Data Contributor" --assignee $AML_USER_MANAGED_ID_OID --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$GEN2_STORAGE_ACCOUNT_NAME/blobServices/default/containers/$FILE_SYSTEM_NAME + + TITANIC_DATA_FILE="titanic.csv" + az storage fs file upload --file-system $FILE_SYSTEM_NAME --source ./data-wrangling/data/$TITANIC_DATA_FILE --path data/$TITANIC_DATA_FILE --account-name $GEN2_STORAGE_ACCOUNT_NAME + + # SERVICE_PRINCIPAL_NAME="${RESOURCE_GROUP}sp" + # az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME + # LIST_SP_DETAILS=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME) + # SP_APPID=$(echo $LIST_SP_DETAILS | jq -r '[0].appId') + # SP_OBJECTID=$(echo $LIST_SP_DETAILS | jq -r '[0].id') + # SP_TENANTID=$(echo $LIST_SP_DETAILS | jq -r '[0].appOwnerOrganizationId') + # SPA_SP_SECRET=$(az ad sp credential reset --id $SP_OBJECTID --query "password") + + # CLIENT_ID_SECRET_NAME="autotestspsecretclient" + # TENANT_ID_SECRET_NAME="autotestspsecrettenant" + # CLIENT_SECRET_NAME="autotestspsecret" + # az keyvault secret set --name $CLIENT_ID_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $SP_APPID + # az keyvault secret set --name $TENANT_ID_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $SP_TENANTID + # az keyvault secret set --name $CLIENT_SECRET_NAME --vault-name $KEY_VAULT_NAME --value $SPA_SP_SECRET + # az role assignment create --role "Storage Blob Data Contributor" --assignee $SP_APPID --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$GEN2_STORAGE_ACCOUNT_NAME/blobServices/default/containers/$FILE_SYSTEM_NAME + # az role assignment create --role "Contributor" --assignee $SP_APPID --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$GEN2_STORAGE_ACCOUNT_NAME/blobServices/default/containers/$FILE_SYSTEM_NAME + + CREDENTIAL_LESS_DATA_STORE_NAME="credlessblobdatastore" + sed -i "s//$AZURE_STORAGE_ACCOUNT/g; + s//$AZUREML_DEFAULT_CONTAINER/g + s//$CREDENTIAL_LESS_DATA_STORE_NAME/g;" $CREAT_CREDENTIAL_LESS_DS_YML + az ml datastore create --file $CREAT_CREDENTIAL_LESS_DS_YML --resource-group $RESOURCE_GROUP --workspace-name $AML_WORKSPACE_NAME + # USER="azuremlsdk" + sed -i "s//$KEY_VAULT_NAME/g; + s//$ACCESS_KEY_SECRET_NAME/g; + s//$AZURE_STORAGE_ACCOUNT/g; + s//$AZUREML_DEFAULT_CONTAINER/g + s//$SAS_TOKEN_SECRET_NAME/g; + s//$GEN2_STORAGE_ACCOUNT_NAME/g + s//$FILE_SYSTEM_NAME/g;" $NOTEBOOK_PY + + sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_WORKSPACE_NAME/g;" $2 +# +else + # + az storage account create --name $GEN2_STORAGE_NAME --resource-group $RESOURCE_GROUP --location $LOCATION --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true + az storage fs create -n $GEN2_FILE_SYSTEM --account-name $GEN2_STORAGE_NAME + az synapse workspace create --name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --storage-account $GEN2_STORAGE_NAME --file-system $GEN2_FILE_SYSTEM --sql-admin-login-user $SQL_ADMIN_LOGIN_USER --sql-admin-login-password $SQL_ADMIN_LOGIN_PASSWORD --location $LOCATION + az role assignment create --role "Storage Blob Data Owner" --assignee $AML_USER_MANAGED_ID_OID --scope /subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$GEN2_STORAGE_NAME/blobServices/default/containers/$GEN2_FILE_SYSTEM + az synapse spark pool create --name $SPARK_POOL_NAME --workspace-name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --spark-version 3.2 --node-count 3 --node-size Medium --min-node-count 3 --max-node-count 10 --enable-auto-scale true + az synapse workspace firewall-rule create --name allowAll --workspace-name $SYNAPSE_WORKSPACE_NAME --resource-group $RESOURCE_GROUP --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255 + # + + sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_USER_MANAGED_ID/g;" $USER_IDENTITY_YML + + # + az ml workspace update --subscription $SUBSCRIPTION_ID --resource-group $RESOURCE_GROUP --name $AML_WORKSPACE_NAME --file $USER_IDENTITY_YML + # + + # + sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_WORKSPACE_NAME/g; + s//$ATTACHED_SPARK_POOL_NAME/g; + s//$SYNAPSE_WORKSPACE_NAME/g; + s//$SPARK_POOL_NAME/g; + s//$AML_USER_MANAGED_ID/g; + s//$ATTACHED_SPARK_POOL_NAME_UAI/g; + s//$AML_USER_MANAGED_ID/g;" $ATTACH_SPARK_PY + + python $ATTACH_SPARK_PY + # + + COMPUTE_MANAGED_IDENTITY=$(az ml compute show --name $ATTACHED_SPARK_POOL_NAME --resource-group $RESOURCE_GROUP --workspace-name $AML_WORKSPACE_NAME --query identity.principal_id --out tsv) + + if [[ ! -z "$COMPUTE_MANAGED_IDENTITY" ]] + then + az synapse role assignment create --workspace-name $SYNAPSE_WORKSPACE_NAME --role $SPARK_POOL_ADMIN_ROLE_ID --assignee $COMPUTE_MANAGED_IDENTITY + fi + + COMPUTE_MANAGED_IDENTITY=$(az ml compute show --name $ATTACHED_SPARK_POOL_NAME_UAI --resource-group $RESOURCE_GROUP --workspace-name $AML_WORKSPACE_NAME --query identity.principal_id --out tsv) + + if [[ ! -z "$COMPUTE_MANAGED_IDENTITY" ]] + then + az synapse role assignment create --workspace-name $SYNAPSE_WORKSPACE_NAME --role $SPARK_POOL_ADMIN_ROLE_ID --assignee $COMPUTE_MANAGED_IDENTITY + fi + + az synapse role assignment create --workspace-name $SYNAPSE_WORKSPACE_NAME --role $SPARK_POOL_ADMIN_ROLE_ID --assignee $AML_USER_MANAGED_ID_OID + + sed -i "s//$SUBSCRIPTION_ID/g; + s//$RESOURCE_GROUP/g; + s//$AML_WORKSPACE_NAME/g; + s//$SYNAPSE_WORKSPACE_NAME/g; + s//$ATTACHED_SPARK_POOL_NAME/g; + s//$SPARK_POOL_NAME/g; + s//$AML_USER_MANAGED_ID/g; + s//$ATTACHED_SPARK_POOL_NAME_UAI/g; + s//$AML_USER_MANAGED_ID/g;" $2 +fi diff --git a/sdk/python/jobs/spark/submit_spark_pipeline_jobs.ipynb b/sdk/python/jobs/spark/submit_spark_pipeline_jobs.ipynb index 00bf24efd6..8f7b672f80 100644 --- a/sdk/python/jobs/spark/submit_spark_pipeline_jobs.ipynb +++ b/sdk/python/jobs/spark/submit_spark_pipeline_jobs.ipynb @@ -55,12 +55,13 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 1\",\n", + " name=\"spark_component_1\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", @@ -91,7 +92,7 @@ " )\n", " spark_step.outputs.wrangled_data.mode = InputOutputModes.DIRECT\n", " spark_step.identity = ManagedIdentityConfiguration()\n", - " spark_step.compute = \"\"\n", + " spark_step.compute = attached_spark_pool_name\n", "\n", "\n", "pipeline = spark_pipeline(\n", @@ -132,12 +133,13 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name_uai = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 2\",\n", + " name=\"spark_component_2\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", @@ -168,7 +170,7 @@ " )\n", " spark_step.outputs.wrangled_data.mode = InputOutputModes.DIRECT\n", " spark_step.identity = UserIdentityConfiguration()\n", - " spark_step.compute = \"\"\n", + " spark_step.compute = attached_spark_pool_name_uai\n", "\n", "\n", "pipeline = spark_pipeline(\n", @@ -209,12 +211,13 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 3\",\n", + " name=\"spark_component_3\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", @@ -242,7 +245,7 @@ " path=\"azureml://datastores/workspaceblobstore/paths/data/wrangled/\",\n", " )\n", " spark_step.outputs.wrangled_data.mode = InputOutputModes.DIRECT\n", - " spark_step.compute = \"\"\n", + " spark_step.compute = attached_spark_pool_name\n", "\n", "\n", "pipeline = spark_pipeline(\n", @@ -306,7 +309,7 @@ ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 4\",\n", + " name=\"spark_component_4\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", @@ -386,7 +389,7 @@ ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 5\",\n", + " name=\"spark_component_5\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", @@ -466,7 +469,7 @@ ")\n", "\n", "spark_component = spark(\n", - " name=\"Spark Component 6\",\n", + " name=\"spark_component_6\",\n", " inputs={\n", " \"titanic_data\": Input(type=\"uri_file\", mode=\"direct\"),\n", " },\n", diff --git a/sdk/python/jobs/spark/submit_spark_standalone_jobs.ipynb b/sdk/python/jobs/spark/submit_spark_standalone_jobs.ipynb index 4a57bfed91..522a421ad7 100644 --- a/sdk/python/jobs/spark/submit_spark_standalone_jobs.ipynb +++ b/sdk/python/jobs/spark/submit_spark_standalone_jobs.ipynb @@ -54,6 +54,7 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", @@ -67,7 +68,7 @@ " executor_cores=2,\n", " executor_memory=\"2g\",\n", " executor_instances=2,\n", - " compute=\"\",\n", + " compute=attached_spark_pool_name,\n", " inputs={\n", " \"titanic_data\": Input(\n", " type=\"uri_file\",\n", @@ -113,6 +114,7 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", @@ -126,7 +128,7 @@ " executor_cores=2,\n", " executor_memory=\"2g\",\n", " executor_instances=2,\n", - " compute=\"\",\n", + " compute=attached_spark_pool_name,\n", " inputs={\n", " \"titanic_data\": Input(\n", " type=\"uri_file\",\n", @@ -172,6 +174,7 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace = \"\"\n", + "attached_spark_pool_name = \"\"\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace\n", ")\n", @@ -185,7 +188,7 @@ " executor_cores=2,\n", " executor_memory=\"2g\",\n", " executor_instances=2,\n", - " compute=\"\",\n", + " compute=attached_spark_pool_name,\n", " inputs={\n", " \"titanic_data\": Input(\n", " type=\"uri_file\",\n", diff --git a/sdk/python/jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb b/sdk/python/jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb index 088a07d41c..e88bdcc1e3 100644 --- a/sdk/python/jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb +++ b/sdk/python/jobs/spark/submit_spark_standalone_jobs_managed_vnet.ipynb @@ -183,7 +183,7 @@ "# Provisioning managed VNet with Spark support\n", "include_spark = True\n", "provision_network_result = ml_client.workspaces.begin_provision_network(\n", - " ws_name, include_spark\n", + " workspace_name=ws_name, include_spark=include_spark\n", ").result()" ] }, @@ -591,8 +591,8 @@ "from azure.ai.ml.entities import PrivateEndpointDestination\n", "\n", "# This will add a new outbound rule to existing rules\n", - "rule_name = \"\" # This name should be unique\n", - "adls_storage_account = \"\"\n", + "rule_name = \"\" # This name should be unique\n", + "adls_storage_account = \"\"\n", "service_resource_id = f\"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Storage/storageAccounts/{adls_storage_account}\"\n", "subresource_target = \"dfs\"\n", "spark_enabled = True\n", @@ -747,7 +747,7 @@ "# Enter the Azure Data Lake Storage (ADLS) Gen2 account name and container name.\n", "# The file `titanic.csv` should be placed inside folder `data`\n", "# created in the Azure Data Lake Storage (ADLS) Gen2 container.\n", - "adls_storage_account = \"\"\n", + "adls_storage_account = \"\"\n", "container_name = \"\"\n", "\n", "spark_job = spark(\n", @@ -862,7 +862,9 @@ }, "outputs": [], "source": [ - "ml_client.workspaces.begin_delete(name=ws_name, delete_dependent_resources=True)" + "ml_client.workspaces.begin_delete(\n", + " name=ws_name, permanently_delete=True, delete_dependent_resources=True\n", + ")" ] } ], diff --git a/sdk/python/notebooks_config.ini b/sdk/python/notebooks_config.ini index ec749692c1..b59062b3c2 100644 --- a/sdk/python/notebooks_config.ini +++ b/sdk/python/notebooks_config.ini @@ -29,3 +29,15 @@ COMPUTE_NAMES = recipe-cluster [automl-forecasting-recipe-univariate-run] USE_FORECAST_REQUIREMENTS = 1 COMPUTE_NAMES = recipe-cluster + +[automl-forecasting-demand-hierarchical-timeseries-in-pipeline] +USE_FORECAST_REQUIREMENTS = 0 +COMPUTE_NAMES = demand-fcst-hts-cluster + +[automl-forecasting-demand-many-models-in-pipeline] +USE_FORECAST_REQUIREMENTS = 0 +COMPUTE_NAMES = demand-fcst-mm-cluster + +[automl-forecasting-distributed-tcn] +USE_FORECAST_REQUIREMENTS = 0 +COMPUTE_NAMES = "distributed-tcn-cluster" diff --git a/sdk/python/readme.py b/sdk/python/readme.py index 5a0d41de43..b98b7f4b41 100644 --- a/sdk/python/readme.py +++ b/sdk/python/readme.py @@ -18,12 +18,7 @@ "train-hyperparameter-tune-with-sklearn", "train-hyperparameter-tune-deploy-with-keras", "train-hyperparameter-tune-deploy-with-tensorflow", - "pipeline_with_spark_nodes", "interactive_data_wrangling", - "attach_manage_spark_pools", - "submit_spark_pipeline_jobs", - "submit_spark_standalone_jobs", - "submit_spark_standalone_jobs_managed_vnet", # mlflow SDK samples notebooks "mlflow_sdk_online_endpoints_progresive", "mlflow_sdk_online_endpoints", @@ -38,6 +33,7 @@ "xgboost_nested_runs", "xgboost_service_principal", "using_mlflow_rest_api", + "yolov5/tutorial", ] # cannot automate lets exclude NOT_SCHEDULED_NOTEBOOKS = [] # these are too expensive, lets not run everyday # define branch where we need this @@ -83,14 +79,15 @@ def write_workflows(notebooks): cfg = ConfigParser() cfg.read(os.path.join("notebooks_config.ini")) for notebook in notebooks: - if not any(excluded in notebook for excluded in NOT_TESTED_NOTEBOOKS): + notebook_path = notebook.replace(os.sep, "/") + if not any(excluded in notebook_path for excluded in NOT_TESTED_NOTEBOOKS): # get notebook name name = os.path.basename(notebook).replace(".ipynb", "") folder = os.path.dirname(notebook) classification = folder.replace(os.sep, "-") enable_scheduled_runs = True - if any(excluded in notebook for excluded in NOT_SCHEDULED_NOTEBOOKS): + if any(excluded in notebook_path for excluded in NOT_SCHEDULED_NOTEBOOKS): enable_scheduled_runs = False # write workflow file @@ -108,7 +105,12 @@ def get_additional_requirements(req_name, req_path): def get_mlflow_import(notebook, validation_yml): with open(notebook, "r", encoding="utf-8") as f: - if validation_yml or "import mlflow" in f.read(): + string_file = f.read() + if ( + validation_yml + or "import mlflow" in string_file + or "from mlflow" in string_file + ): return get_additional_requirements( "mlflow", "sdk/python/mlflow-requirements.txt" ) @@ -194,6 +196,7 @@ def write_notebook_workflow( is_pipeline_notebook = ("jobs-pipelines" in classification) or ( "assets-component" in classification ) + is_spark_notebook_sample = ("jobs-spark" in classification) or ("_spark_" in name) creds = "${{secrets.AZUREML_CREDENTIALS}}" # Duplicate name in working directory during checkout # https://github.com/actions/checkout/issues/739 @@ -272,8 +275,10 @@ def write_notebook_workflow( source "{github_workspace}/infra/bootstrapping/init_environment.sh"; bash setup.sh working-directory: cli - continue-on-error: true - - name: run {posix_notebook} + continue-on-error: true\n""" + if is_spark_notebook_sample: + workflow_yaml += get_spark_config_workflow(posix_folder, name) + workflow_yaml += f""" - name: run {posix_notebook} run: | source "{github_workspace}/infra/bootstrapping/sdk_helpers.sh"; source "{github_workspace}/infra/bootstrapping/init_environment.sh"; @@ -453,6 +458,16 @@ def modify_notebooks(notebooks): print("finished modifying notebooks...") +def get_spark_config_workflow(folder_name, file_name): + workflow = f""" - name: setup spark resources + run: | + bash -x jobs/spark/setup_spark.sh jobs/spark/ {folder_name}/{file_name}.ipynb + working-directory: sdk/python + continue-on-error: true\n""" + + return workflow + + @contextlib.contextmanager def change_working_dir(path): """Context manager for changing the current working directory""" diff --git a/sdk/python/resources/compute/attach_manage_spark_pools.ipynb b/sdk/python/resources/compute/attach_manage_spark_pools.ipynb index e8e9dd65a1..5c43074d0e 100644 --- a/sdk/python/resources/compute/attach_manage_spark_pools.ipynb +++ b/sdk/python/resources/compute/attach_manage_spark_pools.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -9,6 +10,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -29,19 +31,23 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace_name = \"\"\n", + "synapse_workspace_name = \"\"\n", "\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace_name\n", ")\n", "\n", "synapse_name = \"\"\n", - "synapse_resource = \"/subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/\"\n", + "spark_pool_name = \"\"\n", + "\n", + "synapse_resource = f\"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}\"\n", "\n", "synapse_comp = SynapseSparkCompute(name=synapse_name, resource_id=synapse_resource)\n", "ml_client.begin_create_or_update(synapse_comp).result()" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -62,13 +68,16 @@ "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace_name = \"\"\n", + "synapse_workspace_name = \"\"\n", "\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace_name\n", ")\n", "\n", "synapse_name = \"\"\n", - "synapse_resource = \"/subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/\"\n", + "spark_pool_name = \"\"\n", + "\n", + "synapse_resource = f\"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}\"\n", "synapse_identity = IdentityConfiguration(type=\"SystemAssigned\")\n", "\n", "synapse_comp = SynapseSparkCompute(\n", @@ -78,6 +87,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -95,25 +105,33 @@ "from azure.ai.ml.entities import (\n", " SynapseSparkCompute,\n", " IdentityConfiguration,\n", - " UserAssignedIdentity,\n", + " ManagedIdentityConfiguration,\n", ")\n", "from azure.identity import DefaultAzureCredential\n", "\n", "subscription_id = \"\"\n", "resource_group = \"\"\n", "workspace_name = \"\"\n", + "synapse_workspace_name = \"\"\n", + "\n", + "# Define name of user-assigned managed identity\n", + "user_managed_id = \"\"\n", + "# Define Client ID for user-assigned managed identity\n", + "user_managed_client_id = \"\"\n", "\n", "ml_client = MLClient(\n", " DefaultAzureCredential(), subscription_id, resource_group, workspace_name\n", ")\n", "\n", - "synapse_name = \"\"\n", - "synapse_resource = \"/subscriptions//resourceGroups//providers/Microsoft.Synapse/workspaces//bigDataPools/\"\n", + "synapse_name = \"\"\n", + "spark_pool_name = \"\"\n", + "synapse_resource = f\"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}\"\n", "synapse_identity = IdentityConfiguration(\n", " type=\"UserAssigned\",\n", " user_assigned_identities=[\n", - " UserAssignedIdentity(\n", - " resource_id=\"/subscriptions//providers/Microsoft.ManagedIdentity/userAssignedIdentities/\"\n", + " ManagedIdentityConfiguration(\n", + " client_id=f\"{user_managed_client_id}\",\n", + " resource_id=f\"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{user_managed_id}\",\n", " )\n", " ],\n", ")\n", @@ -125,6 +143,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/sdk/python/resources/compute/attach_managed_spark_pools.py b/sdk/python/resources/compute/attach_managed_spark_pools.py new file mode 100644 index 0000000000..52dfcdd5e6 --- /dev/null +++ b/sdk/python/resources/compute/attach_managed_spark_pools.py @@ -0,0 +1,89 @@ +# import required libraries + +# Attach a Synapse Spark pool +from azure.ai.ml import MLClient +from azure.ai.ml.entities import SynapseSparkCompute +from azure.identity import DefaultAzureCredential + +subscription_id = "" +resource_group = "" +workspace_name = "" +synapse_workspace_name = "" + +ml_client = MLClient( + DefaultAzureCredential(), subscription_id, resource_group, workspace_name +) + +synapse_name = "" +spark_pool_name = "" +synapse_resource = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}" + +synapse_comp = SynapseSparkCompute(name=synapse_name, resource_id=synapse_resource) +ml_client.begin_create_or_update(synapse_comp).result() + + +# Attach a Synapse Spark pool with system-assigned identity +from azure.ai.ml import MLClient +from azure.ai.ml.entities import SynapseSparkCompute, IdentityConfiguration +from azure.identity import DefaultAzureCredential + +subscription_id = "" +resource_group = "" +workspace_name = "" +synapse_workspace_name = "" + +ml_client = MLClient( + DefaultAzureCredential(), subscription_id, resource_group, workspace_name +) + +synapse_name = "" +spark_pool_name = "" +synapse_resource = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}" +synapse_identity = IdentityConfiguration(type="SystemAssigned") + +synapse_comp = SynapseSparkCompute( + name=synapse_name, resource_id=synapse_resource, identity=synapse_identity +) +ml_client.begin_create_or_update(synapse_comp).result() + + +# Attach a Synapse Spark pool with user-assigned identity +from azure.ai.ml import MLClient +from azure.ai.ml.entities import ( + SynapseSparkCompute, + IdentityConfiguration, + ManagedIdentityConfiguration, +) +from azure.identity import DefaultAzureCredential + +subscription_id = "" +resource_group = "" +workspace_name = "" +synapse_workspace_name = "" + +# Define name of user-assigned managed identity +user_managed_id = "" +# Define Client ID for user-assigned managed identity +user_managed_client_id = "" + +ml_client = MLClient( + DefaultAzureCredential(), subscription_id, resource_group, workspace_name +) + +synapse_name = "" +spark_pool_name = "" +synapse_resource = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.Synapse/workspaces/{synapse_workspace_name}/bigDataPools/{spark_pool_name}" +synapse_identity = IdentityConfiguration( + type="UserAssigned", + user_assigned_identities=[ + ManagedIdentityConfiguration( + client_id=f"{user_managed_client_id}", + resource_id=f"/subscriptions/{subscription_id}/resourceGroups/{resource_group}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{user_managed_id}", + ) + ], +) + +synapse_comp = SynapseSparkCompute( + name=synapse_name, resource_id=synapse_resource, identity=synapse_identity +) +ml_client.begin_create_or_update(synapse_comp).result() diff --git a/sdk/python/responsible-ai/text/responsibleaidashboard-multilabel-text-classification-covid-events.ipynb b/sdk/python/responsible-ai/text/responsibleaidashboard-multilabel-text-classification-covid-events.ipynb index fd1a0183f2..027056b698 100644 --- a/sdk/python/responsible-ai/text/responsibleaidashboard-multilabel-text-classification-covid-events.ipynb +++ b/sdk/python/responsible-ai/text/responsibleaidashboard-multilabel-text-classification-covid-events.ipynb @@ -57,7 +57,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -95,7 +95,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"8\"" + "rai_example_version_string = \"9\"" ] }, { @@ -595,7 +595,7 @@ " model_output_path:\n", " type: path\n", "code: ./covid19_events_component_src/\n", - "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/16\n", + "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python training_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", diff --git a/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-DBPedia.ipynb b/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-DBPedia.ipynb index 69998b83ae..313c914b95 100644 --- a/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-DBPedia.ipynb +++ b/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-DBPedia.ipynb @@ -47,7 +47,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -85,7 +85,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"8\"" + "rai_example_version_string = \"9\"" ] }, { @@ -576,7 +576,7 @@ " model_output_path:\n", " type: path\n", "code: ./dbpedia_component_src/\n", - "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/16\n", + "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python training_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", diff --git a/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-blbooksgenre.ipynb b/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-blbooksgenre.ipynb index 3747f198cf..270101fadf 100644 --- a/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-blbooksgenre.ipynb +++ b/sdk/python/responsible-ai/text/responsibleaidashboard-text-classification-blbooksgenre.ipynb @@ -31,9 +31,7 @@ "source": [ "%pip install datasets\n", "%pip install ml-wrappers\n", - "%pip install \"pandas<2.0.0\"\n", - "%pip install \"mlflow<2.3,>=2.1\"\n", - "%pip install azureml-mlflow" + "%pip install \"pandas<2.0.0\"" ] }, { @@ -52,7 +50,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -90,7 +88,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"20\"" + "rai_example_version_string = \"21\"" ] }, { @@ -569,7 +567,7 @@ " model_output_path:\n", " type: path\n", "code: ./blbooksgenre_component_src/\n", - "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/21\n", + "environment: azureml://registries/azureml/environments/responsibleai-text-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python training_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", diff --git a/sdk/python/responsible-ai/vision/responsibleaidashboard-automl-image-classification-fridge.ipynb b/sdk/python/responsible-ai/vision/responsibleaidashboard-automl-image-classification-fridge.ipynb index 7dd03a9b3e..7a60be65bb 100644 --- a/sdk/python/responsible-ai/vision/responsibleaidashboard-automl-image-classification-fridge.ipynb +++ b/sdk/python/responsible-ai/vision/responsibleaidashboard-automl-image-classification-fridge.ipynb @@ -19,7 +19,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -27,7 +27,7 @@ "id": "06008690", "metadata": {}, "source": [ - "We also need to give the name of the compute cluster we want to use in AzureML. Later in this notebook, we will create it if it does not already exist:" + "We can optionally provide the name of the compute cluster we want to use in AzureML. Later in this notebook, we will create it if it does not already exist as an example. AzureML can also run on serverless computes if a compute is not explicitly set. " ] }, { @@ -37,7 +37,7 @@ "metadata": {}, "outputs": [], "source": [ - "train_compute_name = \"gpu-cluster-nc6\"\n", + "train_compute_name = \"gpu-cluster-nc6-v3\"\n", "\n", "rai_compute_name = \"cpucluster\"" ] @@ -57,7 +57,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"50\"" + "rai_example_version_string = \"51\"" ] }, { @@ -140,7 +140,21 @@ "source": [ "#### Compute target setup\n", "\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model.\n" + "There are two ways to submit a job - through a compute or a serverless job.\n", + "\n", + "##### Serverless Job:\n", + "\n", + "In a serverless job, there is no need to create a compute explicitly.\n", + "Simply pass the desired instance type value to the `instance_type` parameter while creating a pipeline job.\n", + "This allows for quick and convenient job submission without the need for managing a compute cluster.\n", + "\n", + "##### Compute Job:\n", + "\n", + "The following code below demonstrates how to create a gpu compute cluster.\n", + "After creating the compute cluster, pass the name of the compute cluster to the `compute_name` parameter while submitting the pipeline job. This ensures that the job runs on the specified compute cluster, allowing for more control and customization.\n", + "\n", + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model.\n", + "\n" ] }, { @@ -160,7 +174,7 @@ " train_compute_config = AmlCompute(\n", " name=train_compute_name,\n", " type=\"amlcompute\",\n", - " size=\"Standard_NC6\",\n", + " size=\"Standard_NC6s_v3\",\n", " min_instances=0,\n", " max_instances=4,\n", " idle_time_before_scale_down=120,\n", @@ -532,6 +546,14 @@ "exp_name = \"dpv2-image-classification-experiment\"" ] }, + { + "cell_type": "markdown", + "id": "005a1098", + "metadata": {}, + "source": [ + "This pipeline uses serverless compute. To use the compute you created above, uncomment the compute parameter line." + ] + }, { "cell_type": "code", "execution_count": null, @@ -541,9 +563,16 @@ "source": [ "# Create the AutoML job with the related factory-function.\n", "\n", + "import random\n", + "import string\n", + "\n", + "allowed_chars = string.ascii_lowercase + string.digits\n", + "suffix = \"\".join(random.choice(allowed_chars) for x in range(5))\n", + "job_name = \"dpv2-image-classification-job-02\" + suffix\n", + "\n", "image_classification_job = automl.image_classification(\n", - " compute=train_compute_name,\n", - " # name=\"dpv2-image-classification-job-02\",\n", + " # compute=train_compute_name,\n", + " name=job_name,\n", " experiment_name=exp_name,\n", " training_data=my_training_data_input,\n", " validation_data=my_validation_data_input,\n", @@ -798,21 +827,6 @@ "### 4.4 Register model" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "69c6aee4", - "metadata": {}, - "outputs": [], - "source": [ - "import random\n", - "import string\n", - "\n", - "# Creating a unique model name by including a random suffix\n", - "allowed_chars = string.ascii_lowercase + string.digits\n", - "model_suffix = \"\".join(random.choice(allowed_chars) for x in range(5))" - ] - }, { "cell_type": "code", "execution_count": null, @@ -820,7 +834,7 @@ "metadata": {}, "outputs": [], "source": [ - "model_name = \"ic-mc-rai-fridge-items-model\" + model_suffix\n", + "model_name = \"ic-mc-rai-fridge-items-model\" + suffix\n", "model = Model(\n", " path=f\"azureml://jobs/{best_run.info.run_id}/outputs/artifacts/outputs/mlflow-model/\",\n", " name=model_name,\n", diff --git a/sdk/python/responsible-ai/vision/responsibleaidashboard-image-classification-fridge.ipynb b/sdk/python/responsible-ai/vision/responsibleaidashboard-image-classification-fridge.ipynb index ede1152bb2..cf4004a534 100644 --- a/sdk/python/responsible-ai/vision/responsibleaidashboard-image-classification-fridge.ipynb +++ b/sdk/python/responsible-ai/vision/responsibleaidashboard-image-classification-fridge.ipynb @@ -20,7 +20,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -58,7 +58,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"8\"" + "rai_example_version_string = \"9\"" ] }, { @@ -505,7 +505,7 @@ " model_output_path:\n", " type: path\n", "code: ./fridge_component_src/\n", - "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/17\n", + "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python training_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", diff --git a/sdk/python/responsible-ai/vision/responsibleaidashboard-image-multilabel-classification-fridge.ipynb b/sdk/python/responsible-ai/vision/responsibleaidashboard-image-multilabel-classification-fridge.ipynb index 7c078f1b62..65e317d72f 100644 --- a/sdk/python/responsible-ai/vision/responsibleaidashboard-image-multilabel-classification-fridge.ipynb +++ b/sdk/python/responsible-ai/vision/responsibleaidashboard-image-multilabel-classification-fridge.ipynb @@ -20,7 +20,7 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"" + "version_string = \"0.0.8\"" ] }, { @@ -58,7 +58,7 @@ "metadata": {}, "outputs": [], "source": [ - "rai_example_version_string = \"9\"" + "rai_example_version_string = \"10\"" ] }, { @@ -509,7 +509,7 @@ " model_output_path:\n", " type: path\n", "code: ./fridge_component_src/\n", - "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/17\n", + "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python training_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", diff --git a/sdk/python/responsible-ai/vision/responsibleaidashboard-object-detection-MSCOCO.ipynb b/sdk/python/responsible-ai/vision/responsibleaidashboard-object-detection-MSCOCO.ipynb index 917804a8f3..301bde9c0d 100644 --- a/sdk/python/responsible-ai/vision/responsibleaidashboard-object-detection-MSCOCO.ipynb +++ b/sdk/python/responsible-ai/vision/responsibleaidashboard-object-detection-MSCOCO.ipynb @@ -18,9 +18,9 @@ "metadata": {}, "outputs": [], "source": [ - "version_string = \"0.0.7\"\n", + "version_string = \"0.0.8\"\n", "compute_name = \"cpucluster\"\n", - "rai_example_version_string = \"6\"" + "rai_example_version_string = \"9\"" ] }, { @@ -64,7 +64,7 @@ " urlretrieve(data_url, filename=data_output_path)\n", "\n", "\n", - "annotations = \"msCOCOValExample.jsonl\"\n", + "annotations = \"msCOCOValExample7.jsonl\"\n", "\n", "data_path = \"./dataMSCOCO\"\n", "\n", @@ -436,7 +436,7 @@ " model_output_path:\n", " type: path\n", "code: ./mscoco_component_src_od_1/\n", - "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/17\n", + "environment: azureml://registries/azureml/environments/responsibleai-vision-ubuntu20.04-py38-cpu/versions/24\n", "command: >-\n", " python model_script.py\n", " --model_base_name ${{{{inputs.model_base_name}}}}\n", @@ -649,6 +649,8 @@ " classes=classes,\n", " model_type=\"pytorch\",\n", " enable_error_analysis=False,\n", + " num_masks=300,\n", + " mask_res=4,\n", " )\n", " rai_image_job.set_limits(timeout=120)\n", "\n", diff --git a/tutorials/azureml-getting-started/azureml-getting-started-studio.ipynb b/tutorials/azureml-getting-started/azureml-getting-started-studio.ipynb index d23eb4f6ce..2523627ecc 100644 --- a/tutorials/azureml-getting-started/azureml-getting-started-studio.ipynb +++ b/tutorials/azureml-getting-started/azureml-getting-started-studio.ipynb @@ -270,7 +270,7 @@ " command=\"python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}\",\n", " # This is the ready-made environment you are using\n", " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " # This is the compute you created earlier\n", + " # This is the compute you created earlier. You can alternatively remove this line to use serverless compute to run the job\n", " compute=\"cpu-cluster\",\n", " # An experiment is a container for all the iterations one does on a certain project. All the jobs submitted under the same experiment name would be listed next to each other in Azure ML studio.\n", " experiment_name=\"train_model_credit_default_prediction\",\n", diff --git a/tutorials/azureml-in-a-day/azureml-in-a-day.ipynb b/tutorials/azureml-in-a-day/azureml-in-a-day.ipynb index 89184d99c9..0a9384a72d 100644 --- a/tutorials/azureml-in-a-day/azureml-in-a-day.ipynb +++ b/tutorials/azureml-in-a-day/azureml-in-a-day.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -24,6 +25,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -36,6 +38,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -67,6 +70,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -119,6 +123,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -129,6 +134,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -158,6 +164,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -195,6 +202,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -231,6 +239,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -246,6 +255,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -283,6 +293,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [] @@ -434,7 +445,7 @@ " inputs=dict(\n", " data=Input(\n", " type=\"uri_file\",\n", - " path=\"https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls\",\n", + " path=\"https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default%20of%20credit%20card%20clients.csv\",\n", " ),\n", " test_train_ratio=0.2,\n", " learning_rate=0.25,\n", @@ -442,13 +453,14 @@ " ),\n", " code=\"./src/\", # location of source code\n", " command=\"python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}\",\n", - " environment=\"aml-scikit-learn@latest\",\n", + " environment=\"aml-scikit-learn@latest\",\n", " experiment_name=\"train_model_credit_default_prediction\",\n", " display_name=\"credit_default_prediction\",\n", ")" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -469,6 +481,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -486,6 +499,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -500,6 +514,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -523,6 +538,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -562,6 +578,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -584,6 +601,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -609,6 +627,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -643,6 +662,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -703,6 +723,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -727,6 +748,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/tutorials/e2e-distributed-pytorch-image/e2e-object-classification-distributed-pytorch.ipynb b/tutorials/e2e-distributed-pytorch-image/e2e-object-classification-distributed-pytorch.ipynb index a5145e23bc..95edebcc9a 100644 --- a/tutorials/e2e-distributed-pytorch-image/e2e-object-classification-distributed-pytorch.ipynb +++ b/tutorials/e2e-distributed-pytorch-image/e2e-object-classification-distributed-pytorch.ipynb @@ -14,7 +14,7 @@ "\n", "**Requirements** - In order to benefit from this tutorial, you need:\n", "- to have provisioned an AzureML workspace\n", - "- to have permissions to provision a minimal cpu and gpu cluster\n", + "- to have permissions to provision a minimal cpu and gpu cluster or simply use [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python)\n", "- to have [installed Azure Machine Learning Python SDK v2](https://github.com/Azure/azureml-examples/blob/sdk-preview/sdk/README.md)\n", "\n", "**Motivations** - Let's consider the following scenario: we want to explore training different image classifiers on distinct kinds of problems, based on a large public dataset that is available at a given url. This ML pipeline will be future-looking, in particular we want:\n", @@ -72,7 +72,9 @@ " resource_group_name=\"\",\n", " workspace_name=\"\",\n", " credential=credential,\n", - ")" + ")\n", + "cpu_cluster = None\n", + "gpu_cluster = None" ] }, { @@ -80,7 +82,7 @@ "id": "41d3ce5e", "metadata": {}, "source": [ - "### Provision the required resources for this notebook\n", + "### Provision the required resources for this notebook (Optional)\n", "\n", "We'll need 2 clusters for this notebook, a CPU cluster and a GPU cluster. First, let's create a minimal cpu cluster." ] @@ -164,7 +166,7 @@ " gpu_cluster = AmlCompute(\n", " name=\"gpu-cluster\",\n", " type=\"amlcompute\",\n", - " size=\"STANDARD_NC6\", # 1 x NVIDIA Tesla K80\n", + " size=\"STANDARD_NC6s_v3\", # 1 x NVIDIA Tesla V100\n", " min_instances=0,\n", " max_instances=4,\n", " idle_time_before_scale_down=180,\n", @@ -240,7 +242,9 @@ " },\n", " # we're using a curated environment\n", " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu:1\",\n", - " compute=\"cpu-cluster\",\n", + " compute=\"cpu-cluster\"\n", + " if (cpu_cluster)\n", + " else None, # No compute needs to be passed to use serverless\n", ")" ] }, @@ -362,6 +366,7 @@ "source": [ "from azure.ai.ml import command\n", "from azure.ai.ml import Input\n", + "from azure.ai.ml.entities import ResourceConfiguration\n", "\n", "training_job = command(\n", " # local path where the code is stored\n", @@ -408,7 +413,9 @@ " \"enable_profiling\": False,\n", " },\n", " environment=\"AzureML-pytorch-1.10-ubuntu18.04-py38-cuda11-gpu@latest\",\n", - " compute=\"gpu-cluster\",\n", + " compute=\"gpu-cluster\"\n", + " if (gpu_cluster)\n", + " else None, # No compute needs to be passed to use serverless\n", " distribution={\n", " \"type\": \"PyTorch\",\n", " # set process count to the number of gpus on the node\n", @@ -419,7 +426,11 @@ " instance_count=2,\n", " display_name=\"pytorch_training_sample\",\n", " description=\"training a torchvision model\",\n", - ")" + ")\n", + "if gpu_cluster == None:\n", + " training_job.resources = ResourceConfiguration(\n", + " instance_type=\"Standard_NC6s_v3\", instance_count=2\n", + " ) # resources for serverless job" ] }, { diff --git a/tutorials/e2e-ds-experience/e2e-ml-workflow.ipynb b/tutorials/e2e-ds-experience/e2e-ml-workflow.ipynb index 31f640cd72..cc01a498a8 100644 --- a/tutorials/e2e-ds-experience/e2e-ml-workflow.ipynb +++ b/tutorials/e2e-ds-experience/e2e-ml-workflow.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -8,6 +9,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -24,6 +26,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -31,6 +34,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -43,6 +47,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -84,7 +89,7 @@ "Before creating the pipeline, you'll set up the resources the pipeline will use:\n", "\n", "* The dataset for training\n", - "* The software environment to run the pipeline\n", + "* The software environment to run the pipeline\n", "\n", "## Connect to the workspace\n", "\n", @@ -126,6 +131,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -159,6 +165,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -189,19 +196,20 @@ "from azure.ai.ml.entities import Data\n", "from azure.ai.ml.constants import AssetTypes\n", "\n", - "web_path = \"https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls\"\n", + "web_path = \"https://azuremlexamples.blob.core.windows.net/datasets/credit_card/default%20of%20credit%20card%20clients.csv\"\n", "\n", "credit_data = Data(\n", - " name=\"creditcard_defaults\",\n", + " name=\"creditcard_blob_csv_defaults\",\n", " path=web_path,\n", " type=AssetTypes.URI_FILE,\n", " description=\"Dataset for credit card defaults\",\n", - " tags={\"source_type\": \"web\", \"source\": \"UCI ML Repo\"},\n", + " tags={\"source_type\": \"web\", \"source\": \"AzureML examples blob\"},\n", " version=\"1.0.0\",\n", ")" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -237,6 +245,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -263,6 +272,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -297,11 +307,11 @@ " - pip:\n", " - inference-schema[numpy-support]==1.3.0\n", " - xlrd==2.0.1\n", - " - mlflow== 1.26.1\n", " - azureml-mlflow==1.42.0" ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -335,7 +345,7 @@ " tags={\"scikit-learn\": \"0.24.2\"},\n", " conda_file=os.path.join(dependencies_dir, \"conda.yaml\"),\n", " image=\"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest\",\n", - " version=\"0.1.0\",\n", + " version=\"0.1.1\",\n", ")\n", "pipeline_job_env = ml_client.environments.create_or_update(pipeline_job_env)\n", "\n", @@ -345,6 +355,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -388,6 +399,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -437,7 +449,7 @@ "\n", " print(\"input data:\", args.data)\n", "\n", - " credit_df = pd.read_excel(args.data, header=1, index_col=0)\n", + " credit_df = pd.read_csv(args.data, header=1, index_col=0)\n", "\n", " mlflow.log_metric(\"num_samples\", credit_df.shape[0])\n", " mlflow.log_metric(\"num_features\", credit_df.shape[1] - 1)\n", @@ -461,6 +473,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -505,6 +518,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "nteract": { @@ -533,6 +547,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -567,6 +582,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -681,6 +697,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -739,6 +756,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -767,6 +785,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -797,6 +816,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -806,6 +826,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -813,6 +834,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "attributes": { @@ -881,6 +903,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -913,6 +936,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -946,6 +970,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -961,6 +986,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -969,6 +995,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -984,6 +1011,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1052,6 +1080,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1080,6 +1109,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1111,6 +1141,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1151,6 +1182,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1217,6 +1249,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -1247,6 +1280,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/tutorials/get-started-notebooks/explore-data.ipynb b/tutorials/get-started-notebooks/explore-data.ipynb index 60b83f4904..54f3b6b867 100644 --- a/tutorials/get-started-notebooks/explore-data.ipynb +++ b/tutorials/get-started-notebooks/explore-data.ipynb @@ -165,9 +165,11 @@ "\n", "The next notebook cell creates the data asset. The code sample uploads the raw data file to the designated cloud storage resource. \n", "\n", - "Each time you create a data asset, you need a unique version for it. If the version already exists, you'll get an error. In this code, we're using time to generate a unique version each time the cell is run.\n", + "Each time you create a data asset, you need a unique version for it. If the version already exists, you'll get an error. In this code, we're using the \"initial\" for the first read of the data. If that version already exists, we'll skip creating it again.\n", "\n", - "You can also omit the **version** parameter, and a version number is generated for you, starting with 1 and then incrementing from there. In this tutorial, we want to refer to specific version numbers, so we create a version number instead." + "You can also omit the **version** parameter, and a version number is generated for you, starting with 1 and then incrementing from there. \n", + "\n", + "In this tutorial, we use the name \"initial\" as the first version. The [Create production machine learning pipelines](pipeline.ipynb) tutorial will also use this version of the data, so here we are using a value that you'll see again in that tutorial." ] }, { @@ -191,15 +193,13 @@ "source": [ "from azure.ai.ml.entities import Data\n", "from azure.ai.ml.constants import AssetTypes\n", - "import time\n", "\n", "# update the 'my_path' variable to match the location of where you downloaded the data on your\n", "# local filesystem\n", "\n", "my_path = \"./data/default_of_credit_card_clients.csv\"\n", - "# set the version number of the data asset to the current UTC time\n", - "v1 = time.strftime(\"%Y.%m.%d.%H%M%S\", time.gmtime())\n", - "\n", + "# set the version number of the data asset\n", + "v1 = \"initial\"\n", "\n", "my_data = Data(\n", " name=\"credit-card\",\n", @@ -209,10 +209,15 @@ " type=AssetTypes.URI_FILE,\n", ")\n", "\n", - "# create data asset\n", - "ml_client.data.create_or_update(my_data)\n", - "\n", - "print(f\"Data asset created. Name: {my_data.name}, version: {my_data.version}\")" + "## create data asset if it doesn't already exist:\n", + "try:\n", + " data_asset = ml_client.data.get(name=\"credit-card\", version=v1)\n", + " print(\n", + " f\"Data asset already exists. Name: {my_data.name}, version: {my_data.version}\"\n", + " )\n", + "except:\n", + " ml_client.data.create_or_update(my_data)\n", + " print(f\"Data asset created. Name: {my_data.name}, version: {my_data.version}\")" ] }, { @@ -398,11 +403,7 @@ "|X18-23 | Explanatory | Amount of previous payment (NT dollar) from April to September 2005. |\n", "|Y | Response | Default payment (Yes = 1, No = 0) |\n", "\n", - "Next, create a new _version_ of the data asset (the data automatically uploads to cloud storage):\n", - "\n", - "> [!NOTE]\n", - ">\n", - "> This Python code cell sets **name** and **version** values for the data asset it creates. As a result, the code in this cell will fail if executed more than once, without a change to these values. Fixed **name** and **version** values offer a way to pass values that work for specific situations, without concern for auto-generated or randomly-generated values.\n" + "Next, create a new _version_ of the data asset (the data automatically uploads to cloud storage). For this version, we'll add a time value, so that each time this code is run, a different version number will be created.\n" ] }, { @@ -429,7 +430,7 @@ "import time\n", "\n", "# Next, create a new *version* of the data asset (the data is automatically uploaded to cloud storage):\n", - "v2 = v1 + \"_cleaned\"\n", + "v2 = \"cleaned\" + time.strftime(\"%Y.%m.%d.%H%M%S\", time.gmtime())\n", "my_path = \"./data/cleaned-credit-card.parquet\"\n", "\n", "# Define the data asset, and use tags to make it clear the asset can be used in training\n", diff --git a/tutorials/get-started-notebooks/pipeline.ipynb b/tutorials/get-started-notebooks/pipeline.ipynb index a721afd057..91d15236d1 100644 --- a/tutorials/get-started-notebooks/pipeline.ipynb +++ b/tutorials/get-started-notebooks/pipeline.ipynb @@ -1,6 +1,7 @@ { "cells": [ { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -46,6 +47,8 @@ "\n", "* If you're seeing this notebook elsewhere, complete [Create resources you need to get started](https://docs.microsoft.com/azure/machine-learning/quickstart-create-resources) to create an Azure Machine Learning workspace and a compute instance.\n", "\n", + "* Complete the tutorial [Tutorial: Upload, access and explore your data](explore-data.ipynb) to create the data asset you need in this tutorial. Make sure you run all the code to create the initial data asset. You can optionally explore the data and revise it, but you'll only need the initial data to complete this tutorial.\n", + "\n", "## Set your kernel\n", "\n", "* If your compute instance is stopped, start it now. \n", @@ -108,7 +111,8 @@ " subscription_id=\"\",\n", " resource_group_name=\"\",\n", " workspace_name=\"\",\n", - ")" + ")\n", + "cpu_cluster = None" ] }, { @@ -119,45 +123,19 @@ "> [!NOTE]\n", "> Creating MLClient will not connect to the workspace. The client initialization is lazy, it will wait for the first time it needs to make a call (this will happen when creating the `credit_data` data asset, two code cells from here).\n", "\n", - "## Register data from an external url\n", - "\n", - "If you have been following along with the other tutorials in this series and already registered the data, you can fetch the same dataset from the workspace using `credit_dataset = ml_client.data.get(\"\", version='')`. Then you may skip this section. To learn about data more in depth or if you would rather complete the data tutorial first, see [Upload, access and explore your data in Azure Machine Learning](https://learn.microsoft.com/azure/machine-learning/tutorial-explore-data).\n", - "\n", - "* Azure Machine Learning uses a `Data` object to register a reusable definition of data, and consume data within a pipeline. In the next section, you consume some data from web url as one example. Data from other sources can be created as well. `Data` assets from other sources can be created as well.\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "name": "credit_data" - }, - "outputs": [], - "source": [ - "from azure.ai.ml.entities import Data\n", - "from azure.ai.ml.constants import AssetTypes\n", + "## Access the registered data asset\n", "\n", - "web_path = \"https://archive.ics.uci.edu/ml/machine-learning-databases/00350/default%20of%20credit%20card%20clients.xls\"\n", + "Start by getting the data that you previously registered in [Tutorial: Upload, access and explore your data](explore-data.ipynb).\n", "\n", - "credit_data = Data(\n", - " name=\"creditcard_defaults\",\n", - " path=web_path,\n", - " type=AssetTypes.URI_FILE,\n", - " description=\"Dataset for credit card defaults\",\n", - " tags={\"source_type\": \"web\", \"source\": \"UCI ML Repo\"},\n", - " version=\"1.0.0\",\n", - ")" + "* Azure Machine Learning uses a `Data` object to register a reusable definition of data, and consume data within a pipeline." ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "This code just created a `Data` asset, ready to be consumed as an input by the pipeline that you'll define in the next sections. In addition, you can register the data to your workspace so it becomes reusable across pipelines.\n", - "\n", - "Since this is the first time that you're making a call to the workspace, you may be asked to authenticate. Once the authentication is complete, you then see the dataset registration completion message.\n", - "\n" + "Since this is the first time that you're making a call to the workspace, you may be asked to authenticate. Once the authentication is complete, you then see the dataset registration completion message." ] }, { @@ -174,10 +152,9 @@ }, "outputs": [], "source": [ - "credit_data = ml_client.data.create_or_update(credit_data)\n", - "print(\n", - " f\"Dataset with name {credit_data.name} was registered to workspace, the dataset version is {credit_data.version}\"\n", - ")" + "# get a handle of the data asset and print the URI\n", + "credit_data = ml_client.data.get(name=\"credit-card\", version=\"initial\")\n", + "print(f\"Data asset URI: {credit_data.path}\")" ] }, { @@ -185,11 +162,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "In the future, you can fetch the same dataset from the workspace using `credit_dataset = ml_client.data.get(\"\", version='')`.\n", + "## Create a compute resource to run your pipeline (Optional)\n", "\n", - "## Create a compute resource to run your pipeline\n", - "\n", - "You can **skip this step** if you want to use **serverless compute (preview)** to run the training job. Through serverless compute, Azure Machine Learning takes care of creating, scaling, deleting, patching and managing compute, along with providing managed network isolation, reducing the burden on you. \n", + "You can **skip this step** if you want to use [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) to run the training job. Through serverless compute, Azure Machine Learning takes care of creating, scaling, deleting, patching and managing compute, along with providing managed network isolation, reducing the burden on you. \n", "\n", "Each step of an Azure Machine Learning pipeline can use a different compute resource for running the specific job of that step. It can be single or multi-node machines with Linux or Windows OS, or a specific compute fabric like Spark.\n", "\n", @@ -249,6 +224,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -275,6 +251,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -309,8 +286,8 @@ " - pip:\n", " - inference-schema[numpy-support]==1.3.0\n", " - xlrd==2.0.1\n", - " - mlflow== 1.26.1\n", - " - azureml-mlflow==1.42.0" + " - mlflow== 2.4.1\n", + " - azureml-mlflow==1.51.0" ] }, { @@ -349,7 +326,7 @@ " tags={\"scikit-learn\": \"0.24.2\"},\n", " conda_file=os.path.join(dependencies_dir, \"conda.yaml\"),\n", " image=\"mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest\",\n", - " version=\"0.1.0\",\n", + " version=\"0.2.0\",\n", ")\n", "pipeline_job_env = ml_client.environments.create_or_update(pipeline_job_env)\n", "\n", @@ -458,7 +435,7 @@ "\n", " print(\"input data:\", args.data)\n", "\n", - " credit_df = pd.read_excel(args.data, header=1, index_col=0)\n", + " credit_df = pd.read_csv(args.data, header=1, index_col=0)\n", "\n", " mlflow.log_metric(\"num_samples\", credit_df.shape[0])\n", " mlflow.log_metric(\"num_features\", credit_df.shape[1] - 1)\n", @@ -525,6 +502,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "nteract": { @@ -553,6 +531,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -586,6 +565,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -794,6 +774,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -803,6 +784,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -810,6 +792,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": { "attributes": { @@ -846,7 +829,9 @@ "\n", "\n", "@dsl.pipeline(\n", - " compute=cpu_compute_target, # replace cpu_compute_target with \"serverless\" to run pipeline on serverless compute\n", + " compute=cpu_compute_target\n", + " if (cpu_cluster)\n", + " else \"serverless\", # \"serverless\" value runs pipeline on serverless compute\n", " description=\"E2E data_perp-train pipeline\",\n", ")\n", "def credit_defaults_pipeline(\n", @@ -878,6 +863,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -910,6 +896,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -962,6 +949,7 @@ ] }, { + "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ diff --git a/tutorials/get-started-notebooks/quickstart.ipynb b/tutorials/get-started-notebooks/quickstart.ipynb index 2c7441871f..7f80595712 100644 --- a/tutorials/get-started-notebooks/quickstart.ipynb +++ b/tutorials/get-started-notebooks/quickstart.ipynb @@ -17,7 +17,7 @@ "\n", "> * Set up a handle to your Azure Machine Learning workspace\n", "> * Create your training script\n", - "> * Create a scalable compute resource, a compute cluster or use **serverless compute (preview)** instead\n", + "> * Create a scalable compute resource, a compute cluster or use [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) instead\n", "> * Create and run a command job that will run the training script on the compute cluster, configured with the appropriate job environment\n", "> * View the output of your training script\n", "> * Deploy the newly-trained model as an endpoint\n", @@ -96,7 +96,8 @@ " subscription_id=\"\",\n", " resource_group_name=\"\",\n", " workspace_name=\"\",\n", - ")" + ")\n", + "cpu_cluster = None" ] }, { @@ -271,7 +272,7 @@ "\n", "![refresh](./media/refresh.png)\n", "\n", - "## Create a compute cluster, a scalable way to run a training job\n", + "## Create a compute cluster, a scalable way to run a training job (Optional)\n", "\n", "You can **skip this step** if you want to use **serverless compute** to run the training job. Through serverless compute, Azure Machine Learning takes care of creating, scaling, deleting, patching and managing compute, along with providing managed network isolation, reducing the burden on you. \n", "\n", @@ -338,7 +339,7 @@ "Now that you have a script that can perform the desired tasks, and a compute cluster to run the script, you'll use a general purpose **command** that can run command line actions. This command line action can directly call system commands or run a script. \n", "\n", "Here, you'll create input variables to specify the input data, split ratio, learning rate and registered model name. The command script will:\n", - "* Use the compute cluster to run the command or just **remove the compute line to use serverless compute**.\n", + "* Use the compute cluster to run the command if you created it or use serverless compute by not specifying any compute.\n", "* Use an *environment* that defines software and runtime libraries needed for the training script. Azure Machine Learning provides many curated or ready-made environments, which are useful for common training and inference scenarios. You'll use one of those environments here. In the [Train a model](train-model.ipynb) tutorial, you'll learn how to create a custom environment. \n", "* Configure the command line action itself - `python main.py` in this case. The inputs/outputs are accessible in the command via the `${{ ... }}` notation.\n", "* In this sample, we access the data from a file on the internet. " @@ -373,7 +374,9 @@ " code=\"./src/\", # location of source code\n", " command=\"python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}\",\n", " environment=\"AzureML-sklearn-1.0-ubuntu20.04-py38-cpu@latest\",\n", - " compute=\"cpu-cluster\", # you can remove this line to use serverless compute\n", + " compute=\"cpu-cluster\"\n", + " if (cpu_cluster)\n", + " else None, # No compute needs to be passed to use serverless\n", " display_name=\"credit_default_prediction\",\n", ")" ] diff --git a/tutorials/get-started-notebooks/train-model.ipynb b/tutorials/get-started-notebooks/train-model.ipynb index d4fed7732e..5316e1aa0d 100644 --- a/tutorials/get-started-notebooks/train-model.ipynb +++ b/tutorials/get-started-notebooks/train-model.ipynb @@ -14,7 +14,7 @@ "The steps are:\n", "\n", " * Get a handle to your Azure Machine Learning workspace\n", - " * Create your compute resource (or simply use serverless compute) and job environment\n", + " * Create your compute resource (or simply use [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) instead) and job environment\n", " * Create your training script\n", " * Create and run your command job to run the training script on the compute resource, configured with the appropriate job environment and the data source\n", " * View the output of your training script\n", @@ -65,7 +65,7 @@ "\n", "In this tutorial, we'll focus on using a command job to create a custom training job that we'll use to train a model. For any custom training job, the below items are required:\n", "\n", - "* compute resource (usually a compute cluster, which we recommend for scalability)\n", + "* compute resource (usually a compute cluster or [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python))\n", "* environment\n", "* data\n", "* command job \n", @@ -113,7 +113,8 @@ " subscription_id=\"\",\n", " resource_group_name=\"\",\n", " workspace_name=\"\",\n", - ")" + ")\n", + "cpu_cluster = None" ] }, { @@ -130,9 +131,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Create a compute cluster to run your job\n", + "## Create a compute cluster to run your job (optional) \n", "\n", - "You can **skip this step** if you want to use **serverless compute (preview)** to run the training job. Through serverless compute, Azure Machine Learning takes care of creating, scaling, deleting, patching and managing compute, along with providing managed network isolation, reducing the burden on you. \n", + "You can **skip this step** if you want to use [serverless compute (preview)](https://learn.microsoft.com/azure/machine-learning/how-to-use-serverless-compute?view=azureml-api-2&tabs=python) to run the training job. Through serverless compute, Azure Machine Learning takes care of creating, scaling, deleting, patching and managing compute, along with providing managed network isolation, reducing the burden on you. \n", "\n", "In Azure, a job can refer to several tasks that Azure allows its users to do: training, pipeline creation, deployment, etc. For this tutorial and our purpose of training a machine learning model, we'll use *job* as a reference to running training computations (*training job*).\n", "\n", @@ -509,7 +510,9 @@ " code=\"./src/\", # location of source code\n", " command=\"python main.py --data ${{inputs.data}} --test_train_ratio ${{inputs.test_train_ratio}} --learning_rate ${{inputs.learning_rate}} --registered_model_name ${{inputs.registered_model_name}}\",\n", " environment=\"aml-scikit-learn@latest\",\n", - " compute=\"cpu-cluster\", # Remove this line to use serverless compute\n", + " compute=\"cpu-cluster\"\n", + " if (cpu_cluster)\n", + " else None, # No compute needs to be passed to use serverless\n", " display_name=\"credit_default_prediction\",\n", ")" ] diff --git a/v1/python-sdk/CONTRIBUTING.md b/v1/python-sdk/CONTRIBUTING.md index 583b1680bc..e0df5a4924 100644 --- a/v1/python-sdk/CONTRIBUTING.md +++ b/v1/python-sdk/CONTRIBUTING.md @@ -47,7 +47,7 @@ Enforced naming includes: - job definition file(s) under `workflows` must contain `job` in the name - tutorial workflows (and workflow files, inclduing experimental tutorials) use the naming convention `tutorial-*name*`, where *name* is the directory name - `experiment_name` = "logical-words-example|tutorial" e.g. "hello-world-tutorial" -- `compute_name` = "compute-defined-in-setup-workspace.py" e.g. "gpu-K80-2" +- `compute_name` = "compute-defined-in-setup-workspace.py" e.g. "gpu-V100-2" ### Unenforced naming diff --git a/v1/python-sdk/experimental/using-pytorch-lightning/1.train-single-node.ipynb b/v1/python-sdk/experimental/using-pytorch-lightning/1.train-single-node.ipynb index cca1dbb8d6..26508532a4 100644 --- a/v1/python-sdk/experimental/using-pytorch-lightning/1.train-single-node.ipynb +++ b/v1/python-sdk/experimental/using-pytorch-lightning/1.train-single-node.ipynb @@ -50,7 +50,7 @@ "# azure ml settings\n", "environment_name = \"pt-lightning\"\n", "experiment_name = \"pt-lightning-tutorial\"\n", - "compute_name = \"gpu-K80-2\"" + "compute_name = \"gpu-V100-2\"" ] }, { diff --git a/v1/python-sdk/experimental/using-pytorch-lightning/2.log-with-tensorboard.ipynb b/v1/python-sdk/experimental/using-pytorch-lightning/2.log-with-tensorboard.ipynb index 2105eab4e7..67d3a54fa2 100644 --- a/v1/python-sdk/experimental/using-pytorch-lightning/2.log-with-tensorboard.ipynb +++ b/v1/python-sdk/experimental/using-pytorch-lightning/2.log-with-tensorboard.ipynb @@ -39,7 +39,7 @@ "# azure ml settings\n", "environment_name = \"pt-lightning\"\n", "experiment_name = \"pt-lightning-tensorboard-tutorial\"\n", - "compute_name = \"gpu-K80-2\"" + "compute_name = \"gpu-V100-2\"" ] }, { diff --git a/v1/python-sdk/experimental/using-pytorch-lightning/3.log-with-mlflow.ipynb b/v1/python-sdk/experimental/using-pytorch-lightning/3.log-with-mlflow.ipynb index 57d8411d54..706be846b0 100644 --- a/v1/python-sdk/experimental/using-pytorch-lightning/3.log-with-mlflow.ipynb +++ b/v1/python-sdk/experimental/using-pytorch-lightning/3.log-with-mlflow.ipynb @@ -39,7 +39,7 @@ "# azure ml settings\n", "environment_name = \"pt-lightning\"\n", "experiment_name = \"pt-lightning-mlflow-tutorial\"\n", - "compute_name = \"gpu-K80-2\"" + "compute_name = \"gpu-V100-2\"" ] }, { diff --git a/v1/python-sdk/setup-workspace.py b/v1/python-sdk/setup-workspace.py index 84027fdb61..3a4446b514 100644 --- a/v1/python-sdk/setup-workspace.py +++ b/v1/python-sdk/setup-workspace.py @@ -30,13 +30,7 @@ "idle_seconds_before_scaledown": 1200, }, "gpu-cluster": { - "vm_size": "STANDARD_NC6", - "min_nodes": 0, - "max_nodes": 4, - "idle_seconds_before_scaledown": 1200, - }, - "gpu-K80-2": { - "vm_size": "STANDARD_NC12", + "vm_size": "STANDARD_NC6s_v3", "min_nodes": 0, "max_nodes": 4, "idle_seconds_before_scaledown": 1200, diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/automl-nlp-text-classification-multiclass.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/automl-nlp-text-classification-multiclass.ipynb index 94ea78792f..6522758688 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/automl-nlp-text-classification-multiclass.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/automl-nlp-text-classification-multiclass.ipynb @@ -171,7 +171,7 @@ " print(\"Found existing cluster, use it.\")\n", "except ComputeTargetException:\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", max_nodes=num_nodes # use GPU Nodes\n", + " vm_size=\"Standard_NC6s_v3\", max_nodes=num_nodes # use GPU Nodes\n", " )\n", " compute_target = ComputeTarget.create(ws, amlcompute_cluster_name, compute_config)\n", "\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/update_env.yml b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/update_env.yml index 79fe2c8733..7e39f8f792 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/update_env.yml +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multiclass/update_env.yml @@ -1,7 +1,5 @@ dependencies: -- pytorch==1.7.1 -- numpy==1.18.5 -- pandas~=1.1.5 +- pytorch==1.12.0 - pip: - - azureml-automl-dnn-nlp==1.39.0 \ No newline at end of file + - azureml-automl-dnn-nlp==1.52.0 \ No newline at end of file diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/automl-nlp-text-classification-multilabel.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/automl-nlp-text-classification-multilabel.ipynb index 54e05b692d..9e9e184b98 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/automl-nlp-text-classification-multilabel.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/automl-nlp-text-classification-multilabel.ipynb @@ -158,7 +158,7 @@ " print(\"Found existing cluster, use it.\")\n", "except ComputeTargetException:\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", max_nodes=num_nodes # Use GPU Nodes\n", + " vm_size=\"Standard_NC6s_v3\", max_nodes=num_nodes # Use GPU Nodes\n", " )\n", " compute_target = ComputeTarget.create(ws, amlcompute_cluster_name, compute_config)\n", "\n", @@ -252,7 +252,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can start the run with the prepared compute resource and datasets. On a `STANDARD_NC6` compute instance with one node, the training would take around 25 minutes, excluding activating nodes in the compute instance. Here, to make training faster, we will use a `STANDARD_NC6` instance with 2 nodes and enable parallel training.\n", + "Now we can start the run with the prepared compute resource and datasets. On a `Standard_NC6s_v3` compute instance with one node, the training would take around 25 minutes, excluding activating nodes in the compute instance. Here, to make training faster, we will use a `Standard_NC6s_v3` instance with 2 nodes and enable parallel training.\n", "\n", "To use distributed training, we need to set `enable_distributed_dnn_training = True` and `max_concurrent_iterations` to be the number of nodes available in you compute instance.\n", "\n", @@ -578,7 +578,7 @@ " y_true.append(label_set[ind] if label else \"\")\n", " y_pred.append(label_set[ind] if predict_positive else \"\")\n", "\n", - " print(classification_report(y_true, y_pred, label_set))" + " print(classification_report(y_true=y_true, y_pred=y_pred, labels=label_set))" ] }, { diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/update_env.yml b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/update_env.yml index 79fe2c8733..7e39f8f792 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/update_env.yml +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-multilabel/update_env.yml @@ -1,7 +1,5 @@ dependencies: -- pytorch==1.7.1 -- numpy==1.18.5 -- pandas~=1.1.5 +- pytorch==1.12.0 - pip: - - azureml-automl-dnn-nlp==1.39.0 \ No newline at end of file + - azureml-automl-dnn-nlp==1.52.0 \ No newline at end of file diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-ner/automl-nlp-ner.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-ner/automl-nlp-ner.ipynb index 16b4040ea0..77fc0b37f6 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-ner/automl-nlp-ner.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl-nlp-ner/automl-nlp-ner.ipynb @@ -155,7 +155,7 @@ " print(\"Found existing cluster, use it.\")\n", "except ComputeTargetException:\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", max_nodes=num_nodes # Use GPU only\n", + " vm_size=\"Standard_NC6s_v3\", max_nodes=num_nodes # Use GPU only\n", " )\n", " compute_target = ComputeTarget.create(ws, amlcompute_cluster_name, compute_config)\n", "\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl_env.yml b/v1/python-sdk/tutorials/automl-with-azureml/automl_env.yml index 758214b6e6..8f8d650819 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl_env.yml +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl_env.yml @@ -7,17 +7,20 @@ dependencies: # The python interpreter version. # Azure ML only supports 3.7.0 and later. - pip==22.3.1 -- python>=3.7,<3.9 +- python>=3.8,<3.9 +- holidays==0.10.3 - conda-forge::fbprophet==0.7.1 - pandas==1.1.5 - scipy==1.5.3 +- Cython==0.29.14 +- tqdm==4.65.0 - pip: # Required packages for AzureML execution, history, and data preparation. - - azureml-widgets~=1.49.0 - - azureml-defaults~=1.49.0 - - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.49.0/validated_win32_requirements.txt [--no-deps] - - matplotlib==3.6.2 + - azureml-widgets~=1.52.0 + - azureml-defaults~=1.52.0 + - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.52.0/validated_win32_requirements.txt [--no-deps] + - matplotlib==3.7.1 - xgboost==1.3.3 - cmdstanpy==0.9.5 - setuptools-git==1.2 diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl_env_linux.yml b/v1/python-sdk/tutorials/automl-with-azureml/automl_env_linux.yml index e7e16c98b5..16f3f801e4 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl_env_linux.yml +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl_env_linux.yml @@ -1,24 +1,32 @@ name: azure_automl channels: - conda-forge + - pytorch - main dependencies: # The python interpreter version. # Azure ML only supports 3.7 and later. -- pip==23.0.1 -- python>=3.7,<3.9 +- pip==22.3.1 +- python>=3.8,<3.9 +- matplotlib==3.7.1 +- numpy>=1.21.6,<=1.22.3 +- cython==0.29.14 +- urllib3==1.26.7 +- scipy>=1.4.1,<=1.5.3 +- scikit-learn==0.22.1 +- py-xgboost<=1.3.3 +- holidays==0.10.3 - conda-forge::fbprophet==0.7.1 -- pandas==1.1.5 -- conda-forge::numpy==1.22.3 -- scipy==1.5.3 +- pytorch::pytorch=1.11.0 +- cudatoolkit=10.1.243 +- notebook - pip: # Required packages for AzureML execution, history, and data preparation. - - azureml-widgets~=1.49.0 - - azureml-defaults~=1.49.0 + - azureml-widgets~=1.52.0 + - azureml-defaults~=1.52.0 + - pytorch-transformers==1.0.0 + - spacy==2.2.4 + - pystan==2.19.1.1 - https://aka.ms/automl-resources/packages/en_core_web_sm-2.1.0.tar.gz - - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.49.0/validated_linux_requirements.txt [--no-deps] - - matplotlib==3.6.2 - - xgboost==1.3.3 - - cmdstanpy==0.9.5 - - setuptools-git==1.2 \ No newline at end of file + - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.52.0/validated_linux_requirements.txt [--no-deps] diff --git a/v1/python-sdk/tutorials/automl-with-azureml/automl_env_mac.yml b/v1/python-sdk/tutorials/automl-with-azureml/automl_env_mac.yml index df5e46b314..1d370c2eaa 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/automl_env_mac.yml +++ b/v1/python-sdk/tutorials/automl-with-azureml/automl_env_mac.yml @@ -7,26 +7,22 @@ dependencies: # The python interpreter version. # Currently Azure ML only supports 3.7 and later. - pip==22.3.1 -- python>=3.7,<3.9 -- matplotlib==3.2.1 +- python>=3.8,<3.9 - numpy>=1.21.6,<=1.22.3 - cython==0.29.14 -- urllib3==1.26.7 - scipy>=1.4.1,<=1.5.3 - scikit-learn==0.22.1 -- py-xgboost<=1.3.3 - holidays==0.10.3 -- conda-forge::fbprophet==0.7.1 -- pytorch::pytorch=1.11.0 -- cudatoolkit=9.0 -- notebook - pip: # Required packages for AzureML execution, history, and data preparation. - - azureml-widgets~=1.49.0 - - azureml-defaults~=1.49.0 + - azureml-widgets~=1.52.0 + - azureml-defaults~=1.52.0 - pytorch-transformers==1.0.0 - spacy==2.2.4 - pystan==2.19.1.1 + - fbprophet==0.7.1 + - xgboost==1.3.3 + - matplotlib==3.7.1 - https://aka.ms/automl-resources/packages/en_core_web_sm-2.1.0.tar.gz - - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.49.0/validated_darwin_requirements.txt [--no-deps] + - -r https://automlsdkdataresources.blob.core.windows.net/validated-requirements/1.52.0/validated_darwin_requirements.txt [--no-deps] diff --git a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/auto-ml-classification-text-dnn.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/auto-ml-classification-text-dnn.ipynb index c71749e957..560f041165 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/auto-ml-classification-text-dnn.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/auto-ml-classification-text-dnn.ipynb @@ -139,8 +139,8 @@ " print(\"Found existing cluster, use it.\")\n", "except ComputeTargetException:\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", # CPU for BiLSTM, such as \"STANDARD_D2_V2\"\n", - " # To use BERT (this is recommended for best performance), select a GPU such as \"STANDARD_NC6\"\n", + " vm_size=\"Standard_NC6s_v3\", # CPU for BiLSTM, such as \"STANDARD_D2_V2\"\n", + " # To use BERT (this is recommended for best performance), select a GPU such as \"Standard_NC6s_v3\"\n", " # or similar GPU option\n", " # available in your workspace\n", " idle_seconds_before_scaledown=60,\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/helper.py b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/helper.py index 499d75e341..8811633629 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/helper.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/helper.py @@ -1,3 +1,4 @@ +import json import pandas as pd from azureml.core import Environment, ScriptRunConfig from azureml.core.run import Run @@ -13,7 +14,16 @@ def run_inference( model_name, ): - inference_env = train_run.get_environment() + try: + inference_env = train_run.get_environment() + except BaseException: + run_details = train_run.get_details() + run_def = run_details.get("runDefinition") + env = run_def.get("environment") + if env is None: + raise + json.dump(env, open("azureml_environment.json", "w")) + inference_env = Environment.load_from_directory(".") est = ScriptRunConfig( source_directory=script_folder, diff --git a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/infer.py b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/infer.py index 4d926d0b26..98525f88d8 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/infer.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/classification-text-dnn/infer.py @@ -3,7 +3,7 @@ import pandas as pd import numpy as np -from sklearn.externals import joblib +import joblib from azureml.automl.runtime.shared.score import scoring, constants from azureml.core import Run, Dataset diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/auto-ml-forecasting-bike-share.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/auto-ml-forecasting-bike-share.ipynb index b4d25b0076..a7f4eb319b 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/auto-ml-forecasting-bike-share.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/auto-ml-forecasting-bike-share.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -11,7 +10,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -19,7 +17,13 @@ ] }, { - "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-bike-share)).
" + ] + }, + { "cell_type": "markdown", "metadata": {}, "source": [ @@ -37,7 +41,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -56,7 +59,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -86,7 +88,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -103,7 +104,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -137,7 +137,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -177,7 +176,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -201,7 +199,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "nteract": { @@ -218,6 +215,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false, "source_hidden": false @@ -237,7 +235,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "nteract": { @@ -256,6 +253,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "gather": { "logged": 1680247376789 }, @@ -277,7 +275,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -290,6 +287,7 @@ "cell_type": "code", "execution_count": null, "metadata": { + "collapsed": false, "jupyter": { "outputs_hidden": false, "source_hidden": false @@ -316,7 +314,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -334,7 +331,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -359,7 +355,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -378,7 +373,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -398,7 +392,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -441,7 +434,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -467,7 +459,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -486,7 +477,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -512,7 +502,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -556,7 +545,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -564,7 +552,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -583,7 +570,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -606,7 +592,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -637,7 +622,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -656,7 +640,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -673,7 +656,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -705,7 +687,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -715,7 +696,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -747,7 +727,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -822,7 +801,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.9" + "version": "3.8.10" }, "microsoft": { "ms_spell_check": { diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/forecasting_script.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/forecasting_script.py index 6988dd2689..6f0b1194ae 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/forecasting_script.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-bike-share/forecasting_script.py @@ -1,6 +1,6 @@ import argparse from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib parser = argparse.ArgumentParser() parser.add_argument( diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-many-models/scripts/inference_script_naive.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-many-models/scripts/inference_script_naive.py index 7297955e36..8b337a61b8 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-many-models/scripts/inference_script_naive.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-many-models/scripts/inference_script_naive.py @@ -7,7 +7,7 @@ import os import argparse from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset try: diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_naive.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_naive.py index fb30a77195..59eced0ea3 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_naive.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_naive.py @@ -7,7 +7,7 @@ import os import argparse from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset try: diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_tcn.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_tcn.py index 42d8a6c21d..8c0616845a 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_tcn.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-demand-forecasting-tcn/scripts/inference_script_tcn.py @@ -12,7 +12,7 @@ import pandas as pd from pandas.tseries.frequencies import to_offset -from sklearn.externals import joblib +import joblib from sklearn.metrics import mean_absolute_error, mean_squared_error from azureml.data.dataset_factory import TabularDatasetFactory diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/auto-ml-forecasting-energy-demand.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/auto-ml-forecasting-energy-demand.ipynb index 4f097661fa..03b4408679 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/auto-ml-forecasting-energy-demand.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/auto-ml-forecasting-energy-demand.ipynb @@ -2,22 +2,30 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "Copyright (c) Microsoft Corporation. All rights reserved.\n", "\n", "Licensed under the MIT License." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-energy-demand/auto-ml-forecasting-energy-demand.png)" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/blob/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-task-energy-demand/automl-forecasting-task-energy-demand-advanced-mlflow.ipynb)).
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ "# Automated Machine Learning\n", "_**Forecasting using the Energy Demand Dataset**_\n", @@ -32,11 +40,11 @@ "Advanced Forecasting\n", "1. [Advanced Training](#advanced_training)\n", "1. [Advanced Results](#advanced_results)" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Introduction
\n", "\n", @@ -52,18 +60,20 @@ "1. Generate the forecast and compute the out-of-sample accuracy metrics\n", "1. Configuration and remote run of AutoML for a time-series model with lag and rolling window features\n", "1. Run and explore the forecast with lagging features" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Setup" - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "import json\n", "import logging\n", @@ -82,36 +92,36 @@ "from azureml.core import Experiment, Workspace, Dataset\n", "from azureml.train.automl import AutoMLConfig\n", "from datetime import datetime" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "This notebook is compatible with Azure ML SDK version 1.35.0 or later." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "print(\"You are currently using version\", azureml.core.VERSION, \"of the Azure ML SDK\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "As part of the setup you have already created an Azure ML `Workspace` object. For Automated ML you will need to create an `Experiment` object, which is a named object in a `Workspace` used to run experiments." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "ws = Workspace.from_config()\n", "\n", @@ -133,13 +143,11 @@ "pd.set_option(\"display.max_colwidth\", None)\n", "outputDf = pd.DataFrame(data=output, index=[\"\"])\n", "outputDf.T" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Create or Attach existing AmlCompute\n", "A compute target is required to execute a remote Automated ML run. \n", @@ -149,11 +157,13 @@ "#### Creation of AmlCompute takes approximately 5 minutes. \n", "If the AmlCompute with that name is already in your workspace this code will skip the creation process.\n", "As with other Azure services, there are limits on certain resources (e.g. AmlCompute) associated with the Azure Machine Learning service. Please read [this article](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-manage-quotas) on the default limits and how to request more quota." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from azureml.core.compute import ComputeTarget, AmlCompute\n", "from azureml.core.compute_target import ComputeTargetException\n", @@ -172,24 +182,22 @@ " compute_target = ComputeTarget.create(ws, amlcompute_cluster_name, compute_config)\n", "\n", "compute_target.wait_for_completion(show_output=True)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Data\n", "\n", "We will use energy consumption [data from New York City](http://mis.nyiso.com/public/P-58Blist.htm) for model training. The data is stored in a tabular format and includes energy demand and basic weather data at an hourly frequency. \n", "\n", "With Azure Machine Learning datasets you can keep a single copy of data in your storage, easily access data during model training, share data and collaborate with other users. Below, we will upload the datatset and create a [tabular dataset](https://docs.microsoft.com/bs-latn-ba/azure/machine-learning/service/how-to-create-register-datasets#dataset-types) to be used training and prediction." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Let's set up what we know about the dataset.\n", "\n", @@ -197,64 +205,66 @@ "Time column is the time axis along which to predict.\n", "\n", "The other columns, \"temp\" and \"precip\", are implicitly designated as features." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "target_column_name = \"demand\"\n", "time_column_name = \"timeStamp\"" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "dataset = Dataset.Tabular.from_delimited_files(\n", " path=\"https://automlsamplenotebookdata.blob.core.windows.net/automl-sample-notebook-data/nyc_energy.csv\"\n", ").with_timestamp_columns(fine_grain_timestamp=time_column_name)\n", "dataset.take(5).to_pandas_dataframe().reset_index(drop=True)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The NYC Energy dataset is missing energy demand values for all datetimes later than August 10th, 2017 5AM. Below, we trim the rows containing these missing values from the end of the dataset." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Cut off the end of the dataset due to large number of nan values\n", "dataset = dataset.time_before(datetime(2017, 10, 10, 5))" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Split the data into train and test sets" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The first split we make is into train and test sets. Note that we are splitting on time. Data before and including August 8th, 2017 5AM will be used for training, and data after will be used for testing." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# split into train based on time\n", "train = (\n", @@ -263,13 +273,13 @@ " .reset_index(drop=True)\n", ")\n", "train.sort_values(time_column_name).tail(5)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# split into test based on time\n", "test = (\n", @@ -278,13 +288,23 @@ " .reset_index(drop=True)\n", ")\n", "test.head(5)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "jupyter": { + "outputs_hidden": false + }, + "nteract": { + "transient": { + "deleting": false + } + } + }, + "outputs": [], "source": [ "# register the splitted train and test data in workspace storage\n", "from azureml.data.dataset_factory import TabularDatasetFactory\n", @@ -296,23 +316,11 @@ "test_dataset = TabularDatasetFactory.register_pandas_dataframe(\n", " test, target=(datastore, \"dataset/\"), name=\"nyc_energy_test\"\n", ")" - ], - "outputs": [], - "execution_count": null, - "metadata": { - "jupyter": { - "source_hidden": false, - "outputs_hidden": false - }, - "nteract": { - "transient": { - "deleting": false - } - } - } + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Setting the maximum forecast horizon\n", "\n", @@ -321,20 +329,20 @@ "Learn more about forecast horizons in our [Auto-train a time-series forecast model](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-auto-train-forecast#configure-and-run-experiment) guide.\n", "\n", "In this example, we set the horizon to 48 hours." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "forecast_horizon = 48" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Forecasting Parameters\n", "To define forecasting parameters for your experiment training, you can leverage the ForecastingParameters class. The table below details the forecasting parameter we will be passing into our experiment.\n", @@ -345,11 +353,11 @@ "|**forecast_horizon**|The forecast horizon is how many periods forward you would like to forecast. This integer horizon is in units of the timeseries frequency (e.g. daily, weekly).|\n", "|**freq**|Forecast frequency. This optional parameter represents the period with which the forecast is desired, for example, daily, weekly, yearly, etc. Use this parameter for the correction of time series containing irregular data points or for padding of short time series. The frequency needs to be a pandas offset alias. Please refer to [pandas documentation](https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#dateoffset-objects) for more information.\n", "|**cv_step_size**|Number of periods between two consecutive cross-validation folds. The default value is \"auto\", in which case AutoMl determines the cross-validation step size automatically, if a validation set is not provided. Or users could specify an integer value." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Train\n", "\n", @@ -367,18 +375,20 @@ "|**n_cross_validations**|Number of cross-validation folds to use for model/pipeline selection. The default value is \"auto\", in which case AutoMl determines the number of cross-validations automatically, if a validation set is not provided. Or users could specify an integer value.\n", "|**enable_early_stopping**|Flag to enble early termination if the score is not improving in the short term.|\n", "|**forecasting_parameters**|A class holds all the forecasting related parameters.|\n" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "This notebook uses the blocked_models parameter to exclude some models that take a longer time to train on this dataset. You can choose to remove models from the blocked_models list but you may need to increase the experiment_timeout_hours parameter value to get results." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from azureml.automl.core.forecasting_parameters import ForecastingParameters\n", "\n", @@ -402,65 +412,65 @@ " verbosity=logging.INFO,\n", " forecasting_parameters=forecasting_parameters,\n", ")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Call the `submit` method on the experiment object and pass the run configuration. Depending on the data and the number of iterations this can run for a while.\n", "One may specify `show_output = True` to print currently running iterations to the console." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "remote_run = experiment.submit(automl_config, show_output=False)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "remote_run.wait_for_completion()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Retrieve the Best Run details\n", "Below we retrieve the best Run object from among all the runs in the experiment." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "best_run = remote_run.get_best_child()\n", "best_run" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Featurization\n", "We can look at the engineered feature names generated in time-series featurization via. the JSON file named 'engineered_feature_names.json' under the run outputs." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Download the JSON file locally\n", "best_run.download_file(\n", @@ -470,13 +480,11 @@ " records = json.load(f)\n", "\n", "records" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### View featurization summary\n", "You can also see what featurization steps were performed on different raw features in the user data. For each raw feature in the user data, the following information is displayed:\n", @@ -486,11 +494,13 @@ "+ Type detected\n", "+ If feature was dropped\n", "+ List of feature transformations for the raw feature" - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# Download the featurization summary JSON file locally\n", "best_run.download_file(\n", @@ -512,41 +522,41 @@ " \"Transformations\",\n", " ]\n", "]" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Forecasting\n", "\n", "Now that we have retrieved the best pipeline/model, it can be used to make predictions on test data. We will do batch scoring on the test dataset which should have the same schema as training dataset.\n", "\n", "The inference will run on a remote compute. In this example, it will re-use the training compute." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "test_experiment = Experiment(ws, experiment_name + \"_inference\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Retrieving forecasts from the model\n", "We have created a function called `run_forecast` that submits the test data to the best model determined during the training run and retrieves forecasts. This function uses a helper script `forecasting_script` which is uploaded and expecuted on the remote compute." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from run_forecast import run_remote_inference\n", "\n", @@ -561,32 +571,32 @@ "\n", "# download the inference output file to the local machine\n", "remote_run_infer.download_file(\"outputs/predictions.csv\", \"predictions.csv\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Evaluate\n", "To evaluate the accuracy of the forecast, we'll compare against the actual sales quantities for some select metrics, included the mean absolute percentage error (MAPE). For more metrics that can be used for evaluation after training, please see [supported metrics](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-understand-automated-ml#regressionforecasting-metrics), and [how to calculate residuals](https://docs.microsoft.com/en-us/azure/machine-learning/how-to-understand-automated-ml#residuals)." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# load forecast data frame\n", "fcst_df = pd.read_csv(\"predictions.csv\", parse_dates=[time_column_name])\n", "fcst_df.head()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from azureml.automl.core.shared import constants\n", "from azureml.automl.runtime.shared.score import scoring\n", @@ -613,31 +623,31 @@ " (test_pred, test_test), (\"prediction\", \"truth\"), loc=\"upper left\", fontsize=8\n", ")\n", "plt.show()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Advanced Training \n", "We did not use lags in the previous model specification. In effect, the prediction was the result of a simple regression on date, time series identifier columns and any additional features. This is often a very good prediction as common time series patterns like seasonality and trends can be captured in this manner. Such simple regression is horizon-less: it doesn't matter how far into the future we are predicting, because we are not using past data. In the previous example, the horizon was only used to split the data for cross-validation." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Using lags and rolling window features\n", "Now we will configure the target lags, that is the previous values of the target variables, meaning the prediction is no longer horizon-less. We therefore must still specify the `forecast_horizon` that the model will learn to forecast. The `target_lags` keyword specifies how far back we will construct the lags of the target variable, and the `target_rolling_window_size` specifies the size of the rolling window over which we will generate the `max`, `min` and `sum` features.\n", "\n", "This notebook uses the blocked_models parameter to exclude some models that take a longer time to train on this dataset. You can choose to remove models from the blocked_models list but you may need to increase the iteration_timeout_minutes parameter value to get results." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "advanced_forecasting_parameters = ForecastingParameters(\n", " time_column_name=time_column_name,\n", @@ -668,63 +678,63 @@ " verbosity=logging.INFO,\n", " forecasting_parameters=advanced_forecasting_parameters,\n", ")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We now start a new remote run, this time with lag and rolling window featurization. AutoML applies featurizations in the setup stage, prior to iterating over ML models. The full training set is featurized first, followed by featurization of each of the CV splits. Lag and rolling window features introduce additional complexity, so the run will take longer than in the previous example that lacked these featurizations." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "advanced_remote_run = experiment.submit(automl_config, show_output=False)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "advanced_remote_run.wait_for_completion()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Retrieve the Best Run details" - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "best_run_lags = remote_run.get_best_child()\n", "best_run_lags" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Advanced Results\n", "We did not use lags in the previous model specification. In effect, the prediction was the result of a simple regression on date, time series identifier columns and any additional features. This is often a very good prediction as common time series patterns like seasonality and trends can be captured in this manner. Such simple regression is horizon-less: it doesn't matter how far into the future we are predicting, because we are not using past data. In the previous example, the horizon was only used to split the data for cross-validation." - ], - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "test_experiment_advanced = Experiment(ws, experiment_name + \"_inference_advanced\")\n", "advanced_remote_run_infer = run_remote_inference(\n", @@ -741,23 +751,23 @@ "advanced_remote_run_infer.download_file(\n", " \"outputs/predictions.csv\", \"predictions_advanced.csv\"\n", ")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "fcst_adv_df = pd.read_csv(\"predictions_advanced.csv\", parse_dates=[time_column_name])\n", "fcst_adv_df.head()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "from azureml.automl.core.shared import constants\n", "from azureml.automl.runtime.shared.score import scoring\n", @@ -786,10 +796,7 @@ " (test_pred, test_test), (\"prediction\", \"truth\"), loc=\"upper left\", fontsize=8\n", ")\n", "plt.show()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} + ] } ], "metadata": { @@ -802,40 +809,40 @@ "how-to-use-azureml", "automated-machine-learning" ], + "kernel_info": { + "name": "python3" + }, "kernelspec": { - "name": "python3", + "display_name": "Python 3.8 - AzureML", "language": "python", - "display_name": "Python 3 (ipykernel)" + "name": "python38-azureml" }, "language_info": { - "name": "python", - "version": "3.8.5", - "mimetype": "text/x-python", "codemirror_mode": { "name": "ipython", "version": 3 }, - "pygments_lexer": "ipython3", + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", "nbconvert_exporter": "python", - "file_extension": ".py" - }, - "vscode": { - "interpreter": { - "hash": "6bd77c88278e012ef31757c15997a7bea8c943977c43d6909403c00ae11d43ca" - } + "pygments_lexer": "ipython3", + "version": "3.8.10" }, "microsoft": { "ms_spell_check": { "ms_spell_check_language": "en" } }, - "kernel_info": { - "name": "python3" - }, "nteract": { "version": "nteract-front-end@1.0.0" + }, + "vscode": { + "interpreter": { + "hash": "6bd77c88278e012ef31757c15997a7bea8c943977c43d6909403c00ae11d43ca" + } } }, "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + "nbformat_minor": 4 +} diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/forecasting_script.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/forecasting_script.py index 40724de54c..01c831b4c5 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/forecasting_script.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-energy-demand/forecasting_script.py @@ -6,7 +6,7 @@ import argparse from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset parser = argparse.ArgumentParser() diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb index 5d858f0729..7bc17c7f5e 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/auto-ml-forecasting-github-dau.ipynb @@ -22,6 +22,13 @@ "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-beer-remote/auto-ml-forecasting-beer-remote.png)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-github-dau)).
" + ] + }, { "cell_type": "markdown", "metadata": { @@ -695,7 +702,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/infer.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/infer.py index d351380d21..70505ba185 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/infer.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-github-dau/infer.py @@ -4,7 +4,7 @@ import numpy as np import pandas as pd -from sklearn.externals import joblib +import joblib from sklearn.metrics import mean_absolute_error, mean_squared_error from azureml.automl.runtime.shared.score import scoring, constants diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.ipynb index 1e65c10331..6bace379bf 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.ipynb @@ -16,6 +16,13 @@ "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.png)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-hierarchical-timeseries-in-pipeline)).
" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -666,7 +673,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.8" + "version": "3.8.10" } }, "nbformat": 4, diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-many-models/auto-ml-forecasting-many-models.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-many-models/auto-ml-forecasting-many-models.ipynb index ef122603a7..aab5043cb9 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-many-models/auto-ml-forecasting-many-models.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-many-models/auto-ml-forecasting-many-models.ipynb @@ -16,6 +16,13 @@ "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-hierarchical-timeseries/auto-ml-forecasting-hierarchical-timeseries.png)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/pipelines/1k_demand_forecasting_with_pipeline_components/automl-forecasting-demand-many-models-in-pipeline)).
" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -306,7 +313,7 @@ "from azureml.core.compute import ComputeTarget, AmlCompute\n", "\n", "# Name your cluster\n", - "compute_name = \"mm-compute\"\n", + "compute_name = \"mm-compute-v1\"\n", "\n", "\n", "if compute_name in ws.compute_targets:\n", @@ -316,7 +323,7 @@ "else:\n", " print(\"Creating a new compute target...\")\n", " provisioning_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_D16S_V3\", max_nodes=20\n", + " vm_size=\"STANDARD_D14_V2\", max_nodes=20\n", " )\n", " # Create the compute target\n", " compute_target = ComputeTarget.create(ws, compute_name, provisioning_config)\n", @@ -864,9 +871,9 @@ "automated-machine-learning" ], "kernelspec": { - "display_name": "Python 3.8.5 ('base')", + "display_name": "Python 3.8 - AzureML", "language": "python", - "name": "python3" + "name": "python38-azureml" }, "language_info": { "codemirror_mode": { @@ -878,7 +885,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.10" }, "vscode": { "interpreter": { diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/auto-ml-forecasting-orange-juice-sales.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/auto-ml-forecasting-orange-juice-sales.ipynb index d770e2434c..0b1a7242cf 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/auto-ml-forecasting-orange-juice-sales.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/auto-ml-forecasting-orange-juice-sales.ipynb @@ -1,7 +1,6 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -11,7 +10,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -19,7 +17,13 @@ ] }, { - "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-orange-juice-sales)).
" + ] + }, + { "cell_type": "markdown", "metadata": {}, "source": [ @@ -37,7 +41,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -50,7 +53,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -75,7 +77,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -92,7 +93,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -126,7 +126,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -166,7 +165,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -190,7 +188,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -211,7 +208,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -231,7 +227,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -264,7 +259,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -290,7 +284,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -307,7 +300,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -335,7 +327,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -374,7 +365,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -392,7 +382,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -466,7 +455,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -493,7 +481,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -513,7 +500,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -551,7 +537,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -572,7 +557,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -581,7 +565,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -610,7 +593,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -666,7 +648,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -674,7 +655,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -697,7 +677,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -717,7 +696,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -763,7 +741,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -812,7 +789,6 @@ ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ @@ -854,9 +830,9 @@ "friendly_name": "Forecasting orange juice sales with deployment", "index_order": 1, "kernelspec": { - "display_name": "Python 3.8.5 ('base')", + "display_name": "Python 3.8 - AzureML", "language": "python", - "name": "python3" + "name": "python38-azureml" }, "language_info": { "codemirror_mode": { @@ -868,7 +844,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.5" + "version": "3.8.10" }, "tags": [ "None" diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/forecasting_script.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/forecasting_script.py index 40724de54c..01c831b4c5 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/forecasting_script.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-orange-juice-sales/forecasting_script.py @@ -6,7 +6,7 @@ import argparse from azureml.core import Dataset, Run -from sklearn.externals import joblib +import joblib from pandas.tseries.frequencies import to_offset parser = argparse.ArgumentParser() diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/auto-ml-forecasting-pipelines.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/auto-ml-forecasting-pipelines.ipynb index 033b9e3fd6..90ff8bc552 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/auto-ml-forecasting-pipelines.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/auto-ml-forecasting-pipelines.ipynb @@ -1,5 +1,21 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/pipelines/1h_automl_in_pipeline/automl-forecasting-in-pipeline)).
\n", + "
\n", + "
\n", + "\n", + "For examples illustrating how to build pipelines with components, please use the following links:\n", + "" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -555,40 +571,15 @@ "metadata": {}, "outputs": [], "source": [ - "from azureml.core import Model\n", + "from azureml.train.automl.run import AutoMLRun\n", "\n", - "model = Model(ws, model_name_str)\n", - "download_path = model.download(model_name_str, exist_ok=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "After all the files are downloaded, we can generate the run config for inference runs." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from azureml.core import Environment, RunConfiguration\n", - "from azureml.core.conda_dependencies import CondaDependencies\n", + "for step in training_pipeline_run.get_steps():\n", + " if step.properties.get(\"StepType\") == \"AutoMLStep\":\n", + " automl_run = AutoMLRun(experiment, step.id)\n", + " break\n", "\n", - "env_file = os.path.join(download_path, \"conda_env_v_1_0_0.yml\")\n", - "inference_env = Environment(\"oj-inference-env\")\n", - "inference_env.python.conda_dependencies = CondaDependencies(\n", - " conda_dependencies_file_path=env_file\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "[Optional] The enviroment can also be assessed from the training run using `get_environment()` API." + "best_run = automl_run.get_best_child()\n", + "inference_env = best_run.get_environment()" ] }, { @@ -799,7 +790,7 @@ "friendly_name": "Forecasting orange juice sales with deployment", "index_order": 1, "kernelspec": { - "display_name": "Python 3.8.5 ('base')", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/scripts/infer.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/scripts/infer.py index a900d32ffa..7ba979ce6f 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/scripts/infer.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-pipelines/scripts/infer.py @@ -6,7 +6,7 @@ import pandas as pd from pandas.tseries.frequencies import to_offset -from sklearn.externals import joblib +import joblib from sklearn.metrics import mean_absolute_error, mean_squared_error from azureml.data.dataset_factory import TabularDatasetFactory diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-experiment-settings.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-experiment-settings.ipynb index ca9e4b900f..edc21b8590 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-experiment-settings.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-experiment-settings.ipynb @@ -1,505 +1,512 @@ { - "cells": [ - { - "cell_type": "markdown", - "source": [ - "Copyright (c) Microsoft Corporation. All rights reserved.\n", - "\n", - "Licensed under the MIT License." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-recipes-univariate/1_determine_experiment_settings.png)" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "In this notebook we will explore the univariate time-series data to determine the settings for an automated ML experiment. We will follow the thought process depicted in the following diagram:
\n", - "![Forecasting after training](figures/univariate_settings_map_20210408.jpg)\n", - "\n", - "The objective is to answer the following questions:\n", - "\n", - "
    \n", - "
  1. Is there a seasonal pattern in the data?
  2. \n", - "
      \n", - "
    • Importance: If we are able to detect regular seasonal patterns, the forecast accuracy may be improved by extracting these patterns and including them as features into the model.
    • \n", - "
    \n", - "
  3. Is the data stationary?
  4. \n", - "
      \n", - "
    • Importance: In the absence of features that capture trend behavior, ML models (regression and tree based) are not well equipped to predict stochastic trends. Working with stationary data solves this problem.
    • \n", - "
    \n", - "
  5. Is there a detectable auto-regressive pattern in the stationary data?
  6. \n", - "
      \n", - "
    • Importance: The accuracy of ML models can be improved if serial correlation is modeled by including lags of the dependent/target variable as features. Including target lags in every experiment by default will result in a regression in accuracy scores if such setting is not warranted.
    • \n", - "
    \n", - "
\n", - "\n", - "The answers to these questions will help determine the appropriate settings for the automated ML experiment.\n" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "import os\n", - "import warnings\n", - "import pandas as pd\n", - "\n", - "from statsmodels.graphics.tsaplots import plot_acf, plot_pacf\n", - "import matplotlib.pyplot as plt\n", - "from pandas.plotting import register_matplotlib_converters\n", - "\n", - "register_matplotlib_converters() # fixes the future warning issue\n", - "\n", - "from helper_functions import unit_root_test_wrapper\n", - "from statsmodels.tools.sm_exceptions import InterpolationWarning\n", - "\n", - "warnings.simplefilter(\"ignore\", InterpolationWarning)\n", - "\n", - "\n", - "# set printing options\n", - "pd.set_option(\"display.max_columns\", 500)\n", - "pd.set_option(\"display.width\", 1000)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# load data\n", - "main_data_loc = \"data\"\n", - "train_file_name = \"S4248SM144SCEN.csv\"\n", - "\n", - "TARGET_COLNAME = \"S4248SM144SCEN\"\n", - "TIME_COLNAME = \"observation_date\"\n", - "COVID_PERIOD_START = \"2020-03-01\"\n", - "\n", - "df = pd.read_csv(os.path.join(main_data_loc, train_file_name))\n", - "df[TIME_COLNAME] = pd.to_datetime(df[TIME_COLNAME], format=\"%Y-%m-%d\")\n", - "df.sort_values(by=TIME_COLNAME, inplace=True)\n", - "df.set_index(TIME_COLNAME, inplace=True)\n", - "df.head(2)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# plot the entire dataset\n", - "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", - "ax.plot(df)\n", - "ax.title.set_text(\"Original Data Series\")\n", - "locs, labels = plt.xticks()\n", - "plt.xticks(rotation=45)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "The graph plots the alcohol sales in the United States. Because the data is trending, it can be difficult to see cycles, seasonality or other interesting behaviors due to the scaling issues. For example, if there is a seasonal pattern, which we will discuss later, we cannot see them on the trending data. In such case, it is worth plotting the same data in first differences." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# plot the entire dataset in first differences\n", - "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", - "ax.plot(df.diff().dropna())\n", - "ax.title.set_text(\"Data in first differences\")\n", - "locs, labels = plt.xticks()\n", - "plt.xticks(rotation=45)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "In the previous plot we observe that the data is more volatile towards the end of the series. This period coincides with the Covid-19 period, so we will exclude it from our experiment. Since in this example there are no user-provided features it is hard to make an argument that a model trained on the less volatile pre-covid data will be able to accurately predict the covid period." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "# 1. Seasonality\n", - "\n", - "#### Questions that need to be answered in this section:\n", - "1. Is there a seasonality?\n", - "2. If it's seasonal, does the data exhibit a trend (up or down)?\n", - "\n", - "It is hard to visually detect seasonality when the data is trending. The reason being is scale of seasonal fluctuations is dwarfed by the range of the trend in the data. One way to deal with this is to de-trend the data by taking the first differences. We will discuss this in more detail in the next section." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# plot the entire dataset in first differences\n", - "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", - "ax.plot(df.diff().dropna())\n", - "ax.title.set_text(\"Data in first differences\")\n", - "locs, labels = plt.xticks()\n", - "plt.xticks(rotation=45)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "For the next plot, we will exclude the Covid period again. We will also shorten the length of data because plotting a very long time series may prevent us from seeing seasonal patterns, if there are any, because the plot may look like a random walk." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# remove COVID period\n", - "df = df[:COVID_PERIOD_START]\n", - "\n", - "# plot the entire dataset in first differences\n", - "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", - "ax.plot(df[\"2015-01-01\":].diff().dropna())\n", - "ax.title.set_text(\"Data in first differences\")\n", - "locs, labels = plt.xticks()\n", - "plt.xticks(rotation=45)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "

Conclusion

\n", - "\n", - "Visual examination does not suggest clear seasonal patterns. We will set the STL_TYPE = None, and we will move to the next section that examines stationarity. \n", - "\n", - "\n", - "Say, we are working with a different data set that shows clear patterns of seasonality, we have several options for setting the settings:is hard to say which option will work best in your case, hence you will need to run both options to see which one results in more accurate forecasts. \n", - "
    \n", - "
  1. If the data does not appear to be trending, set DIFFERENCE_SERIES=False, TARGET_LAGS=None and STL_TYPE = \"season\"
  2. \n", - "
  3. If the data appears to be trending, consider one of the following two settings:\n", - "
      \n", - "
        \n", - "
      1. DIFFERENCE_SERIES=True, TARGET_LAGS=None and STL_TYPE = \"season\", or
      2. \n", - "
      3. DIFFERENCE_SERIES=False, TARGET_LAGS=None and STL_TYPE = \"trend_season\"
      4. \n", - "
      \n", - "
    • In the first case, by taking first differences we are removing stochastic trend, but we do not remove seasonal patterns. In the second case, we do not remove the stochastic trend and it can be captured by the trend component of the STL decomposition. It is hard to say which option will work best in your case, hence you will need to run both options to see which one results in more accurate forecasts.
    • \n", - "
    \n", - "
" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "# 2. Stationarity\n", - "If the data does not exhibit seasonal patterns, we would like to see if the data is non-stationary. Particularly, we want to see if there is a clear trending behavior. If such behavior is observed, we would like to first difference the data and examine the plot of an auto-correlation function (ACF) known as correlogram. If the data is seasonal, differencing it will not get rid off the seasonality and this will be shown on the correlogram as well.\n", - "\n", - "
    \n", - "
  • Question: What is stationarity and how to we detect it?
  • \n", - "
      \n", - "
    • This is a fairly complex topic. Please read the following link for a high level discussion on this subject.
    • \n", - "
    • Simply put, we are looking for scenario when examining the time series plots the mean of the series is roughly the same, regardless which time interval you pick to compute it. Thus, trending and seasonal data are examples of non-stationary series.
    • \n", - "
    \n", - "
\n", - "\n", - "\n", - "
    \n", - "
  • Question: Why do want to work with stationary data?
  • \n", - "
      \n", - "
    • In the absence of features that capture stochastic trends, the ML models that use (deterministic) time based features (hour of the day, day of the week, month of the year, etc) cannot capture such trends, and will over or under predict depending on the behavior of the time series. By working with stationary data, we eliminate the need to predict such trends, which improves the forecast accuracy. Classical time series models such as Arima and Exponential Smoothing handle non-stationary series by design and do not need such transformations. By differencing the data we are still able to run the same family of models.
    • \n", - "
    \n", - "
\n", - "\n", - "#### Questions that need to be answered in this section:\n", - "
    \n", - "
  1. Is the data stationary?
  2. \n", - "
  3. Does the stationarized data (either the original or the differenced series) exhibit a clear auto-regressive pattern?
  4. \n", - "
\n", - "\n", - "To answer the first question, we run a series of tests (we call them unit root tests)." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# unit root tests\n", - "test = unit_root_test_wrapper(df[TARGET_COLNAME])\n", - "print(\"---------------\", \"\\n\")\n", - "print(\"Summary table\", \"\\n\", test[\"summary\"], \"\\n\")\n", - "print(\"Is the {} series stationary?: {}\".format(TARGET_COLNAME, test[\"stationary\"]))\n", - "print(\"---------------\", \"\\n\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "In the previous cell, we ran a series of unit root tests. The summary table contains the following columns:\n", - "
    \n", - "
  • test_name is the name of the test.\n", - "
      \n", - "
    • ADF: Augmented Dickey-Fuller test
    • \n", - "
    • KPSS: Kwiatkowski-Phillips–Schmidt–Shin test
    • \n", - "
    • PP: Phillips-Perron test\n", - "
    • ADF GLS: Augmented Dickey-Fuller using generalized least squares method
    • \n", - "
    • AZ: Andrews-Zivot test
    • \n", - "
    \n", - "
  • statistic: test statistic
  • \n", - "
  • crit_val: critical value of the test statistic
  • \n", - "
  • p_val: p-value of the test statistic. If the p-val is less than 0.05, the null hypothesis is rejected.
  • \n", - "
  • stationary: is the series stationary based on the test result?
  • \n", - "
  • Null hypothesis: what is being tested. Notice, some test such as ADF and PP assume the process has a unit root and looks for evidence to reject this hypothesis. Other tests, ex.g: KPSS, assumes the process is stationary and looks for evidence to reject such claim.\n", - "
\n", - "\n", - "Each of the tests shows that the original time series is non-stationary. The final decision is based on the majority rule. If, there is a split decision, the algorithm will claim it is stationary. We run a series of tests because each test by itself may not be accurate. In many cases when there are conflicting test results, the user needs to make determination if the series is stationary or not.\n", - "\n", - "Since we found the series to be non-stationary, we will difference it and then test if the differenced series is stationary." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# unit root tests\n", - "test = unit_root_test_wrapper(df[TARGET_COLNAME].diff().dropna())\n", - "print(\"---------------\", \"\\n\")\n", - "print(\"Summary table\", \"\\n\", test[\"summary\"], \"\\n\")\n", - "print(\"Is the {} series stationary?: {}\".format(TARGET_COLNAME, test[\"stationary\"]))\n", - "print(\"---------------\", \"\\n\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Four out of five tests show that the series in first differences is stationary. Notice that this decision is not unanimous. Next, let's plot the original series in first-differences to illustrate the difference between non-stationary (unit root) process vs the stationary one." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# plot original and stationary data\n", - "fig = plt.figure(figsize=(10, 10))\n", - "ax1 = fig.add_subplot(211)\n", - "ax1.plot(df[TARGET_COLNAME], \"-b\")\n", - "ax2 = fig.add_subplot(212)\n", - "ax2.plot(df[TARGET_COLNAME].diff().dropna(), \"-b\")\n", - "ax1.title.set_text(\"Original data\")\n", - "ax2.title.set_text(\"Data in first differences\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "If you were asked a question \"What is the mean of the series before and after 2008?\", for the series titled \"Original data\" the mean values will be significantly different. This implies that the first moment of the series (in this case, it is the mean) is time dependent, i.e., mean changes depending on the interval one is looking at. Thus, the series is deemed to be non-stationary. On the other hand, for the series titled \"Data in first differences\" the means for both periods are roughly the same. Hence, the first moment is time invariant; meaning it does not depend on the interval of time one is looking at. In this example it is easy to visually distinguish between stationary and non-stationary data. Often this distinction is not easy to make, therefore we rely on the statistical tests described above to help us make an informed decision. " - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "

Conclusion

\n", - "Since we found the original process to be non-stationary (contains unit root), we will have to model the data in first differences. As a result, we will set the DIFFERENCE_SERIES parameter to True." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "# 3 Check if there is a clear auto-regressive pattern\n", - "We need to determine if we should include lags of the target variable as features in order to improve forecast accuracy. To do this, we will examine the ACF and partial ACF (PACF) plots of the stationary series. In our case, it is a series in first differences.\n", - "\n", - "
    \n", - "
  • Question: What is an Auto-regressive pattern? What are we looking for?
  • \n", - "
      \n", - "
    • We are looking for a classical profiles for an AR(p) process such as an exponential decay of an ACF and a the first $p$ significant lags of the PACF. For a more detailed explanation of ACF and PACF please refer to the appendix at the end of this notebook. For illustration purposes, let's examine the ACF/PACF profiles of the simulated data that follows a second order auto-regressive process, abbreviated as an AR(2).
    • \n", - "
    • \n", - "
      \n", - " The lag order is on the x-axis while the auto- and partial-correlation coefficients are on the y-axis. Vertical lines that are outside the shaded area represent statistically significant lags. Notice, the ACF function decays to zero and the PACF shows 2 significant spikes (we ignore the first spike for lag 0 in both plots since the linear relationship of any series with itself is always 1).
    • \n", - "
    \n", - "
      " - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "
        \n", - "
      • Question: What do I do if I observe an auto-regressive behavior?
      • \n", - "
          \n", - "
        • If such behavior is observed, we might improve the forecast accuracy by enabling the target lags feature in AutoML. There are a few options of doing this
        • \n", - "
            \n", - "
          1. Set the target lags parameter to 'auto', or
          2. \n", - "
          3. Specify the list of lags you want to include. Ex.g: target_lags = [1,2,5]
          4. \n", - "
          \n", - "
        \n", - "
        \n", - "
      • Next, let's examine the ACF and PACF plots of the stationary target variable (depicted below). Here, we do not see a decay in the ACF, instead we see a decay in PACF. It is hard to make an argument the the target variable exhibits auto-regressive behavior.
      • \n", - "
      " - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# Plot the ACF/PACF for the series in differences\n", - "fig, ax = plt.subplots(1, 2, figsize=(10, 5))\n", - "plot_acf(df[TARGET_COLNAME].diff().dropna().values.squeeze(), ax=ax[0])\n", - "plot_pacf(df[TARGET_COLNAME].diff().dropna().values.squeeze(), ax=ax[1])\n", - "plt.show()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "

      Conclusion

      \n", - "Since we do not see a clear indication of an AR(p) process, we will not be using target lags and will set the TARGET_LAGS parameter to None." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "

      AutoML Experiment Settings

      \n", - "Based on the analysis performed, we should try the following settings for the AutoML experiment and use them in the \"2_run_experiment\" notebook.\n", - "
        \n", - "
      • STL_TYPE=None
      • \n", - "
      • DIFFERENCE_SERIES=True
      • \n", - "
      • TARGET_LAGS=None
      • \n", - "
      " - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "# Appendix: ACF, PACF and Lag Selection\n", - "To do this, we will examine the ACF and partial ACF (PACF) plots of the differenced series. \n", - "\n", - "
        \n", - "
      • Question: What is the ACF?
      • \n", - "
          \n", - "
        • To understand the ACF, first let's look at the correlation coefficient $\\rho_{xz}$\n", - " \\begin{equation}\n", - " \\rho_{xz} = \\frac{\\sigma_{xz}}{\\sigma_{x} \\sigma_{zy}}\n", - " \\end{equation}\n", - "
        • \n", - " where $\\sigma_{xzy}$ is the covariance between two random variables $X$ and $Z$; $\\sigma_x$ and $\\sigma_z$ is the variance for $X$ and $Z$, respectively. The correlation coefficient measures the strength of linear relationship between two random variables. This metric can take any value from -1 to 1.
        • \n", - "
          \n", - "
        • The auto-correlation coefficient $\\rho_{Y_{t} Y_{t-k}}$ is the time series equivalent of the correlation coefficient, except instead of measuring linear association between two random variables $X$ and $Z$, it measures the strength of a linear relationship between a random variable $Y_t$ and its lag $Y_{t-k}$ for any positive integer value of $k$.
        • \n", - "
          \n", - "
        • To visualize the ACF for a particular lag, say lag 2, plot the second lag of a series $y_{t-2}$ on the x-axis, and plot the series itself $y_t$ on the y-axis. The autocorrelation coefficient is the slope of the best fitted regression line and can be interpreted as follows. A one unit increase in the lag of a variable one period ago leads to a $\\rho_{Y_{t} Y_{t-2}}$ units change in the variable in the current period. This interpretation can be applied to any lag.
        • \n", - "
          \n", - "
        • In the interpretation posted above we need to be careful not to confuse the word \"leads\" with \"causes\" since these are not the same thing. We do not know the lagged value of the variable causes it to change. After all, there are probably many other features that may explain the movement in $Y_t$. All we are trying to do in this section is to identify situations when the variable contains the strong auto-regressive components that needs to be included in the model to improve forecast accuracy.
        • \n", - "
        \n", - "
      " - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "
        \n", - "
      • Question: What is the PACF?
      • \n", - "
          \n", - "
        • When describing the ACF we essentially running a regression between a particular lag of a series, say, lag 4, and the series itself. What this implies is the regression coefficient for lag 4 captures the impact of everything that happens in lags 1, 2 and 3. In other words, if lag 1 is the most important lag and we exclude it from the regression, naturally, the regression model will assign the importance of the 1st lag to the 4th one. Partial auto-correlation function fixes this problem since it measures the contribution of each lag accounting for the information added by the intermediary lags. If we were to illustrate ACF and PACF for the fourth lag using the regression analogy, the difference is a follows: \n", - " \\begin{align}\n", - " Y_{t} &= a_{0} + a_{4} Y_{t-4} + e_{t} \\\\\n", - " Y_{t} &= b_{0} + b_{1} Y_{t-1} + b_{2} Y_{t-2} + b_{3} Y_{t-3} + b_{4} Y_{t-4} + \\varepsilon_{t} \\\\\n", - " \\end{align}\n", - "
        • \n", - "
          \n", - "
        • \n", - " Here, you can think of $a_4$ and $b_{4}$ as the auto- and partial auto-correlation coefficients for lag 4. Notice, in the second equation we explicitly accounting for the intermediate lags by adding them as regressors.\n", - "
        • \n", - "
        \n", - "
      " - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "
        \n", - "
      • Question: Auto-regressive pattern? What are we looking for?
      • \n", - "
          \n", - "
        • We are looking for a classical profiles for an AR(p) process such as an exponential decay of an ACF and a the first $p$ significant lags of the PACF. Let's examine the ACF/PACF profiles of the same simulated AR(2) shown in Section 3, and check if the ACF/PACF explanation are reflected in these plots.
        • \n", - "
        • \n", - "
        • The autocorrelation coefficient for the 3rd lag is 0.6, which can be interpreted that a one unit increase in the value of the target variable three periods ago leads to 0.6 units increase in the current period. However, the PACF plot shows that the partial autocorrelation coefficient is zero (from a statistical point of view since it lies within the shaded region). This is happening because the 1st and 2nd lags are good predictors of the target variable. Omitting these two lags from the regression results in the misleading conclusion that the third lag is a good prediction.
        • \n", - "
          \n", - "
        • This is why it is important to examine both the ACF and the PACF plots when trying to determine the auto regressive order for the variable in question.
        • \n", - "
        \n", - "
      " - ], - "metadata": {} - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-recipes-univariate/1_determine_experiment_settings.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
      This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate)).
      " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In this notebook we will explore the univariate time-series data to determine the settings for an automated ML experiment. We will follow the thought process depicted in the following diagram:
      \n", + "![Forecasting after training](figures/univariate_settings_map_20210408.jpg)\n", + "\n", + "The objective is to answer the following questions:\n", + "\n", + "
        \n", + "
      1. Is there a seasonal pattern in the data?
      2. \n", + "
          \n", + "
        • Importance: If we are able to detect regular seasonal patterns, the forecast accuracy may be improved by extracting these patterns and including them as features into the model.
        • \n", + "
        \n", + "
      3. Is the data stationary?
      4. \n", + "
          \n", + "
        • Importance: In the absence of features that capture trend behavior, ML models (regression and tree based) are not well equipped to predict stochastic trends. Working with stationary data solves this problem.
        • \n", + "
        \n", + "
      5. Is there a detectable auto-regressive pattern in the stationary data?
      6. \n", + "
          \n", + "
        • Importance: The accuracy of ML models can be improved if serial correlation is modeled by including lags of the dependent/target variable as features. Including target lags in every experiment by default will result in a regression in accuracy scores if such setting is not warranted.
        • \n", + "
        \n", + "
      \n", + "\n", + "The answers to these questions will help determine the appropriate settings for the automated ML experiment.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "import pandas as pd\n", + "\n", + "from statsmodels.graphics.tsaplots import plot_acf, plot_pacf\n", + "import matplotlib.pyplot as plt\n", + "from pandas.plotting import register_matplotlib_converters\n", + "\n", + "register_matplotlib_converters() # fixes the future warning issue\n", + "\n", + "from helper_functions import unit_root_test_wrapper\n", + "from statsmodels.tools.sm_exceptions import InterpolationWarning\n", + "\n", + "warnings.simplefilter(\"ignore\", InterpolationWarning)\n", + "\n", + "\n", + "# set printing options\n", + "pd.set_option(\"display.max_columns\", 500)\n", + "pd.set_option(\"display.width\", 1000)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# load data\n", + "main_data_loc = \"data\"\n", + "train_file_name = \"S4248SM144SCEN.csv\"\n", + "\n", + "TARGET_COLNAME = \"S4248SM144SCEN\"\n", + "TIME_COLNAME = \"observation_date\"\n", + "COVID_PERIOD_START = \"2020-03-01\"\n", + "\n", + "df = pd.read_csv(os.path.join(main_data_loc, train_file_name))\n", + "df[TIME_COLNAME] = pd.to_datetime(df[TIME_COLNAME], format=\"%Y-%m-%d\")\n", + "df.sort_values(by=TIME_COLNAME, inplace=True)\n", + "df.set_index(TIME_COLNAME, inplace=True)\n", + "df.head(2)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot the entire dataset\n", + "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", + "ax.plot(df)\n", + "ax.title.set_text(\"Original Data Series\")\n", + "locs, labels = plt.xticks()\n", + "plt.xticks(rotation=45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The graph plots the alcohol sales in the United States. Because the data is trending, it can be difficult to see cycles, seasonality or other interesting behaviors due to the scaling issues. For example, if there is a seasonal pattern, which we will discuss later, we cannot see them on the trending data. In such case, it is worth plotting the same data in first differences." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot the entire dataset in first differences\n", + "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", + "ax.plot(df.diff().dropna())\n", + "ax.title.set_text(\"Data in first differences\")\n", + "locs, labels = plt.xticks()\n", + "plt.xticks(rotation=45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous plot we observe that the data is more volatile towards the end of the series. This period coincides with the Covid-19 period, so we will exclude it from our experiment. Since in this example there are no user-provided features it is hard to make an argument that a model trained on the less volatile pre-covid data will be able to accurately predict the covid period." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 1. Seasonality\n", + "\n", + "#### Questions that need to be answered in this section:\n", + "1. Is there a seasonality?\n", + "2. If it's seasonal, does the data exhibit a trend (up or down)?\n", + "\n", + "It is hard to visually detect seasonality when the data is trending. The reason being is scale of seasonal fluctuations is dwarfed by the range of the trend in the data. One way to deal with this is to de-trend the data by taking the first differences. We will discuss this in more detail in the next section." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot the entire dataset in first differences\n", + "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", + "ax.plot(df.diff().dropna())\n", + "ax.title.set_text(\"Data in first differences\")\n", + "locs, labels = plt.xticks()\n", + "plt.xticks(rotation=45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the next plot, we will exclude the Covid period again. We will also shorten the length of data because plotting a very long time series may prevent us from seeing seasonal patterns, if there are any, because the plot may look like a random walk." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# remove COVID period\n", + "df = df[:COVID_PERIOD_START]\n", + "\n", + "# plot the entire dataset in first differences\n", + "fig, ax = plt.subplots(figsize=(6, 2), dpi=180)\n", + "ax.plot(df[\"2015-01-01\":].diff().dropna())\n", + "ax.title.set_text(\"Data in first differences\")\n", + "locs, labels = plt.xticks()\n", + "plt.xticks(rotation=45)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

      Conclusion

      \n", + "\n", + "Visual examination does not suggest clear seasonal patterns. We will set the STL_TYPE = None, and we will move to the next section that examines stationarity. \n", + "\n", + "\n", + "Say, we are working with a different data set that shows clear patterns of seasonality, we have several options for setting the settings:is hard to say which option will work best in your case, hence you will need to run both options to see which one results in more accurate forecasts. \n", + "
        \n", + "
      1. If the data does not appear to be trending, set DIFFERENCE_SERIES=False, TARGET_LAGS=None and STL_TYPE = \"season\"
      2. \n", + "
      3. If the data appears to be trending, consider one of the following two settings:\n", + "
          \n", + "
            \n", + "
          1. DIFFERENCE_SERIES=True, TARGET_LAGS=None and STL_TYPE = \"season\", or
          2. \n", + "
          3. DIFFERENCE_SERIES=False, TARGET_LAGS=None and STL_TYPE = \"trend_season\"
          4. \n", + "
          \n", + "
        • In the first case, by taking first differences we are removing stochastic trend, but we do not remove seasonal patterns. In the second case, we do not remove the stochastic trend and it can be captured by the trend component of the STL decomposition. It is hard to say which option will work best in your case, hence you will need to run both options to see which one results in more accurate forecasts.
        • \n", + "
        \n", + "
      " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 2. Stationarity\n", + "If the data does not exhibit seasonal patterns, we would like to see if the data is non-stationary. Particularly, we want to see if there is a clear trending behavior. If such behavior is observed, we would like to first difference the data and examine the plot of an auto-correlation function (ACF) known as correlogram. If the data is seasonal, differencing it will not get rid off the seasonality and this will be shown on the correlogram as well.\n", + "\n", + "
        \n", + "
      • Question: What is stationarity and how to we detect it?
      • \n", + "
          \n", + "
        • This is a fairly complex topic. Please read the following link for a high level discussion on this subject.
        • \n", + "
        • Simply put, we are looking for scenario when examining the time series plots the mean of the series is roughly the same, regardless which time interval you pick to compute it. Thus, trending and seasonal data are examples of non-stationary series.
        • \n", + "
        \n", + "
      \n", + "\n", + "\n", + "
        \n", + "
      • Question: Why do want to work with stationary data?
      • \n", + "
          \n", + "
        • In the absence of features that capture stochastic trends, the ML models that use (deterministic) time based features (hour of the day, day of the week, month of the year, etc) cannot capture such trends, and will over or under predict depending on the behavior of the time series. By working with stationary data, we eliminate the need to predict such trends, which improves the forecast accuracy. Classical time series models such as Arima and Exponential Smoothing handle non-stationary series by design and do not need such transformations. By differencing the data we are still able to run the same family of models.
        • \n", + "
        \n", + "
      \n", + "\n", + "#### Questions that need to be answered in this section:\n", + "
        \n", + "
      1. Is the data stationary?
      2. \n", + "
      3. Does the stationarized data (either the original or the differenced series) exhibit a clear auto-regressive pattern?
      4. \n", + "
      \n", + "\n", + "To answer the first question, we run a series of tests (we call them unit root tests)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# unit root tests\n", + "test = unit_root_test_wrapper(df[TARGET_COLNAME])\n", + "print(\"---------------\", \"\\n\")\n", + "print(\"Summary table\", \"\\n\", test[\"summary\"], \"\\n\")\n", + "print(\"Is the {} series stationary?: {}\".format(TARGET_COLNAME, test[\"stationary\"]))\n", + "print(\"---------------\", \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the previous cell, we ran a series of unit root tests. The summary table contains the following columns:\n", + "
        \n", + "
      • test_name is the name of the test.\n", + "
          \n", + "
        • ADF: Augmented Dickey-Fuller test
        • \n", + "
        • KPSS: Kwiatkowski-Phillips–Schmidt–Shin test
        • \n", + "
        • PP: Phillips-Perron test\n", + "
        • ADF GLS: Augmented Dickey-Fuller using generalized least squares method
        • \n", + "
        • AZ: Andrews-Zivot test
        • \n", + "
        \n", + "
      • statistic: test statistic
      • \n", + "
      • crit_val: critical value of the test statistic
      • \n", + "
      • p_val: p-value of the test statistic. If the p-val is less than 0.05, the null hypothesis is rejected.
      • \n", + "
      • stationary: is the series stationary based on the test result?
      • \n", + "
      • Null hypothesis: what is being tested. Notice, some test such as ADF and PP assume the process has a unit root and looks for evidence to reject this hypothesis. Other tests, ex.g: KPSS, assumes the process is stationary and looks for evidence to reject such claim.\n", + "
      \n", + "\n", + "Each of the tests shows that the original time series is non-stationary. The final decision is based on the majority rule. If, there is a split decision, the algorithm will claim it is stationary. We run a series of tests because each test by itself may not be accurate. In many cases when there are conflicting test results, the user needs to make determination if the series is stationary or not.\n", + "\n", + "Since we found the series to be non-stationary, we will difference it and then test if the differenced series is stationary." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# unit root tests\n", + "test = unit_root_test_wrapper(df[TARGET_COLNAME].diff().dropna())\n", + "print(\"---------------\", \"\\n\")\n", + "print(\"Summary table\", \"\\n\", test[\"summary\"], \"\\n\")\n", + "print(\"Is the {} series stationary?: {}\".format(TARGET_COLNAME, test[\"stationary\"]))\n", + "print(\"---------------\", \"\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Four out of five tests show that the series in first differences is stationary. Notice that this decision is not unanimous. Next, let's plot the original series in first-differences to illustrate the difference between non-stationary (unit root) process vs the stationary one." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# plot original and stationary data\n", + "fig = plt.figure(figsize=(10, 10))\n", + "ax1 = fig.add_subplot(211)\n", + "ax1.plot(df[TARGET_COLNAME], \"-b\")\n", + "ax2 = fig.add_subplot(212)\n", + "ax2.plot(df[TARGET_COLNAME].diff().dropna(), \"-b\")\n", + "ax1.title.set_text(\"Original data\")\n", + "ax2.title.set_text(\"Data in first differences\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If you were asked a question \"What is the mean of the series before and after 2008?\", for the series titled \"Original data\" the mean values will be significantly different. This implies that the first moment of the series (in this case, it is the mean) is time dependent, i.e., mean changes depending on the interval one is looking at. Thus, the series is deemed to be non-stationary. On the other hand, for the series titled \"Data in first differences\" the means for both periods are roughly the same. Hence, the first moment is time invariant; meaning it does not depend on the interval of time one is looking at. In this example it is easy to visually distinguish between stationary and non-stationary data. Often this distinction is not easy to make, therefore we rely on the statistical tests described above to help us make an informed decision. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

      Conclusion

      \n", + "Since we found the original process to be non-stationary (contains unit root), we will have to model the data in first differences. As a result, we will set the DIFFERENCE_SERIES parameter to True." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3 Check if there is a clear auto-regressive pattern\n", + "We need to determine if we should include lags of the target variable as features in order to improve forecast accuracy. To do this, we will examine the ACF and partial ACF (PACF) plots of the stationary series. In our case, it is a series in first differences.\n", + "\n", + "
        \n", + "
      • Question: What is an Auto-regressive pattern? What are we looking for?
      • \n", + "
          \n", + "
        • We are looking for a classical profiles for an AR(p) process such as an exponential decay of an ACF and a the first $p$ significant lags of the PACF. For a more detailed explanation of ACF and PACF please refer to the appendix at the end of this notebook. For illustration purposes, let's examine the ACF/PACF profiles of the simulated data that follows a second order auto-regressive process, abbreviated as an AR(2).
        • \n", + "
        • \n", + "
          \n", + " The lag order is on the x-axis while the auto- and partial-correlation coefficients are on the y-axis. Vertical lines that are outside the shaded area represent statistically significant lags. Notice, the ACF function decays to zero and the PACF shows 2 significant spikes (we ignore the first spike for lag 0 in both plots since the linear relationship of any series with itself is always 1).
        • \n", + "
        \n", + "
          " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
            \n", + "
          • Question: What do I do if I observe an auto-regressive behavior?
          • \n", + "
              \n", + "
            • If such behavior is observed, we might improve the forecast accuracy by enabling the target lags feature in AutoML. There are a few options of doing this
            • \n", + "
                \n", + "
              1. Set the target lags parameter to 'auto', or
              2. \n", + "
              3. Specify the list of lags you want to include. Ex.g: target_lags = [1,2,5]
              4. \n", + "
              \n", + "
            \n", + "
            \n", + "
          • Next, let's examine the ACF and PACF plots of the stationary target variable (depicted below). Here, we do not see a decay in the ACF, instead we see a decay in PACF. It is hard to make an argument the the target variable exhibits auto-regressive behavior.
          • \n", + "
          " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Plot the ACF/PACF for the series in differences\n", + "fig, ax = plt.subplots(1, 2, figsize=(10, 5))\n", + "plot_acf(df[TARGET_COLNAME].diff().dropna().values.squeeze(), ax=ax[0])\n", + "plot_pacf(df[TARGET_COLNAME].diff().dropna().values.squeeze(), ax=ax[1])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

          Conclusion

          \n", + "Since we do not see a clear indication of an AR(p) process, we will not be using target lags and will set the TARGET_LAGS parameter to None." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

          AutoML Experiment Settings

          \n", + "Based on the analysis performed, we should try the following settings for the AutoML experiment and use them in the \"2_run_experiment\" notebook.\n", + "
            \n", + "
          • STL_TYPE=None
          • \n", + "
          • DIFFERENCE_SERIES=True
          • \n", + "
          • TARGET_LAGS=None
          • \n", + "
          " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Appendix: ACF, PACF and Lag Selection\n", + "To do this, we will examine the ACF and partial ACF (PACF) plots of the differenced series. \n", + "\n", + "
            \n", + "
          • Question: What is the ACF?
          • \n", + "
              \n", + "
            • To understand the ACF, first let's look at the correlation coefficient $\\rho_{xz}$\n", + " \\begin{equation}\n", + " \\rho_{xz} = \\frac{\\sigma_{xz}}{\\sigma_{x} \\sigma_{zy}}\n", + " \\end{equation}\n", + "
            • \n", + " where $\\sigma_{xzy}$ is the covariance between two random variables $X$ and $Z$; $\\sigma_x$ and $\\sigma_z$ is the variance for $X$ and $Z$, respectively. The correlation coefficient measures the strength of linear relationship between two random variables. This metric can take any value from -1 to 1.
            • \n", + "
              \n", + "
            • The auto-correlation coefficient $\\rho_{Y_{t} Y_{t-k}}$ is the time series equivalent of the correlation coefficient, except instead of measuring linear association between two random variables $X$ and $Z$, it measures the strength of a linear relationship between a random variable $Y_t$ and its lag $Y_{t-k}$ for any positive integer value of $k$.
            • \n", + "
              \n", + "
            • To visualize the ACF for a particular lag, say lag 2, plot the second lag of a series $y_{t-2}$ on the x-axis, and plot the series itself $y_t$ on the y-axis. The autocorrelation coefficient is the slope of the best fitted regression line and can be interpreted as follows. A one unit increase in the lag of a variable one period ago leads to a $\\rho_{Y_{t} Y_{t-2}}$ units change in the variable in the current period. This interpretation can be applied to any lag.
            • \n", + "
              \n", + "
            • In the interpretation posted above we need to be careful not to confuse the word \"leads\" with \"causes\" since these are not the same thing. We do not know the lagged value of the variable causes it to change. After all, there are probably many other features that may explain the movement in $Y_t$. All we are trying to do in this section is to identify situations when the variable contains the strong auto-regressive components that needs to be included in the model to improve forecast accuracy.
            • \n", + "
            \n", + "
          " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
            \n", + "
          • Question: What is the PACF?
          • \n", + "
              \n", + "
            • When describing the ACF we essentially running a regression between a particular lag of a series, say, lag 4, and the series itself. What this implies is the regression coefficient for lag 4 captures the impact of everything that happens in lags 1, 2 and 3. In other words, if lag 1 is the most important lag and we exclude it from the regression, naturally, the regression model will assign the importance of the 1st lag to the 4th one. Partial auto-correlation function fixes this problem since it measures the contribution of each lag accounting for the information added by the intermediary lags. If we were to illustrate ACF and PACF for the fourth lag using the regression analogy, the difference is a follows: \n", + " \\begin{align}\n", + " Y_{t} &= a_{0} + a_{4} Y_{t-4} + e_{t} \\\\\n", + " Y_{t} &= b_{0} + b_{1} Y_{t-1} + b_{2} Y_{t-2} + b_{3} Y_{t-3} + b_{4} Y_{t-4} + \\varepsilon_{t} \\\\\n", + " \\end{align}\n", + "
            • \n", + "
              \n", + "
            • \n", + " Here, you can think of $a_4$ and $b_{4}$ as the auto- and partial auto-correlation coefficients for lag 4. Notice, in the second equation we explicitly accounting for the intermediate lags by adding them as regressors.\n", + "
            • \n", + "
            \n", + "
          " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
            \n", + "
          • Question: Auto-regressive pattern? What are we looking for?
          • \n", + "
              \n", + "
            • We are looking for a classical profiles for an AR(p) process such as an exponential decay of an ACF and a the first $p$ significant lags of the PACF. Let's examine the ACF/PACF profiles of the same simulated AR(2) shown in Section 3, and check if the ACF/PACF explanation are reflected in these plots.
            • \n", + "
            • \n", + "
            • The autocorrelation coefficient for the 3rd lag is 0.6, which can be interpreted that a one unit increase in the value of the target variable three periods ago leads to 0.6 units increase in the current period. However, the PACF plot shows that the partial autocorrelation coefficient is zero (from a statistical point of view since it lies within the shaded region). This is happening because the 1st and 2nd lags are good predictors of the target variable. Omitting these two lags from the regression results in the misleading conclusion that the third lag is a good prediction.
            • \n", + "
              \n", + "
            • This is why it is important to examine both the ACF and the PACF plots when trying to determine the auto regressive order for the variable in question.
            • \n", + "
            \n", + "
          " + ] + } + ], + "metadata": { + "authors": [ + { + "name": "vlbejan" + } ], - "metadata": { - "authors": [ - { - "name": "vlbejan" - } - ], - "kernelspec": { - "name": "python38-azureml", - "language": "python", - "display_name": "Python 3.8 - AzureML" - }, - "language_info": { - "name": "python", - "version": "3.8.10", - "mimetype": "text/x-python", - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "pygments_lexer": "ipython3", - "nbconvert_exporter": "python", - "file_extension": ".py" - }, - "microsoft": { - "ms_spell_check": { - "ms_spell_check_language": "en" - } - }, - "kernel_info": { - "name": "python38-azureml" - }, - "nteract": { - "version": "nteract-front-end@1.0.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file + "kernel_info": { + "name": "python38-azureml" + }, + "kernelspec": { + "display_name": "Python 3.8 - AzureML", + "language": "python", + "name": "python38-azureml" + }, + "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.10" + }, + "microsoft": { + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-run-experiment.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-run-experiment.ipynb index aeed05544b..87bd995aeb 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-run-experiment.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/auto-ml-forecasting-univariate-recipe-run-experiment.ipynb @@ -1,597 +1,604 @@ { - "cells": [ - { - "cell_type": "markdown", - "source": [ - "Copyright (c) Microsoft Corporation. All rights reserved.\n", - "\n", - "Licensed under the MIT License." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-recipes-univariate/2_run_experiment.png)" - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "# Running AutoML experiments\n", - "\n", - "See the `auto-ml-forecasting-univariate-recipe-experiment-settings` notebook on how to determine settings for seasonal features, target lags and whether the series needs to be differenced or not. To make experimentation user-friendly, the user has to specify several parameters: DIFFERENCE_SERIES, TARGET_LAGS and STL_TYPE. Once these parameters are set, the notebook will generate correct transformations and settings to run experiments, generate forecasts, compute inference set metrics and plot forecast vs actuals. It will also convert the forecast from first differences to levels (original units of measurement) if the DIFFERENCE_SERIES parameter is set to True before calculating inference set metrics.\n", - "\n", - "
          \n", - "\n", - "The output generated by this notebook is saved in the `experiment_output`folder." - ], - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Setup" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "import os\n", - "import logging\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "import azureml.automl.runtime\n", - "from azureml.core.compute import AmlCompute\n", - "from azureml.core.compute import ComputeTarget\n", - "import matplotlib.pyplot as plt\n", - "from helper_functions import ts_train_test_split, compute_metrics\n", - "\n", - "import azureml.core\n", - "from azureml.core.workspace import Workspace\n", - "from azureml.core.experiment import Experiment\n", - "from azureml.train.automl import AutoMLConfig\n", - "\n", - "\n", - "# set printing options\n", - "np.set_printoptions(precision=4, suppress=True, linewidth=100)\n", - "pd.set_option(\"display.max_columns\", 500)\n", - "pd.set_option(\"display.width\", 1000)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "As part of the setup you have already created a **Workspace**. You will also need to create a [compute target](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-set-up-training-targets#amlcompute) for your AutoML run. In this tutorial, you create AmlCompute as your training compute resource.\n", - "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "ws = Workspace.from_config()\n", - "amlcompute_cluster_name = \"recipe-cluster\"\n", - "\n", - "found = False\n", - "# Check if this compute target already exists in the workspace.\n", - "cts = ws.compute_targets\n", - "if amlcompute_cluster_name in cts and cts[amlcompute_cluster_name].type == \"AmlCompute\":\n", - " found = True\n", - " print(\"Found existing compute target.\")\n", - " compute_target = cts[amlcompute_cluster_name]\n", - "\n", - "if not found:\n", - " print(\"Creating a new compute target...\")\n", - " provisioning_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_D2_V2\", max_nodes=6\n", - " )\n", - "\n", - " # Create the cluster.\\n\",\n", - " compute_target = ComputeTarget.create(\n", - " ws, amlcompute_cluster_name, provisioning_config\n", - " )\n", - "\n", - "print(\"Checking cluster status...\")\n", - "# Can poll for a minimum number of nodes and for a specific timeout.\n", - "# If no min_node_count is provided, it will use the scale settings for the cluster.\n", - "compute_target.wait_for_completion(\n", - " show_output=True, min_node_count=None, timeout_in_minutes=20\n", - ")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Data\n", - "\n", - "Here, we will load the data from the csv file and drop the Covid period." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "main_data_loc = \"data\"\n", - "train_file_name = \"S4248SM144SCEN.csv\"\n", - "\n", - "TARGET_COLNAME = \"S4248SM144SCEN\"\n", - "TIME_COLNAME = \"observation_date\"\n", - "COVID_PERIOD_START = (\n", - " \"2020-03-01\" # start of the covid period. To be excluded from evaluation.\n", - ")\n", - "\n", - "# load data\n", - "df = pd.read_csv(os.path.join(main_data_loc, train_file_name))\n", - "df[TIME_COLNAME] = pd.to_datetime(df[TIME_COLNAME], format=\"%Y-%m-%d\")\n", - "df.sort_values(by=TIME_COLNAME, inplace=True)\n", - "\n", - "# remove the Covid period\n", - "df = df.query('{} <= \"{}\"'.format(TIME_COLNAME, COVID_PERIOD_START))" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Set parameters\n", - "\n", - "The first set of parameters is based on the analysis performed in the `auto-ml-forecasting-univariate-recipe-experiment-settings` notebook. " - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# set parameters based on the settings notebook analysis\n", - "DIFFERENCE_SERIES = True\n", - "TARGET_LAGS = None\n", - "STL_TYPE = None" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "Next, define additional parameters to be used in the AutoML config class.\n", - "\n", - "
            \n", - "
          • FORECAST_HORIZON: The forecast horizon is the number of periods into the future that the model should predict. Here, we set the horizon to 12 periods (i.e. 12 quarters). For more discussion of forecast horizons and guiding principles for setting them, please see the energy demand notebook . \n", - "
          • \n", - "
          • TIME_SERIES_ID_COLNAMES: The names of columns used to group a timeseries. It can be used to create multiple series. If time series identifier is not defined, the data set is assumed to be one time-series. This parameter is used with task type forecasting. Since we are working with a single series, this list is empty.\n", - "
          • \n", - "
          • BLOCKED_MODELS: Optional list of models to be blocked from consideration during model selection stage. At this point we want to consider all ML and Time Series models.\n", - "
              \n", - "
            • See the following link for a list of supported Forecasting models
            • \n", - "
            \n", - "
          • \n", - "
          \n" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# set other parameters\n", - "FORECAST_HORIZON = 12\n", - "TIME_SERIES_ID_COLNAMES = []\n", - "BLOCKED_MODELS = []" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "To run AutoML, you also need to create an **Experiment**. An Experiment corresponds to a prediction problem you are trying to solve, while a Run corresponds to a specific approach to the problem." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# choose a name for the run history container in the workspace\n", - "if isinstance(TARGET_LAGS, list):\n", - " TARGET_LAGS_STR = (\n", - " \"-\".join(map(str, TARGET_LAGS)) if (len(TARGET_LAGS) > 0) else None\n", - " )\n", - "else:\n", - " TARGET_LAGS_STR = TARGET_LAGS\n", - "\n", - "experiment_desc = \"diff-{}_lags-{}_STL-{}\".format(\n", - " DIFFERENCE_SERIES, TARGET_LAGS_STR, STL_TYPE\n", - ")\n", - "experiment_name = \"alcohol_{}\".format(experiment_desc)\n", - "experiment = Experiment(ws, experiment_name)\n", - "\n", - "output = {}\n", - "output[\"SDK version\"] = azureml.core.VERSION\n", - "output[\"Subscription ID\"] = ws.subscription_id\n", - "output[\"Workspace\"] = ws.name\n", - "output[\"SKU\"] = ws.sku\n", - "output[\"Resource Group\"] = ws.resource_group\n", - "output[\"Location\"] = ws.location\n", - "output[\"Run History Name\"] = experiment_name\n", - "pd.set_option(\"display.max_colwidth\", None)\n", - "outputDf = pd.DataFrame(data=output, index=[\"\"])\n", - "print(outputDf.T)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# create output directory\n", - "output_dir = \"experiment_output/{}\".format(experiment_desc)\n", - "if not os.path.exists(output_dir):\n", - " os.makedirs(output_dir)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# difference data and test for unit root\n", - "if DIFFERENCE_SERIES:\n", - " df_delta = df.copy()\n", - " df_delta[TARGET_COLNAME] = df[TARGET_COLNAME].diff()\n", - " df_delta.dropna(axis=0, inplace=True)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# split the data into train and test set\n", - "if DIFFERENCE_SERIES:\n", - " # generate train/inference sets using data in first differences\n", - " df_train, df_test = ts_train_test_split(\n", - " df_input=df_delta,\n", - " n=FORECAST_HORIZON,\n", - " time_colname=TIME_COLNAME,\n", - " ts_id_colnames=TIME_SERIES_ID_COLNAMES,\n", - " )\n", - "else:\n", - " df_train, df_test = ts_train_test_split(\n", - " df_input=df,\n", - " n=FORECAST_HORIZON,\n", - " time_colname=TIME_COLNAME,\n", - " ts_id_colnames=TIME_SERIES_ID_COLNAMES,\n", - " )" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Upload files to the Datastore\n", - "The [Machine Learning service workspace](https://docs.microsoft.com/en-us/azure/machine-learning/service/concept-workspace) is paired with the storage account, which contains the default data store. We will use it to upload the bike share data and create [tabular dataset](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.data.tabulardataset?view=azure-ml-py) for training. A tabular dataset defines a series of lazily-evaluated, immutable operations to load data from the data source into tabular representation." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "df_train.to_csv(\"train.csv\", index=False)\n", - "df_test.to_csv(\"test.csv\", index=False)\n", - "\n", - "from azureml.data.dataset_factory import TabularDatasetFactory\n", - "\n", - "datastore = ws.get_default_datastore()\n", - "train_dataset = TabularDatasetFactory.register_pandas_dataframe(\n", - " df_train, target=(datastore, \"dataset/\"), name=\"train\"\n", - ")\n", - "test_dataset = TabularDatasetFactory.register_pandas_dataframe(\n", - " df_test, target=(datastore, \"dataset/\"), name=\"test\"\n", - ")\n", - "\n", - "# print the first 5 rows of the Dataset\n", - "train_dataset.to_pandas_dataframe().reset_index(drop=True).head(5)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Config AutoML" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "time_series_settings = {\n", - " \"time_column_name\": TIME_COLNAME,\n", - " \"forecast_horizon\": FORECAST_HORIZON,\n", - " \"target_lags\": TARGET_LAGS,\n", - " \"use_stl\": STL_TYPE,\n", - " \"blocked_models\": BLOCKED_MODELS,\n", - " \"time_series_id_column_names\": TIME_SERIES_ID_COLNAMES,\n", - "}\n", - "\n", - "automl_config = AutoMLConfig(\n", - " task=\"forecasting\",\n", - " debug_log=\"sample_experiment.log\",\n", - " primary_metric=\"normalized_root_mean_squared_error\",\n", - " experiment_timeout_minutes=20,\n", - " iteration_timeout_minutes=5,\n", - " enable_early_stopping=True,\n", - " training_data=train_dataset,\n", - " label_column_name=TARGET_COLNAME,\n", - " n_cross_validations=\"auto\", # Feel free to set to a small integer (>=2) if runtime is an issue.\n", - " cv_step_size=\"auto\",\n", - " verbosity=logging.INFO,\n", - " max_cores_per_iteration=-1,\n", - " compute_target=compute_target,\n", - " **time_series_settings,\n", - ")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "We will now run the experiment, you can go to Azure ML portal to view the run details." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "remote_run = experiment.submit(automl_config, show_output=False)\n", - "remote_run.wait_for_completion()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Retrieve the Best Run details\n", - "Below we retrieve the best Run object from among all the runs in the experiment." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "best_run = remote_run.get_best_child()\n", - "best_run" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Inference\n", - "\n", - "We now use the best fitted model from the AutoML Run to make forecasts for the test set. We will do batch scoring on the test dataset which should have the same schema as training dataset.\n", - "\n", - "The inference will run on a remote compute. In this example, it will re-use the training compute." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "test_experiment = Experiment(ws, experiment_name + \"_inference\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "## Retreiving forecasts from the model\n", - "We have created a function called `run_forecast` that submits the test data to the best model determined during the training run and retrieves forecasts. This function uses a helper script `forecasting_script` which is uploaded and expecuted on the remote compute." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "from run_forecast import run_remote_inference\n", - "\n", - "remote_run = run_remote_inference(\n", - " test_experiment=test_experiment,\n", - " compute_target=compute_target,\n", - " train_run=best_run,\n", - " test_dataset=test_dataset,\n", - " target_column_name=TARGET_COLNAME,\n", - ")\n", - "remote_run.wait_for_completion(show_output=False)\n", - "\n", - "remote_run.download_file(\"outputs/predictions.csv\", f\"{output_dir}/predictions.csv\")" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Download the prediction result for metrics calcuation\n", - "The test data with predictions are saved in artifact `outputs/predictions.csv`. We will use it to calculate accuracy metrics and vizualize predictions versus actuals." - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "X_trans = pd.read_csv(f\"{output_dir}/predictions.csv\", parse_dates=[TIME_COLNAME])\n", - "X_trans.head()" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# convert forecast in differences to levels\n", - "def convert_fcst_diff_to_levels(fcst, yt, df_orig):\n", - " \"\"\"Convert forecast from first differences to levels.\"\"\"\n", - " fcst = fcst.reset_index(drop=False, inplace=False)\n", - " fcst[\"predicted_level\"] = fcst[\"predicted\"].cumsum()\n", - " fcst[\"predicted_level\"] = fcst[\"predicted_level\"].astype(float) + float(yt)\n", - " # merge actuals\n", - " out = pd.merge(\n", - " fcst, df_orig[[TIME_COLNAME, TARGET_COLNAME]], on=[TIME_COLNAME], how=\"inner\"\n", - " )\n", - " out.rename(columns={TARGET_COLNAME: \"actual_level\"}, inplace=True)\n", - " return out" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "if DIFFERENCE_SERIES:\n", - " # convert forecast in differences to the levels\n", - " INFORMATION_SET_DATE = max(df_train[TIME_COLNAME])\n", - " YT = df.query(\"{} == @INFORMATION_SET_DATE\".format(TIME_COLNAME))[TARGET_COLNAME]\n", - "\n", - " fcst_df = convert_fcst_diff_to_levels(fcst=X_trans, yt=YT, df_orig=df)\n", - "else:\n", - " fcst_df = X_trans.copy()\n", - " fcst_df[\"actual_level\"] = y_test\n", - " fcst_df[\"predicted_level\"] = y_predictions\n", - "\n", - "del X_trans" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Calculate metrics and save output" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "# compute metrics\n", - "metrics_df = compute_metrics(fcst_df=fcst_df, metric_name=None, ts_id_colnames=None)\n", - "# save output\n", - "metrics_file_name = \"{}_metrics.csv\".format(experiment_name)\n", - "fcst_file_name = \"{}_forecst.csv\".format(experiment_name)\n", - "plot_file_name = \"{}_plot.pdf\".format(experiment_name)\n", - "\n", - "metrics_df.to_csv(os.path.join(output_dir, metrics_file_name), index=True)\n", - "fcst_df.to_csv(os.path.join(output_dir, fcst_file_name), index=True)" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - }, - { - "cell_type": "markdown", - "source": [ - "### Generate and save visuals" - ], - "metadata": {} - }, - { - "cell_type": "code", - "source": [ - "plot_df = df.query('{} > \"2010-01-01\"'.format(TIME_COLNAME))\n", - "plot_df.set_index(TIME_COLNAME, inplace=True)\n", - "fcst_df.set_index(TIME_COLNAME, inplace=True)\n", - "\n", - "# generate and save plots\n", - "fig, ax = plt.subplots(dpi=180)\n", - "ax.plot(plot_df[TARGET_COLNAME], \"-g\", label=\"Historical\")\n", - "ax.plot(fcst_df[\"actual_level\"], \"-b\", label=\"Actual\")\n", - "ax.plot(fcst_df[\"predicted_level\"], \"-r\", label=\"Forecast\")\n", - "ax.legend()\n", - "ax.set_title(\"Forecast vs Actuals\")\n", - "ax.set_xlabel(TIME_COLNAME)\n", - "ax.set_ylabel(TARGET_COLNAME)\n", - "locs, labels = plt.xticks()\n", - "\n", - "plt.setp(labels, rotation=45)\n", - "plt.savefig(os.path.join(output_dir, plot_file_name))" - ], - "outputs": [], - "execution_count": null, - "metadata": {} - } + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Copyright (c) Microsoft Corporation. All rights reserved.\n", + "\n", + "Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![Impressions](https://PixelServer20190423114238.azurewebsites.net/api/impressions/MachineLearningNotebooks/how-to-use-azureml/automated-machine-learning/forecasting-recipes-univariate/2_run_experiment.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "!Important!
          This notebook is outdated and is not supported by the AutoML Team. Please use the supported version ([link](https://github.com/Azure/azureml-examples/tree/main/sdk/python/jobs/automl-standalone-jobs/automl-forecasting-recipes-univariate)).
          " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Running AutoML experiments\n", + "\n", + "See the `auto-ml-forecasting-univariate-recipe-experiment-settings` notebook on how to determine settings for seasonal features, target lags and whether the series needs to be differenced or not. To make experimentation user-friendly, the user has to specify several parameters: DIFFERENCE_SERIES, TARGET_LAGS and STL_TYPE. Once these parameters are set, the notebook will generate correct transformations and settings to run experiments, generate forecasts, compute inference set metrics and plot forecast vs actuals. It will also convert the forecast from first differences to levels (original units of measurement) if the DIFFERENCE_SERIES parameter is set to True before calculating inference set metrics.\n", + "\n", + "
          \n", + "\n", + "The output generated by this notebook is saved in the `experiment_output`folder." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import logging\n", + "import pandas as pd\n", + "import numpy as np\n", + "\n", + "import azureml.automl.runtime\n", + "from azureml.core.compute import AmlCompute\n", + "from azureml.core.compute import ComputeTarget\n", + "import matplotlib.pyplot as plt\n", + "from helper_functions import ts_train_test_split, compute_metrics\n", + "\n", + "import azureml.core\n", + "from azureml.core.workspace import Workspace\n", + "from azureml.core.experiment import Experiment\n", + "from azureml.train.automl import AutoMLConfig\n", + "\n", + "\n", + "# set printing options\n", + "np.set_printoptions(precision=4, suppress=True, linewidth=100)\n", + "pd.set_option(\"display.max_columns\", 500)\n", + "pd.set_option(\"display.width\", 1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As part of the setup you have already created a **Workspace**. You will also need to create a [compute target](https://docs.microsoft.com/en-us/azure/machine-learning/service/how-to-set-up-training-targets#amlcompute) for your AutoML run. In this tutorial, you create AmlCompute as your training compute resource.\n", + "> Note that if you have an AzureML Data Scientist role, you will not have permission to create compute resources. Talk to your workspace or IT admin to create the compute targets described in this section, if they do not already exist." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ws = Workspace.from_config()\n", + "amlcompute_cluster_name = \"recipe-cluster\"\n", + "\n", + "found = False\n", + "# Check if this compute target already exists in the workspace.\n", + "cts = ws.compute_targets\n", + "if amlcompute_cluster_name in cts and cts[amlcompute_cluster_name].type == \"AmlCompute\":\n", + " found = True\n", + " print(\"Found existing compute target.\")\n", + " compute_target = cts[amlcompute_cluster_name]\n", + "\n", + "if not found:\n", + " print(\"Creating a new compute target...\")\n", + " provisioning_config = AmlCompute.provisioning_configuration(\n", + " vm_size=\"STANDARD_D2_V2\", max_nodes=6\n", + " )\n", + "\n", + " # Create the cluster.\\n\",\n", + " compute_target = ComputeTarget.create(\n", + " ws, amlcompute_cluster_name, provisioning_config\n", + " )\n", + "\n", + "print(\"Checking cluster status...\")\n", + "# Can poll for a minimum number of nodes and for a specific timeout.\n", + "# If no min_node_count is provided, it will use the scale settings for the cluster.\n", + "compute_target.wait_for_completion(\n", + " show_output=True, min_node_count=None, timeout_in_minutes=20\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Data\n", + "\n", + "Here, we will load the data from the csv file and drop the Covid period." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "main_data_loc = \"data\"\n", + "train_file_name = \"S4248SM144SCEN.csv\"\n", + "\n", + "TARGET_COLNAME = \"S4248SM144SCEN\"\n", + "TIME_COLNAME = \"observation_date\"\n", + "COVID_PERIOD_START = (\n", + " \"2020-03-01\" # start of the covid period. To be excluded from evaluation.\n", + ")\n", + "\n", + "# load data\n", + "df = pd.read_csv(os.path.join(main_data_loc, train_file_name))\n", + "df[TIME_COLNAME] = pd.to_datetime(df[TIME_COLNAME], format=\"%Y-%m-%d\")\n", + "df.sort_values(by=TIME_COLNAME, inplace=True)\n", + "\n", + "# remove the Covid period\n", + "df = df.query('{} <= \"{}\"'.format(TIME_COLNAME, COVID_PERIOD_START))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Set parameters\n", + "\n", + "The first set of parameters is based on the analysis performed in the `auto-ml-forecasting-univariate-recipe-experiment-settings` notebook. " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# set parameters based on the settings notebook analysis\n", + "DIFFERENCE_SERIES = True\n", + "TARGET_LAGS = None\n", + "STL_TYPE = None" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, define additional parameters to be used in the AutoML config class.\n", + "\n", + "
            \n", + "
          • FORECAST_HORIZON: The forecast horizon is the number of periods into the future that the model should predict. Here, we set the horizon to 12 periods (i.e. 12 quarters). For more discussion of forecast horizons and guiding principles for setting them, please see the energy demand notebook . \n", + "
          • \n", + "
          • TIME_SERIES_ID_COLNAMES: The names of columns used to group a timeseries. It can be used to create multiple series. If time series identifier is not defined, the data set is assumed to be one time-series. This parameter is used with task type forecasting. Since we are working with a single series, this list is empty.\n", + "
          • \n", + "
          • BLOCKED_MODELS: Optional list of models to be blocked from consideration during model selection stage. At this point we want to consider all ML and Time Series models.\n", + "
              \n", + "
            • See the following link for a list of supported Forecasting models
            • \n", + "
            \n", + "
          • \n", + "
          \n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# set other parameters\n", + "FORECAST_HORIZON = 12\n", + "TIME_SERIES_ID_COLNAMES = []\n", + "BLOCKED_MODELS = []" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To run AutoML, you also need to create an **Experiment**. An Experiment corresponds to a prediction problem you are trying to solve, while a Run corresponds to a specific approach to the problem." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# choose a name for the run history container in the workspace\n", + "if isinstance(TARGET_LAGS, list):\n", + " TARGET_LAGS_STR = (\n", + " \"-\".join(map(str, TARGET_LAGS)) if (len(TARGET_LAGS) > 0) else None\n", + " )\n", + "else:\n", + " TARGET_LAGS_STR = TARGET_LAGS\n", + "\n", + "experiment_desc = \"diff-{}_lags-{}_STL-{}\".format(\n", + " DIFFERENCE_SERIES, TARGET_LAGS_STR, STL_TYPE\n", + ")\n", + "experiment_name = \"alcohol_{}\".format(experiment_desc)\n", + "experiment = Experiment(ws, experiment_name)\n", + "\n", + "output = {}\n", + "output[\"SDK version\"] = azureml.core.VERSION\n", + "output[\"Subscription ID\"] = ws.subscription_id\n", + "output[\"Workspace\"] = ws.name\n", + "output[\"SKU\"] = ws.sku\n", + "output[\"Resource Group\"] = ws.resource_group\n", + "output[\"Location\"] = ws.location\n", + "output[\"Run History Name\"] = experiment_name\n", + "pd.set_option(\"display.max_colwidth\", None)\n", + "outputDf = pd.DataFrame(data=output, index=[\"\"])\n", + "print(outputDf.T)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# create output directory\n", + "output_dir = \"experiment_output/{}\".format(experiment_desc)\n", + "if not os.path.exists(output_dir):\n", + " os.makedirs(output_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# difference data and test for unit root\n", + "if DIFFERENCE_SERIES:\n", + " df_delta = df.copy()\n", + " df_delta[TARGET_COLNAME] = df[TARGET_COLNAME].diff()\n", + " df_delta.dropna(axis=0, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# split the data into train and test set\n", + "if DIFFERENCE_SERIES:\n", + " # generate train/inference sets using data in first differences\n", + " df_train, df_test = ts_train_test_split(\n", + " df_input=df_delta,\n", + " n=FORECAST_HORIZON,\n", + " time_colname=TIME_COLNAME,\n", + " ts_id_colnames=TIME_SERIES_ID_COLNAMES,\n", + " )\n", + "else:\n", + " df_train, df_test = ts_train_test_split(\n", + " df_input=df,\n", + " n=FORECAST_HORIZON,\n", + " time_colname=TIME_COLNAME,\n", + " ts_id_colnames=TIME_SERIES_ID_COLNAMES,\n", + " )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Upload files to the Datastore\n", + "The [Machine Learning service workspace](https://docs.microsoft.com/en-us/azure/machine-learning/service/concept-workspace) is paired with the storage account, which contains the default data store. We will use it to upload the bike share data and create [tabular dataset](https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.data.tabulardataset?view=azure-ml-py) for training. A tabular dataset defines a series of lazily-evaluated, immutable operations to load data from the data source into tabular representation." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df_train.to_csv(\"train.csv\", index=False)\n", + "df_test.to_csv(\"test.csv\", index=False)\n", + "\n", + "from azureml.data.dataset_factory import TabularDatasetFactory\n", + "\n", + "datastore = ws.get_default_datastore()\n", + "train_dataset = TabularDatasetFactory.register_pandas_dataframe(\n", + " df_train, target=(datastore, \"dataset/\"), name=\"train\"\n", + ")\n", + "test_dataset = TabularDatasetFactory.register_pandas_dataframe(\n", + " df_test, target=(datastore, \"dataset/\"), name=\"test\"\n", + ")\n", + "\n", + "# print the first 5 rows of the Dataset\n", + "train_dataset.to_pandas_dataframe().reset_index(drop=True).head(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Config AutoML" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "time_series_settings = {\n", + " \"time_column_name\": TIME_COLNAME,\n", + " \"forecast_horizon\": FORECAST_HORIZON,\n", + " \"target_lags\": TARGET_LAGS,\n", + " \"use_stl\": STL_TYPE,\n", + " \"blocked_models\": BLOCKED_MODELS,\n", + " \"time_series_id_column_names\": TIME_SERIES_ID_COLNAMES,\n", + "}\n", + "\n", + "automl_config = AutoMLConfig(\n", + " task=\"forecasting\",\n", + " debug_log=\"sample_experiment.log\",\n", + " primary_metric=\"normalized_root_mean_squared_error\",\n", + " experiment_timeout_minutes=20,\n", + " iteration_timeout_minutes=5,\n", + " enable_early_stopping=True,\n", + " training_data=train_dataset,\n", + " label_column_name=TARGET_COLNAME,\n", + " n_cross_validations=\"auto\", # Feel free to set to a small integer (>=2) if runtime is an issue.\n", + " cv_step_size=\"auto\",\n", + " verbosity=logging.INFO,\n", + " max_cores_per_iteration=-1,\n", + " compute_target=compute_target,\n", + " **time_series_settings,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We will now run the experiment, you can go to Azure ML portal to view the run details." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "remote_run = experiment.submit(automl_config, show_output=False)\n", + "remote_run.wait_for_completion()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Retrieve the Best Run details\n", + "Below we retrieve the best Run object from among all the runs in the experiment." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "best_run = remote_run.get_best_child()\n", + "best_run" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Inference\n", + "\n", + "We now use the best fitted model from the AutoML Run to make forecasts for the test set. We will do batch scoring on the test dataset which should have the same schema as training dataset.\n", + "\n", + "The inference will run on a remote compute. In this example, it will re-use the training compute." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "test_experiment = Experiment(ws, experiment_name + \"_inference\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Retreiving forecasts from the model\n", + "We have created a function called `run_forecast` that submits the test data to the best model determined during the training run and retrieves forecasts. This function uses a helper script `forecasting_script` which is uploaded and expecuted on the remote compute." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from run_forecast import run_remote_inference\n", + "\n", + "remote_run = run_remote_inference(\n", + " test_experiment=test_experiment,\n", + " compute_target=compute_target,\n", + " train_run=best_run,\n", + " test_dataset=test_dataset,\n", + " target_column_name=TARGET_COLNAME,\n", + ")\n", + "remote_run.wait_for_completion(show_output=False)\n", + "\n", + "remote_run.download_file(\"outputs/predictions.csv\", f\"{output_dir}/predictions.csv\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Download the prediction result for metrics calcuation\n", + "The test data with predictions are saved in artifact `outputs/predictions.csv`. We will use it to calculate accuracy metrics and vizualize predictions versus actuals." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "X_trans = pd.read_csv(f\"{output_dir}/predictions.csv\", parse_dates=[TIME_COLNAME])\n", + "X_trans.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# convert forecast in differences to levels\n", + "def convert_fcst_diff_to_levels(fcst, yt, df_orig):\n", + " \"\"\"Convert forecast from first differences to levels.\"\"\"\n", + " fcst = fcst.reset_index(drop=False, inplace=False)\n", + " fcst[\"predicted_level\"] = fcst[\"predicted\"].cumsum()\n", + " fcst[\"predicted_level\"] = fcst[\"predicted_level\"].astype(float) + float(yt)\n", + " # merge actuals\n", + " out = pd.merge(\n", + " fcst, df_orig[[TIME_COLNAME, TARGET_COLNAME]], on=[TIME_COLNAME], how=\"inner\"\n", + " )\n", + " out.rename(columns={TARGET_COLNAME: \"actual_level\"}, inplace=True)\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "if DIFFERENCE_SERIES:\n", + " # convert forecast in differences to the levels\n", + " INFORMATION_SET_DATE = max(df_train[TIME_COLNAME])\n", + " YT = df.query(\"{} == @INFORMATION_SET_DATE\".format(TIME_COLNAME))[TARGET_COLNAME]\n", + "\n", + " fcst_df = convert_fcst_diff_to_levels(fcst=X_trans, yt=YT, df_orig=df)\n", + "else:\n", + " fcst_df = X_trans.copy()\n", + " fcst_df[\"actual_level\"] = y_test\n", + " fcst_df[\"predicted_level\"] = y_predictions\n", + "\n", + "del X_trans" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Calculate metrics and save output" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# compute metrics\n", + "metrics_df = compute_metrics(fcst_df=fcst_df, metric_name=None, ts_id_colnames=None)\n", + "# save output\n", + "metrics_file_name = \"{}_metrics.csv\".format(experiment_name)\n", + "fcst_file_name = \"{}_forecst.csv\".format(experiment_name)\n", + "plot_file_name = \"{}_plot.pdf\".format(experiment_name)\n", + "\n", + "metrics_df.to_csv(os.path.join(output_dir, metrics_file_name), index=True)\n", + "fcst_df.to_csv(os.path.join(output_dir, fcst_file_name), index=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Generate and save visuals" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plot_df = df.query('{} > \"2010-01-01\"'.format(TIME_COLNAME))\n", + "plot_df.set_index(TIME_COLNAME, inplace=True)\n", + "fcst_df.set_index(TIME_COLNAME, inplace=True)\n", + "\n", + "# generate and save plots\n", + "fig, ax = plt.subplots(dpi=180)\n", + "ax.plot(plot_df[TARGET_COLNAME], \"-g\", label=\"Historical\")\n", + "ax.plot(fcst_df[\"actual_level\"], \"-b\", label=\"Actual\")\n", + "ax.plot(fcst_df[\"predicted_level\"], \"-r\", label=\"Forecast\")\n", + "ax.legend()\n", + "ax.set_title(\"Forecast vs Actuals\")\n", + "ax.set_xlabel(TIME_COLNAME)\n", + "ax.set_ylabel(TARGET_COLNAME)\n", + "locs, labels = plt.xticks()\n", + "\n", + "plt.setp(labels, rotation=45)\n", + "plt.savefig(os.path.join(output_dir, plot_file_name))" + ] + } + ], + "metadata": { + "authors": [ + { + "name": "vlbejan" + } ], - "metadata": { - "authors": [ - { - "name": "vlbejan" - } - ], - "kernelspec": { - "name": "python3", - "language": "python", - "display_name": "Python 3 (ipykernel)" - }, - "language_info": { - "name": "python", - "version": "3.8.5", - "mimetype": "text/x-python", - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "pygments_lexer": "ipython3", - "nbconvert_exporter": "python", - "file_extension": ".py" - }, - "vscode": { - "interpreter": { - "hash": "6bd77c88278e012ef31757c15997a7bea8c943977c43d6909403c00ae11d43ca" - } - }, - "microsoft": { - "ms_spell_check": { - "ms_spell_check_language": "en" - } - }, - "kernel_info": { - "name": "python3" - }, - "nteract": { - "version": "nteract-front-end@1.0.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} \ No newline at end of file + "kernel_info": { + "name": "python3" + }, + "kernelspec": { + "display_name": "Python 3.8 - AzureML", + "language": "python", + "name": "python38-azureml" + }, + "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.10" + }, + "microsoft": { + "ms_spell_check": { + "ms_spell_check_language": "en" + } + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + }, + "vscode": { + "interpreter": { + "hash": "6bd77c88278e012ef31757c15997a7bea8c943977c43d6909403c00ae11d43ca" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/forecasting_script.py b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/forecasting_script.py index ca8f2f19dc..a6506bead1 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/forecasting_script.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/forecasting-recipes-univariate/forecasting_script.py @@ -7,7 +7,7 @@ import argparse from azureml.core import Dataset, Run from azureml.automl.core.shared.constants import TimeSeriesInternal -from sklearn.externals import joblib +import joblib parser = argparse.ArgumentParser() parser.add_argument( diff --git a/v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py b/v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py index cfcc3b3077..1c8e216bc6 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py +++ b/v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py @@ -92,7 +92,7 @@ def get_validation_check_yml(notebook_folder, notebook_name, validation): def write_notebook_workflow(notebook, notebook_folder, cron_schedule): notebook_name = notebook.replace(".ipynb", "") - creds = "${{secrets.AZ_CREDS}}" + creds = "${{secrets.AZUREML_CREDENTIALS}}" runner = "${{vars.V1_UBUNTU_RUNNER}}" run_update_env = "" @@ -106,7 +106,7 @@ def write_notebook_workflow(notebook, notebook_folder, cron_schedule): validation_yml = get_validation_yml(notebook_folder, notebook) - workflow_yaml = f"""name: {notebook_name} + workflow_yaml = f"""name: python-sdk-tutorial-{notebook_name} # This file is generated by v1/python-sdk/tutorials/automl-with-azureml/generate_workflows.py on: workflow_dispatch: diff --git a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass-batch-scoring/auto-ml-image-classification-multiclass-batch-scoring.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass-batch-scoring/auto-ml-image-classification-multiclass-batch-scoring.ipynb index a202ec909d..20ca0f22d7 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass-batch-scoring/auto-ml-image-classification-multiclass-batch-scoring.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass-batch-scoring/auto-ml-image-classification-multiclass-batch-scoring.ipynb @@ -101,7 +101,7 @@ "metadata": {}, "source": [ "## Compute target setup\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." ] }, { @@ -112,7 +112,7 @@ "source": [ "from azureml.core.compute import AmlCompute, ComputeTarget\n", "\n", - "cluster_name = \"gpu-cluster-nc6\"\n", + "cluster_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " compute_target = ws.compute_targets[cluster_name]\n", @@ -120,7 +120,7 @@ "except KeyError:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"Standard_NC6\",\n", + " vm_size=\"Standard_NC6s_v3\",\n", " idle_seconds_before_scaledown=600,\n", " min_nodes=0,\n", " max_nodes=4,\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass/auto-ml-image-classification-multiclass.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass/auto-ml-image-classification-multiclass.ipynb index 05fd82ad68..d25d635e2c 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass/auto-ml-image-classification-multiclass.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multiclass/auto-ml-image-classification-multiclass.ipynb @@ -77,7 +77,7 @@ "metadata": {}, "source": [ "## Compute target setup\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." ] }, { @@ -88,7 +88,7 @@ "source": [ "from azureml.core.compute import AmlCompute, ComputeTarget\n", "\n", - "cluster_name = \"gpu-cluster-nc6\"\n", + "cluster_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " compute_target = ws.compute_targets[cluster_name]\n", @@ -96,7 +96,7 @@ "except KeyError:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"Standard_NC6\",\n", + " vm_size=\"Standard_NC6s_v3\",\n", " idle_seconds_before_scaledown=600,\n", " min_nodes=0,\n", " max_nodes=4,\n", @@ -567,7 +567,7 @@ "except ComputeTargetException:\n", " print(\"Creating a new compute target...\")\n", " # Provision AKS cluster with a CPU machine\n", - " prov_config = AksCompute.provisioning_configuration(vm_size=\"STANDARD_D3_V2\")\n", + " prov_config = AksCompute.provisioning_configuration(vm_size=\"Standard_DS4_V2\")\n", " # Create the cluster\n", " aks_target = ComputeTarget.create(\n", " workspace=ws, name=aks_name, provisioning_configuration=prov_config\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multilabel/auto-ml-image-classification-multilabel.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multilabel/auto-ml-image-classification-multilabel.ipynb index 37dd0a857e..efb4719e97 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multilabel/auto-ml-image-classification-multilabel.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/image-classification-multilabel/auto-ml-image-classification-multilabel.ipynb @@ -77,7 +77,7 @@ "metadata": {}, "source": [ "## Compute target setup\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." ] }, { @@ -88,7 +88,7 @@ "source": [ "from azureml.core.compute import AmlCompute, ComputeTarget\n", "\n", - "cluster_name = \"gpu-cluster-nc6\"\n", + "cluster_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " compute_target = ws.compute_targets[cluster_name]\n", @@ -96,7 +96,7 @@ "except KeyError:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"Standard_NC6\",\n", + " vm_size=\"Standard_NC6s_v3\",\n", " idle_seconds_before_scaledown=600,\n", " min_nodes=0,\n", " max_nodes=4,\n", @@ -562,7 +562,7 @@ "except ComputeTargetException:\n", " print(\"Creating a new compute target...\")\n", " # Provision AKS cluster with a CPU machine\n", - " prov_config = AksCompute.provisioning_configuration(vm_size=\"STANDARD_D3_V2\")\n", + " prov_config = AksCompute.provisioning_configuration(vm_size=\"Standard_DS4_V2\")\n", " # Create the cluster\n", " aks_target = ComputeTarget.create(\n", " workspace=ws, name=aks_name, provisioning_configuration=prov_config\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/image-instance-segmentation/auto-ml-image-instance-segmentation.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/image-instance-segmentation/auto-ml-image-instance-segmentation.ipynb index 88ef0cd0de..b8acc4e4b7 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/image-instance-segmentation/auto-ml-image-instance-segmentation.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/image-instance-segmentation/auto-ml-image-instance-segmentation.ipynb @@ -94,7 +94,7 @@ "metadata": {}, "source": [ "## Compute target setup\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." ] }, { @@ -105,7 +105,7 @@ "source": [ "from azureml.core.compute import AmlCompute, ComputeTarget\n", "\n", - "cluster_name = \"gpu-cluster-nc6\"\n", + "cluster_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " compute_target = ws.compute_targets[cluster_name]\n", @@ -113,7 +113,7 @@ "except KeyError:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"Standard_NC6\",\n", + " vm_size=\"Standard_NC6s_v3\",\n", " idle_seconds_before_scaledown=600,\n", " min_nodes=0,\n", " max_nodes=4,\n", @@ -546,7 +546,7 @@ "except ComputeTargetException:\n", " print(\"Creating a new compute target...\")\n", " # Provision AKS cluster with a CPU machine\n", - " prov_config = AksCompute.provisioning_configuration(vm_size=\"STANDARD_D3_V2\")\n", + " prov_config = AksCompute.provisioning_configuration(vm_size=\"Standard_DS4_V2\")\n", " # Create the cluster\n", " aks_target = ComputeTarget.create(\n", " workspace=ws, name=aks_name, provisioning_configuration=prov_config\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/image-object-detection/auto-ml-image-object-detection.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/image-object-detection/auto-ml-image-object-detection.ipynb index df7c278b9c..34c6b2f4ae 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/image-object-detection/auto-ml-image-object-detection.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/image-object-detection/auto-ml-image-object-detection.ipynb @@ -77,7 +77,7 @@ "metadata": {}, "source": [ "## Compute target setup\n", - "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NC, NCv2, NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." + "You will need to provide a [Compute Target](https://docs.microsoft.com/en-us/azure/machine-learning/concept-azure-machine-learning-architecture#computes) that will be used for your AutoML model training. AutoML models for image tasks require [GPU SKUs](https://docs.microsoft.com/en-us/azure/virtual-machines/sizes-gpu) such as the ones from the NCv3, ND, NDv2 and NCasT4 series. We recommend using the NCsv3-series (with v100 GPUs) for faster training. Using a compute target with a multi-GPU VM SKU will leverage the multiple GPUs to speed up training. Additionally, setting up a compute target with multiple nodes will allow for faster model training by leveraging parallelism, when tuning hyperparameters for your model." ] }, { @@ -88,7 +88,7 @@ "source": [ "from azureml.core.compute import AmlCompute, ComputeTarget\n", "\n", - "cluster_name = \"gpu-cluster-nc6\"\n", + "cluster_name = \"gpu-cluster-nc6sv3\"\n", "\n", "try:\n", " compute_target = ws.compute_targets[cluster_name]\n", @@ -96,7 +96,7 @@ "except KeyError:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"Standard_NC6\",\n", + " vm_size=\"Standard_NC6s_v3\",\n", " idle_seconds_before_scaledown=600,\n", " min_nodes=0,\n", " max_nodes=4,\n", @@ -630,7 +630,7 @@ "except ComputeTargetException:\n", " print(\"Creating a new compute target...\")\n", " # Provision AKS cluster with a CPU machine\n", - " prov_config = AksCompute.provisioning_configuration(vm_size=\"STANDARD_D3_V2\")\n", + " prov_config = AksCompute.provisioning_configuration(vm_size=\"Standard_DS4_V2\")\n", " # Create the cluster\n", " aks_target = ComputeTarget.create(\n", " workspace=ws, name=aks_name, provisioning_configuration=prov_config\n", diff --git a/v1/python-sdk/tutorials/automl-with-azureml/regression-explanation-featurization/auto-ml-regression-explanation-featurization.ipynb b/v1/python-sdk/tutorials/automl-with-azureml/regression-explanation-featurization/auto-ml-regression-explanation-featurization.ipynb index 7c3375c185..e49bba8cc0 100644 --- a/v1/python-sdk/tutorials/automl-with-azureml/regression-explanation-featurization/auto-ml-regression-explanation-featurization.ipynb +++ b/v1/python-sdk/tutorials/automl-with-azureml/regression-explanation-featurization/auto-ml-regression-explanation-featurization.ipynb @@ -501,8 +501,10 @@ "metadata": {}, "outputs": [], "source": [ + "from azureml.core import Environment\n", "from azureml.core.runconfig import RunConfiguration\n", "from azureml.core.conda_dependencies import CondaDependencies\n", + "import json\n", "import pkg_resources\n", "\n", "# create a new RunConfig object\n", @@ -513,7 +515,16 @@ "conda_run_config.environment.docker.enabled = True\n", "\n", "# specify CondaDependencies obj\n", - "conda_run_config.environment = automl_run.get_environment()" + "try:\n", + " conda_run_config.environment = automl_run.get_environment()\n", + "except BaseException:\n", + " run_details = automl_run.get_details()\n", + " run_def = run_details.get(\"runDefinition\")\n", + " env = run_def.get(\"environment\")\n", + " if env is None:\n", + " raise\n", + " json.dump(env, open(\"azureml_environment.json\", \"w\"))\n", + " conda_run_config.environment = Environment.load_from_directory(\".\")" ] }, { @@ -909,7 +920,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.7" + "version": "3.8.7" }, "tags": [ "featurization", diff --git a/v1/python-sdk/tutorials/using-pipelines/dataset-and-pipelineparameter.ipynb b/v1/python-sdk/tutorials/using-pipelines/dataset-and-pipelineparameter.ipynb index 2324d2b2f2..4b597f46e5 100644 --- a/v1/python-sdk/tutorials/using-pipelines/dataset-and-pipelineparameter.ipynb +++ b/v1/python-sdk/tutorials/using-pipelines/dataset-and-pipelineparameter.ipynb @@ -125,7 +125,7 @@ "if not found:\n", " print(\"Creating a new compute target...\")\n", " provisioning_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_D2_V2\", # for GPU, use \"STANDARD_NC6\"\n", + " vm_size=\"STANDARD_D2_V2\", # for GPU, use \"STANDARD_NC6s_v3\"\n", " # vm_priority = 'lowpriority', # optional\n", " max_nodes=4,\n", " )\n", diff --git a/v1/python-sdk/tutorials/using-pipelines/image-classification.ipynb b/v1/python-sdk/tutorials/using-pipelines/image-classification.ipynb index 6ed550a349..a05bf30e0a 100644 --- a/v1/python-sdk/tutorials/using-pipelines/image-classification.ipynb +++ b/v1/python-sdk/tutorials/using-pipelines/image-classification.ipynb @@ -152,7 +152,7 @@ "if not found:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", # for GPU, use \"STANDARD_NC6\"\n", + " vm_size=\"STANDARD_NC6s_v3\", # for GPU, use \"STANDARD_NC6s_v3\"\n", " # vm_priority = 'lowpriority', # optional\n", " max_nodes=4,\n", " )\n", diff --git a/v1/python-sdk/tutorials/using-pipelines/publish-and-run-using-rest-endpoint.ipynb b/v1/python-sdk/tutorials/using-pipelines/publish-and-run-using-rest-endpoint.ipynb index 179d36c972..01e4a3b398 100644 --- a/v1/python-sdk/tutorials/using-pipelines/publish-and-run-using-rest-endpoint.ipynb +++ b/v1/python-sdk/tutorials/using-pipelines/publish-and-run-using-rest-endpoint.ipynb @@ -78,7 +78,7 @@ "if not found:\n", " print(\"Creating a new compute target...\")\n", " provisioning_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_D2_V2\", # for GPU, use \"STANDARD_NC6\"\n", + " vm_size=\"STANDARD_D2_V2\", # for GPU, use \"STANDARD_NC6s_v3\"\n", " # vm_priority = 'lowpriority', # optional\n", " max_nodes=4,\n", " )\n", diff --git a/v1/python-sdk/tutorials/using-pipelines/style-transfer-parallel-run.ipynb b/v1/python-sdk/tutorials/using-pipelines/style-transfer-parallel-run.ipynb index 63432e4c7d..4357076e41 100644 --- a/v1/python-sdk/tutorials/using-pipelines/style-transfer-parallel-run.ipynb +++ b/v1/python-sdk/tutorials/using-pipelines/style-transfer-parallel-run.ipynb @@ -255,7 +255,7 @@ "if not found:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", max_nodes=3\n", + " vm_size=\"STANDARD_NC6s_v3\", max_nodes=3\n", " )\n", "\n", " # Create the cluster.\n", @@ -550,7 +550,7 @@ "if not found:\n", " print(\"Creating a new compute target...\")\n", " compute_config = AmlCompute.provisioning_configuration(\n", - " vm_size=\"STANDARD_NC6\", max_nodes=3\n", + " vm_size=\"STANDARD_NC6s_v3\", max_nodes=3\n", " )\n", "\n", " # Create the cluster.\n", diff --git a/v1/python-sdk/workflows/train/pytorch/cifar-distributed/job.py b/v1/python-sdk/workflows/train/pytorch/cifar-distributed/job.py index 0ee0d26e20..6220d1056f 100644 --- a/v1/python-sdk/workflows/train/pytorch/cifar-distributed/job.py +++ b/v1/python-sdk/workflows/train/pytorch/cifar-distributed/job.py @@ -22,7 +22,7 @@ # azure ml settings environment_name = "AzureML-PyTorch-1.6-GPU" # using curated environment experiment_name = "pytorch-cifar10-distributed-example" -compute_name = "gpu-K80-2" +compute_name = "gpu-V100-2" # get environment env = Environment.get(ws, name=environment_name) diff --git a/v1/python-sdk/workflows/train/tensorflow/mnist-distributed-horovod/job.py b/v1/python-sdk/workflows/train/tensorflow/mnist-distributed-horovod/job.py index 5ecbff12b6..0bc0849911 100644 --- a/v1/python-sdk/workflows/train/tensorflow/mnist-distributed-horovod/job.py +++ b/v1/python-sdk/workflows/train/tensorflow/mnist-distributed-horovod/job.py @@ -29,7 +29,7 @@ # azure ml settings environment_name = "tf-gpu-horovod-example" experiment_name = "tf-mnist-distributed-horovod-example" -compute_name = "gpu-K80-2" +compute_name = "gpu-V100-2" # create environment env = Environment.from_conda_specification(environment_name, environment_file) diff --git a/v1/python-sdk/workflows/train/tensorflow/mnist-distributed/job.py b/v1/python-sdk/workflows/train/tensorflow/mnist-distributed/job.py index ffc0e18a69..501033431a 100644 --- a/v1/python-sdk/workflows/train/tensorflow/mnist-distributed/job.py +++ b/v1/python-sdk/workflows/train/tensorflow/mnist-distributed/job.py @@ -28,7 +28,7 @@ # azure ml settings environment_name = "tf-gpu-example" experiment_name = "tf-mnist-distributed-example" -compute_name = "gpu-K80-2" +compute_name = "gpu-V100-2" # create environment env = Environment.from_conda_specification(environment_name, environment_file) diff --git a/v1/python-sdk/workflows/train/transformers/glue/1-aml-finetune-job.py b/v1/python-sdk/workflows/train/transformers/glue/1-aml-finetune-job.py index 9af5dc2f83..dd2f2e46bc 100644 --- a/v1/python-sdk/workflows/train/transformers/glue/1-aml-finetune-job.py +++ b/v1/python-sdk/workflows/train/transformers/glue/1-aml-finetune-job.py @@ -162,7 +162,7 @@ def submit_glue_finetuning_to_aml( ws: Workspace = Workspace.from_config() - target: ComputeTarget = ws.compute_targets["gpu-K80-2"] + target: ComputeTarget = ws.compute_targets["gpu-V100-2"] env: Environment = transformers_environment(use_gpu=True) diff --git a/v1/python-sdk/workflows/train/transformers/glue/2-aml-comparison-of-sku-job.py b/v1/python-sdk/workflows/train/transformers/glue/2-aml-comparison-of-sku-job.py index 2b38af026c..4496375752 100644 --- a/v1/python-sdk/workflows/train/transformers/glue/2-aml-comparison-of-sku-job.py +++ b/v1/python-sdk/workflows/train/transformers/glue/2-aml-comparison-of-sku-job.py @@ -159,7 +159,7 @@ def submit_glue_finetuning_to_aml( runs = [] - target_names = ["gpu-cluster", "gpu-K80-2"] + target_names = ["gpu-cluster", "gpu-V100-2"] for target_name in target_names: target: ComputeTarget = ws.compute_targets[target_name] diff --git a/v1/python-sdk/workflows/train/transformers/glue/3-aml-hyperdrive-job.py b/v1/python-sdk/workflows/train/transformers/glue/3-aml-hyperdrive-job.py index 5b74c08a32..c6d8d0e487 100644 --- a/v1/python-sdk/workflows/train/transformers/glue/3-aml-hyperdrive-job.py +++ b/v1/python-sdk/workflows/train/transformers/glue/3-aml-hyperdrive-job.py @@ -85,7 +85,7 @@ def transformers_environment(use_gpu=True): # get Azure ML resources ws: Workspace = Workspace.from_config() - target: ComputeTarget = ws.compute_targets["gpu-K80-2"] + target: ComputeTarget = ws.compute_targets["gpu-V100-2"] env: Environment = transformers_environment(use_gpu=True) # set up script run configuration diff --git a/v1/scripts/validation/check_notebook_output.py b/v1/scripts/validation/check_notebook_output.py index f591057cca..471580797b 100644 --- a/v1/scripts/validation/check_notebook_output.py +++ b/v1/scripts/validation/check_notebook_output.py @@ -50,13 +50,31 @@ "Check: endpoint", "data_collector is not a known attribute of class", "Readonly attribute primary_metric will be ignored", - "Downloading artifact ", + "Downloading artifact", + "The progress bar can be disabled by setting the environment variable MLFLOW_ENABLE_ARTIFACTS_PROGRESS_BAR", "Warnings:", "Downloading builder script", "Downloading extra modules", "custom base image or base dockerfile detected", "TqdmWarning: IProgress not found.", "from .autonotebook import tqdm as notebook_tqdm", + "Class AutoDeleteSettingSchema: This is an experimental class", + "Class AutoDeleteConditionSchema: This is an experimental class", + "Class BaseAutoDeleteSettingSchema: This is an experimental class", + "Class IntellectualPropertySchema: This is an experimental class", + "Class ProtectionLevelSchema: This is an experimental class", + "Class BaseIntellectualPropertySchema: This is an experimental class", + "Class PipelineComponentBatchDeployment: This is an experimental class", + "Class LinkTabularOutputDatasetConfig: This is an experimental class", + "Field 'max_nodes': This is an experimental field", + "Uploading ", + "Forecasting parameter ", + "Parameter ", + "Get_data scripts will be deprecated", + "cost_mode is an internal parameter", + "save_mlflow is an internal parameter", + "start_auxiliary_runs_before_parent_complete is an internal parameter", + "Detected ", ] with open(full_name, "r") as notebook_file: