From 1db08466bbc549b5a94126615f83e9e680551202 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Mon, 14 Sep 2020 21:20:48 +0800 Subject: [PATCH 01/18] basic scatterplot experiments --- experiments/.gitignore | 2 + experiments/scatter_analysis.ipynb | 1838 ++++++++++++++++++++ experiments/scatter_benchmark.py | 35 + experiments/uncolored_single_scatter.ipynb | 101 ++ experiments/utils.py | 21 + 5 files changed, 1997 insertions(+) create mode 100644 experiments/.gitignore create mode 100644 experiments/scatter_analysis.ipynb create mode 100644 experiments/scatter_benchmark.py create mode 100644 experiments/uncolored_single_scatter.ipynb create mode 100644 experiments/utils.py diff --git a/experiments/.gitignore b/experiments/.gitignore new file mode 100644 index 00000000..0f87c92d --- /dev/null +++ b/experiments/.gitignore @@ -0,0 +1,2 @@ +output.ipynb +*.csv diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb new file mode 100644 index 00000000..5474fd06 --- /dev/null +++ b/experiments/scatter_analysis.ipynb @@ -0,0 +1,1838 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.pylab import plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "execution": { + "iopub.execute_input": "2020-08-27T10:52:25.603235Z", + "iopub.status.busy": "2020-08-27T10:52:25.602652Z", + "iopub.status.idle": "2020-08-27T10:52:25.913845Z", + "shell.execute_reply": "2020-08-27T10:52:25.914159Z" + }, + "papermill": { + "duration": 0.320834, + "end_time": "2020-08-27T10:52:25.914312", + "exception": false, + "start_time": "2020-08-27T10:52:25.593478", + "status": "completed" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import lux" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"experiment_result_metadata_precomputed.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.xlabel('log (number of datapoints)')\n", + "plt.ylabel('log(time) (s)')\n", + "plt.loglog(df[\"nPts\"], df[\"duration\"],'-o')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "plt.xlabel('number of datapoints')\n", + "plt.ylabel('time (s)')\n", + "plt.plot(df[\"nPts\"], df[\"duration\"],'-o')\n", + "plt.xscale('log')\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + }, + "papermill": { + "duration": 1.512982, + "end_time": "2020-08-27T10:52:26.342965", + "environment_variables": {}, + "exception": null, + "input_path": "single_scatter.ipynb", + "output_path": "single_scatter_output.ipynb", + "parameters": {}, + "start_time": "2020-08-27T10:52:24.829983", + "version": "2.1.3" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "4b235f47744442a1a0324dea3f4824c1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e3a5d105e12a4fdcbd53cf0f0ed8bcbf": { + "model_module": "luxWidget", + "model_module_version": "^0.0.1", + "model_name": "ExampleModel", + "state": { + "_dom_classes": [], + "_exportedVisIdxs": {}, + "_model_module": "luxWidget", + "_model_module_version": "^0.0.1", + "_model_name": "ExampleModel", + "_view_count": null, + "_view_module": "luxWidget", + "_view_module_version": "^0.0.1", + "_view_name": "JupyterWidgetView", + "current_vis": { + "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", + "config": { + "axis": { + "labelColor": "#505050", + "labelFont": "Helvetica Neue", + "labelFontSize": 9, + "labelFontWeight": 400, + "titleFont": "Helvetica Neue", + "titleFontSize": 11, + "titleFontWeight": 500 + }, + "legend": { + "labelFont": "Helvetica Neue", + "labelFontSize": 9, + "labelFontWeight": 400, + "titleFont": "Helvetica Neue", + "titleFontSize": 10, + "titleFontWeight": 500 + }, + "mark": { + "tooltip": { + "content": "encoding" + } + }, + "title": { + "font": "Helvetica Neue", + "fontSize": 13, + "fontWeight": 500 + }, + "view": { + "continuousHeight": 300, + "continuousWidth": 400 + } + }, + "data": { + "name": "data-c378346e1f6b80d3c758310fddcd2636" + }, + "datasets": { + "data-c378346e1f6b80d3c758310fddcd2636": [ + { + "Acceleration": 12, + "Horsepower": 130 + }, + { + "Acceleration": 11.5, + "Horsepower": 165 + }, + { + "Acceleration": 11, + "Horsepower": 150 + }, + { + "Acceleration": 12, + "Horsepower": 150 + }, + { + "Acceleration": 10.5, + "Horsepower": 140 + }, + { + "Acceleration": 10, + "Horsepower": 198 + }, + { + "Acceleration": 9, + "Horsepower": 220 + }, + { + "Acceleration": 8.5, + "Horsepower": 215 + }, + { + "Acceleration": 10, + "Horsepower": 225 + }, + { + "Acceleration": 8.5, + "Horsepower": 190 + }, + { + "Acceleration": 10, + "Horsepower": 170 + }, + { + "Acceleration": 8, + "Horsepower": 160 + }, + { + "Acceleration": 9.5, + "Horsepower": 150 + }, + { + "Acceleration": 10, + "Horsepower": 225 + }, + { + "Acceleration": 15, + "Horsepower": 95 + }, + { + "Acceleration": 15.5, + "Horsepower": 95 + }, + { + "Acceleration": 15.5, + "Horsepower": 97 + }, + { + "Acceleration": 16, + "Horsepower": 85 + }, + { + "Acceleration": 14.5, + "Horsepower": 88 + }, + { + "Acceleration": 20.5, + "Horsepower": 46 + }, + { + "Acceleration": 17.5, + "Horsepower": 87 + }, + { + "Acceleration": 14.5, + "Horsepower": 90 + }, + { + "Acceleration": 17.5, + "Horsepower": 95 + }, + { + "Acceleration": 12.5, + "Horsepower": 113 + }, + { + "Acceleration": 15, + "Horsepower": 90 + }, + { + "Acceleration": 14, + "Horsepower": 215 + }, + { + "Acceleration": 15, + "Horsepower": 200 + }, + { + "Acceleration": 13.5, + "Horsepower": 210 + }, + { + "Acceleration": 18.5, + "Horsepower": 193 + }, + { + "Acceleration": 14.5, + "Horsepower": 88 + }, + { + "Acceleration": 15.5, + "Horsepower": 90 + }, + { + "Acceleration": 14, + "Horsepower": 95 + }, + { + "Acceleration": 13, + "Horsepower": 100 + }, + { + "Acceleration": 15.5, + "Horsepower": 105 + }, + { + "Acceleration": 15.5, + "Horsepower": 100 + }, + { + "Acceleration": 15.5, + "Horsepower": 88 + }, + { + "Acceleration": 15.5, + "Horsepower": 100 + }, + { + "Acceleration": 12, + "Horsepower": 165 + }, + { + "Acceleration": 11.5, + "Horsepower": 175 + }, + { + "Acceleration": 13.5, + "Horsepower": 153 + }, + { + "Acceleration": 13, + "Horsepower": 150 + }, + { + "Acceleration": 11.5, + "Horsepower": 180 + }, + { + "Acceleration": 12, + "Horsepower": 170 + }, + { + "Acceleration": 12, + "Horsepower": 175 + }, + { + "Acceleration": 13.5, + "Horsepower": 110 + }, + { + "Acceleration": 19, + "Horsepower": 72 + }, + { + "Acceleration": 15, + "Horsepower": 100 + }, + { + "Acceleration": 14.5, + "Horsepower": 88 + }, + { + "Acceleration": 14, + "Horsepower": 86 + }, + { + "Acceleration": 14, + "Horsepower": 90 + }, + { + "Acceleration": 19.5, + "Horsepower": 70 + }, + { + "Acceleration": 14.5, + "Horsepower": 76 + }, + { + "Acceleration": 19, + "Horsepower": 65 + }, + { + "Acceleration": 18, + "Horsepower": 69 + }, + { + "Acceleration": 19, + "Horsepower": 60 + }, + { + "Acceleration": 20.5, + "Horsepower": 70 + }, + { + "Acceleration": 15.5, + "Horsepower": 95 + }, + { + "Acceleration": 17, + "Horsepower": 80 + }, + { + "Acceleration": 23.5, + "Horsepower": 54 + }, + { + "Acceleration": 19.5, + "Horsepower": 90 + }, + { + "Acceleration": 16.5, + "Horsepower": 86 + }, + { + "Acceleration": 12, + "Horsepower": 165 + }, + { + "Acceleration": 12, + "Horsepower": 175 + }, + { + "Acceleration": 13.5, + "Horsepower": 150 + }, + { + "Acceleration": 13, + "Horsepower": 153 + }, + { + "Acceleration": 11.5, + "Horsepower": 150 + }, + { + "Acceleration": 11, + "Horsepower": 208 + }, + { + "Acceleration": 13.5, + "Horsepower": 155 + }, + { + "Acceleration": 13.5, + "Horsepower": 160 + }, + { + "Acceleration": 12.5, + "Horsepower": 190 + }, + { + "Acceleration": 13.5, + "Horsepower": 97 + }, + { + "Acceleration": 12.5, + "Horsepower": 150 + }, + { + "Acceleration": 14, + "Horsepower": 130 + }, + { + "Acceleration": 16, + "Horsepower": 140 + }, + { + "Acceleration": 14, + "Horsepower": 150 + }, + { + "Acceleration": 14.5, + "Horsepower": 112 + }, + { + "Acceleration": 18, + "Horsepower": 76 + }, + { + "Acceleration": 19.5, + "Horsepower": 87 + }, + { + "Acceleration": 18, + "Horsepower": 69 + }, + { + "Acceleration": 16, + "Horsepower": 86 + }, + { + "Acceleration": 17, + "Horsepower": 92 + }, + { + "Acceleration": 14.5, + "Horsepower": 97 + }, + { + "Acceleration": 15, + "Horsepower": 80 + }, + { + "Acceleration": 16.5, + "Horsepower": 88 + }, + { + "Acceleration": 13, + "Horsepower": 175 + }, + { + "Acceleration": 11.5, + "Horsepower": 150 + }, + { + "Acceleration": 13, + "Horsepower": 145 + }, + { + "Acceleration": 14.5, + "Horsepower": 137 + }, + { + "Acceleration": 12.5, + "Horsepower": 150 + }, + { + "Acceleration": 11.5, + "Horsepower": 198 + }, + { + "Acceleration": 12, + "Horsepower": 150 + }, + { + "Acceleration": 13, + "Horsepower": 158 + }, + { + "Acceleration": 14.5, + "Horsepower": 150 + }, + { + "Acceleration": 11, + "Horsepower": 215 + }, + { + "Acceleration": 11, + "Horsepower": 225 + }, + { + "Acceleration": 11, + "Horsepower": 175 + }, + { + "Acceleration": 16.5, + "Horsepower": 105 + }, + { + "Acceleration": 18, + "Horsepower": 100 + }, + { + "Acceleration": 16, + "Horsepower": 100 + }, + { + "Acceleration": 16.5, + "Horsepower": 88 + }, + { + "Acceleration": 16, + "Horsepower": 95 + }, + { + "Acceleration": 21, + "Horsepower": 46 + }, + { + "Acceleration": 14, + "Horsepower": 150 + }, + { + "Acceleration": 12.5, + "Horsepower": 167 + }, + { + "Acceleration": 13, + "Horsepower": 170 + }, + { + "Acceleration": 12.5, + "Horsepower": 180 + }, + { + "Acceleration": 15, + "Horsepower": 100 + }, + { + "Acceleration": 19, + "Horsepower": 88 + }, + { + "Acceleration": 19.5, + "Horsepower": 72 + }, + { + "Acceleration": 16.5, + "Horsepower": 94 + }, + { + "Acceleration": 13.5, + "Horsepower": 90 + }, + { + "Acceleration": 18.5, + "Horsepower": 85 + }, + { + "Acceleration": 14, + "Horsepower": 107 + }, + { + "Acceleration": 15.5, + "Horsepower": 90 + }, + { + "Acceleration": 13, + "Horsepower": 145 + }, + { + "Acceleration": 9.5, + "Horsepower": 230 + }, + { + "Acceleration": 19.5, + "Horsepower": 49 + }, + { + "Acceleration": 15.5, + "Horsepower": 75 + }, + { + "Acceleration": 14, + "Horsepower": 91 + }, + { + "Acceleration": 15.5, + "Horsepower": 112 + }, + { + "Acceleration": 11, + "Horsepower": 150 + }, + { + "Acceleration": 14, + "Horsepower": 110 + }, + { + "Acceleration": 13.5, + "Horsepower": 122 + }, + { + "Acceleration": 11, + "Horsepower": 180 + }, + { + "Acceleration": 16.5, + "Horsepower": 95 + }, + { + "Acceleration": 16, + "Horsepower": 100 + }, + { + "Acceleration": 17, + "Horsepower": 100 + }, + { + "Acceleration": 19, + "Horsepower": 67 + }, + { + "Acceleration": 16.5, + "Horsepower": 80 + }, + { + "Acceleration": 21, + "Horsepower": 65 + }, + { + "Acceleration": 17, + "Horsepower": 75 + }, + { + "Acceleration": 17, + "Horsepower": 100 + }, + { + "Acceleration": 18, + "Horsepower": 110 + }, + { + "Acceleration": 16.5, + "Horsepower": 105 + }, + { + "Acceleration": 14, + "Horsepower": 140 + }, + { + "Acceleration": 14.5, + "Horsepower": 150 + }, + { + "Acceleration": 13.5, + "Horsepower": 150 + }, + { + "Acceleration": 16, + "Horsepower": 140 + }, + { + "Acceleration": 15.5, + "Horsepower": 150 + }, + { + "Acceleration": 16.5, + "Horsepower": 83 + }, + { + "Acceleration": 15.5, + "Horsepower": 67 + }, + { + "Acceleration": 14.5, + "Horsepower": 78 + }, + { + "Acceleration": 16.5, + "Horsepower": 52 + }, + { + "Acceleration": 19, + "Horsepower": 61 + }, + { + "Acceleration": 14.5, + "Horsepower": 75 + }, + { + "Acceleration": 15.5, + "Horsepower": 75 + }, + { + "Acceleration": 14, + "Horsepower": 75 + }, + { + "Acceleration": 15, + "Horsepower": 97 + }, + { + "Acceleration": 15.5, + "Horsepower": 93 + }, + { + "Acceleration": 16, + "Horsepower": 67 + }, + { + "Acceleration": 16, + "Horsepower": 95 + }, + { + "Acceleration": 16, + "Horsepower": 105 + }, + { + "Acceleration": 21, + "Horsepower": 72 + }, + { + "Acceleration": 19.5, + "Horsepower": 72 + }, + { + "Acceleration": 11.5, + "Horsepower": 170 + }, + { + "Acceleration": 14, + "Horsepower": 145 + }, + { + "Acceleration": 14.5, + "Horsepower": 150 + }, + { + "Acceleration": 13.5, + "Horsepower": 148 + }, + { + "Acceleration": 21, + "Horsepower": 110 + }, + { + "Acceleration": 18.5, + "Horsepower": 105 + }, + { + "Acceleration": 19, + "Horsepower": 110 + }, + { + "Acceleration": 19, + "Horsepower": 95 + }, + { + "Acceleration": 15, + "Horsepower": 110 + }, + { + "Acceleration": 13.5, + "Horsepower": 110 + }, + { + "Acceleration": 12, + "Horsepower": 129 + }, + { + "Acceleration": 16, + "Horsepower": 75 + }, + { + "Acceleration": 17, + "Horsepower": 83 + }, + { + "Acceleration": 16, + "Horsepower": 100 + }, + { + "Acceleration": 18.5, + "Horsepower": 78 + }, + { + "Acceleration": 13.5, + "Horsepower": 96 + }, + { + "Acceleration": 16.5, + "Horsepower": 71 + }, + { + "Acceleration": 17, + "Horsepower": 97 + }, + { + "Acceleration": 14.5, + "Horsepower": 97 + }, + { + "Acceleration": 14, + "Horsepower": 70 + }, + { + "Acceleration": 17, + "Horsepower": 90 + }, + { + "Acceleration": 15, + "Horsepower": 95 + }, + { + "Acceleration": 17, + "Horsepower": 88 + }, + { + "Acceleration": 14.5, + "Horsepower": 98 + }, + { + "Acceleration": 13.5, + "Horsepower": 115 + }, + { + "Acceleration": 17.5, + "Horsepower": 53 + }, + { + "Acceleration": 15.5, + "Horsepower": 86 + }, + { + "Acceleration": 16.9, + "Horsepower": 81 + }, + { + "Acceleration": 14.9, + "Horsepower": 92 + }, + { + "Acceleration": 17.7, + "Horsepower": 79 + }, + { + "Acceleration": 15.3, + "Horsepower": 83 + }, + { + "Acceleration": 13, + "Horsepower": 140 + }, + { + "Acceleration": 13, + "Horsepower": 150 + }, + { + "Acceleration": 13.9, + "Horsepower": 120 + }, + { + "Acceleration": 12.8, + "Horsepower": 152 + }, + { + "Acceleration": 15.4, + "Horsepower": 100 + }, + { + "Acceleration": 14.5, + "Horsepower": 105 + }, + { + "Acceleration": 17.6, + "Horsepower": 81 + }, + { + "Acceleration": 17.6, + "Horsepower": 90 + }, + { + "Acceleration": 22.2, + "Horsepower": 52 + }, + { + "Acceleration": 22.1, + "Horsepower": 60 + }, + { + "Acceleration": 14.2, + "Horsepower": 70 + }, + { + "Acceleration": 17.4, + "Horsepower": 53 + }, + { + "Acceleration": 17.7, + "Horsepower": 100 + }, + { + "Acceleration": 21, + "Horsepower": 78 + }, + { + "Acceleration": 16.2, + "Horsepower": 110 + }, + { + "Acceleration": 17.8, + "Horsepower": 95 + }, + { + "Acceleration": 12.2, + "Horsepower": 71 + }, + { + "Acceleration": 17, + "Horsepower": 70 + }, + { + "Acceleration": 16.4, + "Horsepower": 75 + }, + { + "Acceleration": 13.6, + "Horsepower": 72 + }, + { + "Acceleration": 15.7, + "Horsepower": 102 + }, + { + "Acceleration": 13.2, + "Horsepower": 150 + }, + { + "Acceleration": 21.9, + "Horsepower": 88 + }, + { + "Acceleration": 15.5, + "Horsepower": 108 + }, + { + "Acceleration": 16.7, + "Horsepower": 120 + }, + { + "Acceleration": 12.1, + "Horsepower": 180 + }, + { + "Acceleration": 12, + "Horsepower": 145 + }, + { + "Acceleration": 15, + "Horsepower": 130 + }, + { + "Acceleration": 14, + "Horsepower": 150 + }, + { + "Acceleration": 18.5, + "Horsepower": 68 + }, + { + "Acceleration": 14.8, + "Horsepower": 80 + }, + { + "Acceleration": 18.6, + "Horsepower": 58 + }, + { + "Acceleration": 15.5, + "Horsepower": 96 + }, + { + "Acceleration": 16.8, + "Horsepower": 70 + }, + { + "Acceleration": 12.5, + "Horsepower": 145 + }, + { + "Acceleration": 19, + "Horsepower": 110 + }, + { + "Acceleration": 13.7, + "Horsepower": 145 + }, + { + "Acceleration": 14.9, + "Horsepower": 130 + }, + { + "Acceleration": 16.4, + "Horsepower": 110 + }, + { + "Acceleration": 16.9, + "Horsepower": 105 + }, + { + "Acceleration": 17.7, + "Horsepower": 100 + }, + { + "Acceleration": 19, + "Horsepower": 98 + }, + { + "Acceleration": 11.1, + "Horsepower": 180 + }, + { + "Acceleration": 11.4, + "Horsepower": 170 + }, + { + "Acceleration": 12.2, + "Horsepower": 190 + }, + { + "Acceleration": 14.5, + "Horsepower": 149 + }, + { + "Acceleration": 14.5, + "Horsepower": 78 + }, + { + "Acceleration": 16, + "Horsepower": 88 + }, + { + "Acceleration": 18.2, + "Horsepower": 75 + }, + { + "Acceleration": 15.8, + "Horsepower": 89 + }, + { + "Acceleration": 17, + "Horsepower": 63 + }, + { + "Acceleration": 15.9, + "Horsepower": 83 + }, + { + "Acceleration": 16.4, + "Horsepower": 67 + }, + { + "Acceleration": 14.1, + "Horsepower": 78 + }, + { + "Acceleration": 14.5, + "Horsepower": 97 + }, + { + "Acceleration": 12.8, + "Horsepower": 110 + }, + { + "Acceleration": 13.5, + "Horsepower": 110 + }, + { + "Acceleration": 21.5, + "Horsepower": 48 + }, + { + "Acceleration": 14.4, + "Horsepower": 66 + }, + { + "Acceleration": 19.4, + "Horsepower": 52 + }, + { + "Acceleration": 18.6, + "Horsepower": 70 + }, + { + "Acceleration": 16.4, + "Horsepower": 60 + }, + { + "Acceleration": 15.5, + "Horsepower": 110 + }, + { + "Acceleration": 13.2, + "Horsepower": 140 + }, + { + "Acceleration": 12.8, + "Horsepower": 139 + }, + { + "Acceleration": 19.2, + "Horsepower": 105 + }, + { + "Acceleration": 18.2, + "Horsepower": 95 + }, + { + "Acceleration": 15.8, + "Horsepower": 85 + }, + { + "Acceleration": 15.4, + "Horsepower": 88 + }, + { + "Acceleration": 17.2, + "Horsepower": 100 + }, + { + "Acceleration": 17.2, + "Horsepower": 90 + }, + { + "Acceleration": 15.8, + "Horsepower": 105 + }, + { + "Acceleration": 16.7, + "Horsepower": 85 + }, + { + "Acceleration": 18.7, + "Horsepower": 110 + }, + { + "Acceleration": 15.1, + "Horsepower": 120 + }, + { + "Acceleration": 13.2, + "Horsepower": 145 + }, + { + "Acceleration": 13.4, + "Horsepower": 165 + }, + { + "Acceleration": 11.2, + "Horsepower": 139 + }, + { + "Acceleration": 13.7, + "Horsepower": 140 + }, + { + "Acceleration": 16.5, + "Horsepower": 68 + }, + { + "Acceleration": 14.2, + "Horsepower": 95 + }, + { + "Acceleration": 14.7, + "Horsepower": 97 + }, + { + "Acceleration": 14.5, + "Horsepower": 75 + }, + { + "Acceleration": 14.8, + "Horsepower": 95 + }, + { + "Acceleration": 16.7, + "Horsepower": 105 + }, + { + "Acceleration": 17.6, + "Horsepower": 85 + }, + { + "Acceleration": 14.9, + "Horsepower": 97 + }, + { + "Acceleration": 15.9, + "Horsepower": 103 + }, + { + "Acceleration": 13.6, + "Horsepower": 125 + }, + { + "Acceleration": 15.7, + "Horsepower": 115 + }, + { + "Acceleration": 15.8, + "Horsepower": 133 + }, + { + "Acceleration": 14.9, + "Horsepower": 71 + }, + { + "Acceleration": 16.6, + "Horsepower": 68 + }, + { + "Acceleration": 15.4, + "Horsepower": 115 + }, + { + "Acceleration": 18.2, + "Horsepower": 85 + }, + { + "Acceleration": 17.3, + "Horsepower": 88 + }, + { + "Acceleration": 18.2, + "Horsepower": 90 + }, + { + "Acceleration": 16.6, + "Horsepower": 110 + }, + { + "Acceleration": 15.4, + "Horsepower": 130 + }, + { + "Acceleration": 13.4, + "Horsepower": 129 + }, + { + "Acceleration": 13.2, + "Horsepower": 138 + }, + { + "Acceleration": 15.2, + "Horsepower": 135 + }, + { + "Acceleration": 14.9, + "Horsepower": 155 + }, + { + "Acceleration": 14.3, + "Horsepower": 142 + }, + { + "Acceleration": 15, + "Horsepower": 125 + }, + { + "Acceleration": 13, + "Horsepower": 150 + }, + { + "Acceleration": 14, + "Horsepower": 71 + }, + { + "Acceleration": 15.2, + "Horsepower": 65 + }, + { + "Acceleration": 14.4, + "Horsepower": 80 + }, + { + "Acceleration": 15, + "Horsepower": 80 + }, + { + "Acceleration": 20.1, + "Horsepower": 77 + }, + { + "Acceleration": 17.4, + "Horsepower": 125 + }, + { + "Acceleration": 24.8, + "Horsepower": 71 + }, + { + "Acceleration": 22.2, + "Horsepower": 90 + }, + { + "Acceleration": 13.2, + "Horsepower": 70 + }, + { + "Acceleration": 14.9, + "Horsepower": 70 + }, + { + "Acceleration": 19.2, + "Horsepower": 65 + }, + { + "Acceleration": 14.7, + "Horsepower": 69 + }, + { + "Acceleration": 16, + "Horsepower": 90 + }, + { + "Acceleration": 11.3, + "Horsepower": 115 + }, + { + "Acceleration": 12.9, + "Horsepower": 115 + }, + { + "Acceleration": 13.2, + "Horsepower": 90 + }, + { + "Acceleration": 14.7, + "Horsepower": 76 + }, + { + "Acceleration": 18.8, + "Horsepower": 60 + }, + { + "Acceleration": 15.5, + "Horsepower": 70 + }, + { + "Acceleration": 16.4, + "Horsepower": 65 + }, + { + "Acceleration": 16.5, + "Horsepower": 90 + }, + { + "Acceleration": 18.1, + "Horsepower": 88 + }, + { + "Acceleration": 20.1, + "Horsepower": 90 + }, + { + "Acceleration": 18.7, + "Horsepower": 90 + }, + { + "Acceleration": 15.8, + "Horsepower": 78 + }, + { + "Acceleration": 15.5, + "Horsepower": 90 + }, + { + "Acceleration": 17.5, + "Horsepower": 75 + }, + { + "Acceleration": 15, + "Horsepower": 92 + }, + { + "Acceleration": 15.2, + "Horsepower": 75 + }, + { + "Acceleration": 17.9, + "Horsepower": 65 + }, + { + "Acceleration": 14.4, + "Horsepower": 105 + }, + { + "Acceleration": 19.2, + "Horsepower": 65 + }, + { + "Acceleration": 21.7, + "Horsepower": 48 + }, + { + "Acceleration": 23.7, + "Horsepower": 48 + }, + { + "Acceleration": 19.9, + "Horsepower": 67 + }, + { + "Acceleration": 21.8, + "Horsepower": 67 + }, + { + "Acceleration": 13.8, + "Horsepower": 67 + }, + { + "Acceleration": 18, + "Horsepower": 67 + }, + { + "Acceleration": 15.3, + "Horsepower": 62 + }, + { + "Acceleration": 11.4, + "Horsepower": 132 + }, + { + "Acceleration": 12.5, + "Horsepower": 100 + }, + { + "Acceleration": 15.1, + "Horsepower": 88 + }, + { + "Acceleration": 17, + "Horsepower": 72 + }, + { + "Acceleration": 15.7, + "Horsepower": 84 + }, + { + "Acceleration": 16.4, + "Horsepower": 84 + }, + { + "Acceleration": 14.4, + "Horsepower": 92 + }, + { + "Acceleration": 12.6, + "Horsepower": 110 + }, + { + "Acceleration": 12.9, + "Horsepower": 84 + }, + { + "Acceleration": 16.9, + "Horsepower": 58 + }, + { + "Acceleration": 16.4, + "Horsepower": 64 + }, + { + "Acceleration": 16.1, + "Horsepower": 60 + }, + { + "Acceleration": 17.8, + "Horsepower": 67 + }, + { + "Acceleration": 19.4, + "Horsepower": 65 + }, + { + "Acceleration": 17.3, + "Horsepower": 62 + }, + { + "Acceleration": 16, + "Horsepower": 68 + }, + { + "Acceleration": 14.9, + "Horsepower": 63 + }, + { + "Acceleration": 16.2, + "Horsepower": 65 + }, + { + "Acceleration": 20.7, + "Horsepower": 65 + }, + { + "Acceleration": 14.2, + "Horsepower": 74 + }, + { + "Acceleration": 14.4, + "Horsepower": 75 + }, + { + "Acceleration": 16.8, + "Horsepower": 75 + }, + { + "Acceleration": 14.8, + "Horsepower": 100 + }, + { + "Acceleration": 18.3, + "Horsepower": 74 + }, + { + "Acceleration": 20.4, + "Horsepower": 80 + }, + { + "Acceleration": 19.6, + "Horsepower": 76 + }, + { + "Acceleration": 12.6, + "Horsepower": 116 + }, + { + "Acceleration": 13.8, + "Horsepower": 120 + }, + { + "Acceleration": 15.8, + "Horsepower": 110 + }, + { + "Acceleration": 19, + "Horsepower": 105 + }, + { + "Acceleration": 17.1, + "Horsepower": 88 + }, + { + "Acceleration": 16.6, + "Horsepower": 85 + }, + { + "Acceleration": 19.6, + "Horsepower": 88 + }, + { + "Acceleration": 18.6, + "Horsepower": 88 + }, + { + "Acceleration": 18, + "Horsepower": 88 + }, + { + "Acceleration": 16.2, + "Horsepower": 85 + }, + { + "Acceleration": 16, + "Horsepower": 84 + }, + { + "Acceleration": 18, + "Horsepower": 90 + }, + { + "Acceleration": 16.4, + "Horsepower": 92 + }, + { + "Acceleration": 15.3, + "Horsepower": 74 + }, + { + "Acceleration": 18.2, + "Horsepower": 68 + }, + { + "Acceleration": 17.6, + "Horsepower": 68 + }, + { + "Acceleration": 14.7, + "Horsepower": 63 + }, + { + "Acceleration": 17.3, + "Horsepower": 70 + }, + { + "Acceleration": 14.5, + "Horsepower": 88 + }, + { + "Acceleration": 14.5, + "Horsepower": 75 + }, + { + "Acceleration": 16.9, + "Horsepower": 70 + }, + { + "Acceleration": 15, + "Horsepower": 67 + }, + { + "Acceleration": 15.7, + "Horsepower": 67 + }, + { + "Acceleration": 16.2, + "Horsepower": 67 + }, + { + "Acceleration": 16.4, + "Horsepower": 110 + }, + { + "Acceleration": 17, + "Horsepower": 85 + }, + { + "Acceleration": 14.5, + "Horsepower": 92 + }, + { + "Acceleration": 14.7, + "Horsepower": 112 + }, + { + "Acceleration": 13.9, + "Horsepower": 96 + }, + { + "Acceleration": 13, + "Horsepower": 84 + }, + { + "Acceleration": 17.3, + "Horsepower": 90 + }, + { + "Acceleration": 15.6, + "Horsepower": 86 + }, + { + "Acceleration": 24.6, + "Horsepower": 52 + }, + { + "Acceleration": 11.6, + "Horsepower": 84 + }, + { + "Acceleration": 18.6, + "Horsepower": 79 + }, + { + "Acceleration": 19.4, + "Horsepower": 82 + } + ] + }, + "encoding": { + "x": { + "field": "Horsepower", + "scale": { + "domain": [ + 46, + 230 + ] + }, + "type": "quantitative" + }, + "y": { + "field": "Acceleration", + "scale": { + "domain": [ + 8, + 24.8 + ] + }, + "type": "quantitative" + } + }, + "height": 150, + "mark": "circle", + "selection": { + "selector001": { + "bind": "scales", + "encodings": [ + "x", + "y" + ], + "type": "interval" + } + }, + "width": 160 + }, + "data": [], + "intent": "", + "layout": "IPY_MODEL_4b235f47744442a1a0324dea3f4824c1", + "recommendations": [] + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/scatter_benchmark.py b/experiments/scatter_benchmark.py new file mode 100644 index 00000000..9b3454ee --- /dev/null +++ b/experiments/scatter_benchmark.py @@ -0,0 +1,35 @@ +import papermill as pm +import pandas as pd +import numpy as np +import json +# trial_range = np.geomspace(10, 1e3, num=3) +trial_range = np.geomspace(10, 1e8, num=8) +trial = [] #[cell count, duration] +for nPts in trial_range: + # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" + output_filename = "output.ipynb" + pm.execute_notebook( + 'uncolored_single_scatter.ipynb', + output_filename, + parameters = dict(numPoints=nPts) + ) + count = 0 + with open(output_filename) as json_file: + data = json.load(json_file) + for cell in data['cells']: + if "outputs" in cell and len(cell["outputs"]) > 0: + if cell["outputs"][0]["output_type"] == "display_data": + count += 1 + duration = cell["metadata"]["papermill"]["duration"] + trial.append([nPts,duration]) + print (nPts,duration) + +trial_df = pd.DataFrame(trial,columns=["nPts","duration"]) +trial_df.to_csv("experiment_result_metadata_precomputed.csv",index=None) +# print (trial_df) +# import matplotlib.pyplot as plt +# plt.xlabel('cell execution count') +# plt.ylabel('time (s)') +# plt.plot(trial_df["cell_count"], trial_df["duration"]) +# plt.show() + diff --git a/experiments/uncolored_single_scatter.ipynb b/experiments/uncolored_single_scatter.ipynb new file mode 100644 index 00000000..fe0365c7 --- /dev/null +++ b/experiments/uncolored_single_scatter.ipynb @@ -0,0 +1,101 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=100" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print (numPoints)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import lux\n", + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df.maintain_metadata()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from lux.vis.Vis import Vis" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Vis([\"x\",\"y\"],df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/utils.py b/experiments/utils.py new file mode 100644 index 00000000..6dc650ff --- /dev/null +++ b/experiments/utils.py @@ -0,0 +1,21 @@ +def generate_scatter_data(numPoints): + # Example from https://datashader.org/user_guide/Points.html + import pandas as pd + import numpy as np + from collections import OrderedDict as odict + numPoints = int(numPoints) + np.random.seed(1) + + dists = {cat: pd.DataFrame(odict([('x',np.random.normal(x,s,numPoints)), + ('y',np.random.normal(y,s,numPoints)), + ('val',val), + ('cat',cat)])) + for x, y, s, val, cat in + [( 2, 2, 0.03, 10, "d1"), + ( 2, -2, 0.10, 20, "d2"), + ( -2, -2, 0.50, 30, "d3"), + ( -2, 2, 1.00, 40, "d4"), + ( 0, 0, 3.00, 50, "d5")] } + + df = pd.concat(dists,ignore_index=True) + return df \ No newline at end of file From 4e8d9e7191e8af568089d55244a42c2403260e41 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Wed, 23 Sep 2020 21:26:15 +0800 Subject: [PATCH 02/18] experiment results with manually binned heatmaps --- experiments/basic_scatter.ipynb | 160 ++++++++++++++++++++++++++ experiments/heatmap.ipynb | 163 +++++++++++++++++++++++++++ experiments/manual_heatmap.ipynb | 173 +++++++++++++++++++++++++++++ experiments/sampled_scatter.ipynb | 163 +++++++++++++++++++++++++++ experiments/scatter_analysis.ipynb | 146 +++++++++++++++++++++--- experiments/scatter_benchmark.py | 61 +++++----- 6 files changed, 821 insertions(+), 45 deletions(-) create mode 100644 experiments/basic_scatter.ipynb create mode 100644 experiments/heatmap.ipynb create mode 100644 experiments/manual_heatmap.ipynb create mode 100644 experiments/sampled_scatter.ipynb diff --git a/experiments/basic_scatter.ipynb b/experiments/basic_scatter.ipynb new file mode 100644 index 00000000..71b11e02 --- /dev/null +++ b/experiments/basic_scatter.ipynb @@ -0,0 +1,160 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=10000" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import lux\n", + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "import altair as alt\n", + "\n", + "chart = alt.Chart(df).mark_circle().encode(\n", + " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", + " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/heatmap.ipynb b/experiments/heatmap.ipynb new file mode 100644 index 00000000..e5e41667 --- /dev/null +++ b/experiments/heatmap.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=1000" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "import lux\n", + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "import altair as alt\n", + "\n", + "chart = alt.Chart(df).mark_rect().encode(\n", + " x=alt.X('x', bin=alt.Bin(maxbins=50), scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", + " y=alt.Y('y', bin=alt.Bin(maxbins=50), scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative'),\n", + " color = alt.Color('count():Q', scale=alt.Scale(scheme='blues',type=\"log\"))\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/manual_heatmap.ipynb b/experiments/manual_heatmap.ipynb new file mode 100644 index 00000000..e7507560 --- /dev/null +++ b/experiments/manual_heatmap.ipynb @@ -0,0 +1,173 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=1000" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost\n", + "import pandas as pd\n", + "df[\"xBin\"] = pd.cut(df.x, bins=50)\n", + "df[\"xBinCtr\"] = df[\"xBin\"].apply(lambda x: x.mid)\n", + "df[\"yBin\"] = pd.cut(df.y, bins=50)\n", + "df[\"yBinCtr\"] = df[\"yBin\"].apply(lambda x: x.mid)\n", + "\n", + "groups = df.groupby(['xBinCtr','yBinCtr'])[\"x\"]\n", + "# groups = df.groupby(['xBin','yBin'])[\"x\"]\n", + "result = groups.agg(\"count\").reset_index()\n", + "result = result.rename(columns={\"x\":\"z\"})\n", + "\n", + "no0result = result[result[\"z\"]!=0]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "import altair as alt\n", + "chart = alt.Chart(no0result).mark_rect().encode(\n", + " x=alt.X('xBinCtr', type='ordinal'),\n", + " y=alt.Y('yBinCtr', type='ordinal'),\n", + " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"))\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/sampled_scatter.ipynb b/experiments/sampled_scatter.ipynb new file mode 100644 index 00000000..f52fa49f --- /dev/null +++ b/experiments/sampled_scatter.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=10000" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "import lux\n", + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost\n", + "if (numPoints>10000):\n", + " df = df.sample(n = 10000, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "\n", + "import altair as alt\n", + "\n", + "chart = alt.Chart(df).mark_circle().encode(\n", + " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", + " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb index 5474fd06..06a55ace 100644 --- a/experiments/scatter_analysis.ipynb +++ b/experiments/scatter_analysis.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -11,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2020-08-27T10:52:25.603235Z", @@ -36,37 +36,151 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ - "df = pd.read_csv(\"experiment_result_metadata_precomputed.csv\")" + "df = pd.read_csv(\"basic_scatter.csv\")\n", + "df2 = pd.read_csv(\"heatmap.csv\")\n", + "df3 = pd.read_csv(\"sampled_scatter.csv\")\n", + "df4 = pd.read_csv(\"manual_heatmap.csv\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "metadata": {}, "outputs": [], "source": [ - "plt.xlabel('log (number of datapoints)')\n", - "plt.ylabel('log(time) (s)')\n", - "plt.loglog(df[\"nPts\"], df[\"duration\"],'-o')\n", - "plt.show()" + "def plot_loglog(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('log (number of datapoints)')\n", + " plt.ylabel('log(time) (s)')\n", + "# plt.loglog(df[\"nPts\"], df[\"pandas cost\"],'-o',label=label,color=color)\n", + "# plt.loglog(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", + " df[\"total\"] = df[\"pandas cost\"]+df[\"altair cost\"]\n", + " plt.loglog(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "metadata": {}, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", - "plt.xlabel('number of datapoints')\n", - "plt.ylabel('time (s)')\n", - "plt.plot(df[\"nPts\"], df[\"duration\"],'-o')\n", - "plt.xscale('log')\n", - "plt.show()\n" + "def plot_logx(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('number of datapoints')\n", + " plt.ylabel('time (s)')\n", + "# plt.plot(df[\"nPts\"], df[\"pandas cost\"],'-o',label=label,color=color)\n", + "# plt.plot(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", + " df[\"total\"] = df[\"pandas cost\"]+df[\"altair cost\"]\n", + " plt.plot(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)\n", + " plt.xscale('log')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loglog(df,\"basic scatter\",\"red\")\n", + "plot_loglog(df3,\"sampled scatter\",\"blue\")\n", + "plot_loglog(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "plot_loglog(df4,\"heatmap (bin via Pandas)\",\"orange\")\n", + "plt.axvline(x= 3100,linestyle=':',color=\"grey\")\n", + "plt.legend()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOzdd3xN9//A8dcnQwgSQWwSs0YWgtojlNorhKCqNVpKq6Va/bXaosP323SiqX7NUKu2UjRWtSr2qBUSYkQSBFmS3M/vj5NEIjvuzcn4PB+P+7i559x7zjvrvu9nnPdHSClRFEVRlMyY6R2AoiiKUrCpRKEoiqJkSSUKRVEUJUsqUSiKoihZUolCURRFyZJKFIqiKEqWLPQOwBQqVqwoHR0d9Q5DUQq8xMREAMzNzXWORNHb0aNHw6WU9hntK5KJwtHRkYCAAL3DUJQCb8mSJQCMHj1a1zgU/QkhgjPbV6QShRCiD9CnXr16eoeiKIVChw4d9A5BKQREUbwy293dXaoWhaIoSs4JIY5KKd0z2qcGsxWlGLt37x737t3TOwylgCtSXU9ZiY+PJyQkhNjYWL1DUYqxkiVLUqNGDSwtLfUOBYBNmzYBaoxCyVqxSRQhISGULVsWR0dHhBB6h6MUQ1JKIiIiCAkJoXbt2nqHA0CnTp30DkExBj8/mDkTrl2DWrVgzhzw9jba4YtNooiNjVVJQtGVEIIKFSoQFhamdygp1DTyIsDPD8aNg+ho7XFwsPYYjJYsitUYhUoSit4K2t9geHg44eHheoehPIuZM/GrG43jm2D2ETi+CX51o7UWhpEUq0Shp6CgIJycnJ75OJs3b+bzzz83QkQ5c//+febPn5/yOCgoiJUrV+bb+RXT2rp1K1u3btU7DOUZ+NkEM64PBJcDKbT7cX207caiEkVm/PzA0RHMzLR7Pz+9IwKgb9++zJgxI9/OZ4xEkZCQYOywFCPx8PDAw8ND7zCUZzCzuznRJdJuiy6hbTeWIpUohBB9hBC+kZGRz3ag5D6/4GCQ8kmf3zMmi4SEBLy9vWnUqBGDBw8mOqlP8ZNPPqFFixY4OTkxbtw4kq9t+fbbb2ncuDEuLi54eXkB2pW0kyZNAiA0NJQBAwbg6uqKq6srhw4dSnO+xMRERo8ejZOTE87Ozvj4+ABw+fJlunbtiqurK82aNSMwMJBHjx7h4eFBs2bNcHZ2TpkNM2PGDAIDA3Fzc2PatGnMmDGDAwcO4Obmho+PD4mJiUybNo0WLVrg4uLCjz/+CMDevXtp3749ffv2pXHjxs/0c1NMp2bNmtSsWVPvMJRncK10Ysbby2S8PU+klEXu1rx5c/m0c+fOPXkwZYqUHTtmfrOyklJLEWlvVlaZv2bKlHTnTO3q1asSkAcPHpRSSvnyyy/LefPmSSmljIiISHneiBEj5ObNm6WUUlatWlXGxsZKKaW8d++elFLKxYsXy4kTJ0oppRwyZIj08fGRUkqZkJAg79+/n+acAQEBsmvXrimPk4/RsmVL+euvv0oppYyJiZFRUVEyPj5eRkZGSimlDAsLk3Xr1pUGg0FevXpVNmnSJOUY/v7+slevXimPf/zxR/npp59KKaWMjY2VzZs3l1euXJH+/v7S2tpaXrlyJcufS3GU5m9RZ6GhoTI0NFTvMJS8unRJ1poqJLNId3PwccjVoYAAmcl7apFqURhNXFzutudQzZo1adu2LQAjRozg4MGDAPj7+9OqVSucnZ35448/OHv2LAAuLi54e3uzYsUKLCzST1D7448/eO211wCtqJutrW2a/XXq1OHKlSu88cYb7NixAxsbGx4+fMiNGzcYMGAAoM3rt7a2RkrJ+++/j4uLC127duXGjRuEhoZm+z39/vvvLFu2DDc3N1q1akVERASXLl0CoGXLlgVmGqiSse3bt7N9+3a9w1DyIjoaBg2iY0j69wZrS2vmeMwx2qmKzfTYNL7+Ouv9jo5ad9PTHBxg7948n/bpGS9CCGJjY3n99dcJCAigZs2azJo1K+WiwG3btrF//362bNnCnDlzOH36dK7OZ2dnx8mTJ9m5cycLFy5kzZo1fPPNNxk+18/Pj7CwMI4ePYqlpSWOjo45ujhRSsl3331H9+7d02zfu3cvpUuXzlW8Sv7r1q2b3iEoeSEljB/P4bun+KWJBU0rNyUiJoLrkdepZVuLOR5z8HY23nUUqkWRkTlzwNo67TZra237M7h27Rp//fUXACtXrqRdu3Ypb8YVK1bk0aNHrFu3DgCDwcD169fp3LkzX3zxBZGRkTx69CjN8Tw8PFiwYAGgjUc8PTYTHh6OwWBg0KBBzJ49m2PHjlG2bFlq1KjBxo0bAYiLiyM6OprIyEgqVaqEpaUl/v7+BCclyrJly/Lw4cOUYz79uHv37ixYsID4+HgALl68SFRU1DP9nJT8U716dapXr653GEpuLVjA3fUrGPKqLdVta7Bn1B6C3wzG8JGBoDeDjJokQCWKjHl7g6+v1oIQQrv39X3mi1eee+45fvjhBxo1asS9e/d47bXXKFeuHGPHjsXJyYnu3bvTokULQHvjHzFiBM7OzjRt2pTJkydTrly5NMf75ptv8Pf3x9nZmebNm3Pu3Lk0+2/cuEGnTp1wc3NjxIgRfPbZZwAsX76cb7/9FhcXF9q0acPt27fx9vYmICAAZ2dnli1bRsOGDQGoUKECbdu2xcnJiWnTpuHi4oK5uTmurq74+Pjw6quv0rhxY5o1a4aTkxPjx49Xs5wKkdu3b3P79m29w1By46+/MLw5hZfGVeKWWTRrBq/BrpSdSU9ZbKrH/vvvvzRq1EiniBTliYL0t6jWoyhkQkOhWTO+bB7Lu83v8t2L3zGp5SSjHDqr6rHFc4xCURQAevTooXcISk4lJICXF/tLh/O+eyKejTyZ2GJivpxaJQpFKcaqVKmidwhKTr33HneO7MVrRjnq2NqzqO+ifCsJo8YoFKUYu3HjBjdu3NA7DCU769aR+N//4D2lBvdELGs912JjZZNvp1eJQlGKsV27drFr1y69w1Cy8u+/8PLLzB5eg90lQvj+xe9xreKaryGoridFKcZ69uypdwhKVh4+hIED2VXfnI/r32CU6yjGNB2T72GoRKEoxVilSpX0DkHJjJQwZgw3bl3Ae7otjcs1Zn7P+bqUqi9SXU9GKwpYBHTq1ImnpwhnZe/evfTu3dsksezduzdNwcKNGzemu+ZD0cf169e5fv263mEoGfnqKxJ+XYfX2w5EE89az7WULqFPtYMilSiklFuklOOernmUFwW0ynihZIxEoS7iM409e/awZ88evcNQnrZ3L7z7Lh9MaMBBQxC+fXxpZK/ftTdFKlEYiymqjEdFRdGrVy9cXV1xcnJi9erVQOYlxjt16sRbb72Fu7s7jRo14siRIwwcOJD69evzwQcfANraEA0bNsywdHlqv//+O61bt6ZZs2Z4enqmlALZsWMHDRs2pFmzZvz6668Zxn327FlatmyJm5sbLi4uKQX/li1bhouLC66urowcORKALVu20KpVK5o2bUrXrl0JDQ0lKCiIhQsX4uPjg5ubG/v27WPz5s1MmzYNNzc3AgMDCQwMpEePHjRv3pz27dtz/vx5QLsIbMKECbRq1Yrp06fn/YevZKp3794ma0kqeRQSAkOHsrVjVb6odJHxzccz3Hm4vjFlVla2MN+yKzOuQ5VxuW7dOvnqq6+mPE4uCZ5ZifGOHTvK6dOnSyml/Prrr2XVqlXlzZs3ZWxsrKxevboMDw/PsnR5x44d5ZEjR2RYWJhs3769fPTokZRSys8//1x+/PHHMiYmRtaoUUNevHhRGgwG6enpmaZ8eLJJkybJFStWSCmljIuLk9HR0fLMmTOyfv36MiwsLM33cPfuXWkwGKSUUv70009y6tSpUkopP/roo5S4pJTypZdekmvXrk153KVLF3nx4kUppZR///237Ny5c8rzevXqJRMSErL+4RYyBanMuFLAxMVJ+fzz8mo1a2k310Y2XdhUxsTH5MupUWXGc8cUVcadnZ3ZtWsX7777LgcOHEgpCZ5ZiXHQVrNLfm2TJk2oWrUqVlZW1KlTJ6VfObPS5cn+/vtvzp07R9u2bXFzc2Pp0qUEBwdz/vx5ateuTf369RFCMGLEiAzjbt26NXPnzuWLL74gODiYUqVK8ccff+Dp6UnFihUBKF++PAAhISF0794dZ2dn5s2bl+Z7ycyjR484dOgQnp6euLm5MX78eG7dupWy39PTE3Nz463UpaQVFBREUFCQ3mEoyaZO5fGRvxkyuSqJAtZ6rqWkRUm9oyqes570qDLeoEEDjh07xvbt2/nggw/w8PBg+vTpmZYYB7CysgLAzMws5evkx8l99hmVLk9NSkm3bt1YtWpVmu0nTpzIUdzDhw+nVatWbNu2jZ49e6asYJeRN954g6lTp9K3b1/27t3LrFmzsj2+wWCgXLlymcajSpWb1t6kP2hV66kAWL4cfviBae835UjscdYPWU/d8nX1jgpQYxQZMkWV8Zs3b2Jtbc2IESOYNm0ax44dy7TEeG5kVLo8teeff54///yTy5cvA9pYycWLF2nYsCFBQUEEBgYCpEskya5cuUKdOnWYPHky/fr149SpU3Tp0oW1a9cSEREBwN27dwGIjIxMKVm9dOnSlGNkVarcxsaG2rVrs3btWkBLbCdPnsz1z0HJm379+tGvXz+9w1BOnoTx41k3uDHfljjOm63eZGCjgXpHlUIligyYosr46dOnUwaFP/74Yz744INMS4znRkaly1Ozt7dnyZIlDBs2DBcXF1q3bs358+cpWbIkvr6+9OrVi2bNmmU6n37NmjU4OTnh5ubGmTNnGDVqFE2aNGHmzJl07NgRV1dXpk6dCsCsWbPw9PSkefPmKd1SAH369GHDhg24ublx4MABvLy8mDdvHk2bNiUwMBA/Pz9+/vlnXF1dadKkScp63Yrp2dnZYWdn2hLVSjbu3YOBA7nsUJYxTa/xfI3n+aLbF3pHlYYqM16IBQUF0bt3b86cOaN3KEouFKS/xStXrgDasrmKDgwG6NePmN2/0Xp2ba4n3uX4+OPUsq2V76GoMuOKomRo//79gEoUupk7F7ZuZcpnbTj56BDbhm/TJUlkRyWKQszR0VG1JpRnMmDAAL1DKL527oQPP2T5hNb8FHeI99q9R8/6BbP2lkoUilKMGaOKgZIHQUEwfDjn2tRnQs2TdKjWgU86f6J3VJlSiUJRirHk2XD16tXTOZJiJCYGBg3ikVkCgwclUiaxDL8M+gULs4L7dlxwI1MUxeSSL9BUiSKfSAkTJyKPHWPCNx05f28/u0ftpmrZqnpHliWVKBSlGBs8eLDeIRQvixbB4sUs+r+e+N3bziedPqFL7S56R5UtdR1FPgkKCsLJyckox3q6Gmt+2bhxI598ovWjjh49OsMLBAMCApg8ebJRztemTZtcv+bEiRMIIdixY0ea7WXKlAG038PKlSuzPc7NmzczfRMNCwujR48euY6tICpTpkzKz0YxsSNHYNIkTvR/njdK7OGFui8ws8NMvaPKEZUoMuF32g/Hrx0x+9gMx68d8TtdcOqM65UovvzyS15//fUsn+Pu7s63335rlPPl5XtctWoV7dq1y/RK85wmimrVqmWYCBMSErC3t6dq1ar8+eefuY6voLlw4QIXLlzQO4yiLzwcBg0islZlPDuGUtG6IisGrMBMFI634MIRZT7zO+3HuC3jCI4MRiIJjgxm3JZxz5wsEhMTGTt2LE2aNOGFF14gJiYGINMy2zkp233gwAFGjx7Na6+9xvPPP0+dOnXYu3cvY8aMoVGjRmlq+Lz22mu4u7vTpEkTPvroo5Ttjo6OTJ8+HWdnZ1q2bJkywJnaxYsXsbKySnPF9e7du3F3d6dBgwZs3boVSLsA0qxZsxgzZgydOnWiTp06GSaQhQsXMm3atJTHS5YsYdKkScCTVsCjR4/w8PCgWbNmODs7Z3rltpSStWvXsmTJEnbt2pWmblayGTNmcODAAdzc3PDx8SEoKIj27dvTrFkzmjVrlpKcUrcAlyxZQt++fenSpQseHh4A9O/fH78isEjJX3/9lVICRjGRxEQYNgx5J5RX3qnP1QfXWD14Nfal7fWOLOcyKytbGG9AH8C3Xr166Uropikz/tsU2XFxx0xvVp9aSWaR7mb1qVWmr5nyW9Z1xq9evSrNzc3l8ePHpZRSenp6yuXLl0spMy+znZuy3UOHDpUGg0Fu3LhRli1bVp46dUomJibKZs2apZwzuRx4QkKC7Nixozx58qSUUkoHBwc5e/ZsKaWUS5cuzbDc+P/+97+U8yefs3v37jIxMVFevHhRVq9eXcbExEh/f/+U13/00UeydevWMjY2VoaFhcny5cvLx48fpznunTt3ZN26dVMe9+jRQx44cEBKKWXp0qWllFLGx8fLyMhIKaWUYWFhsm7duik/l9QOHjwou3TpIqWUctiwYXLdunUp+5KPlTo+KaWMioqSMTFaGeeLFy/K5BL1V69elU2aNJFSSrl48WJZvXr1NCXhQ0JCpJOTU7oYcqIglRmPioqSUVFReodRtL3/vpQgv/HxksxCzvtzXvav0QFZlBkvUoPZUsotwBZ3d/exz3KcuMSM64lntj2nateujZubGwDNmzcnKCgoTZntlPMk1TMPCQlh6NCh3Lp1i8ePH1O7du1Mj92nTx+EEDg7O1O5cmWcnZ0BaNKkCUFBQbi5ubFmzRp8fX1JSEjg1q1bnDt3DhcXFwCGDRuWcv/WW2+lO/6tW7ewt0/7CWjIkCGYmZlRv3596tSpk9ISSq1Xr15YWVlhZWVFpUqVCA0NpUaNGin77e3tqVOnDn///Tf169fn/PnzKWXTk0kpef/999m/fz9mZmbcuHGD0NBQqlSpkuZ5q1atwsvLCwAvLy+WLVvGoEGDMv2ZAcTHxzNp0iROnDiBubk5Fy9ezPB53bp1SymnDtpa0zdv3szy2IWB9dPVLxXj2rQJ5s7l8Ov9eOfhevo06MPbrd/WO6pcK1KJIqe+7pF1nXHHrx0JjkxfZ9zB1oG9o/fm+bypS4Wbm5sTExOTZZnt3JTtzq4k+dWrV/nPf/7DkSNHsLOzY/To0Wm6ZlKXJ89o8fZSpUrx9Frk2ZU4z+h7zmhJUy8vL9asWUPDhg0ZMGBAuuP4+fkRFhbG0aNHsbS0xNHRMV23UmJiIuvXr2fTpk3MmTMHKSURERE8fPiQsmXLpjtnMh8fHypXrszJkycxGAyULJlx7f+ny53HxsZSqlSpTI9bWPz7778ABab2VJFy8SKMGsXd1m4MqXeM6mbVWdp/aYb/JwWdGqPIwByPOVhbpv2kZW1pzRyPZ6gznomsymzntGx3Tjx48IDSpUtja2tLaGgov/32W5r9yUuzrl69mtatW6d7faNGjdKNXaxduxaDwUBgYCBXrlzhueeey1VMyQYMGMCmTZvStAhSi4yMpFKlSlhaWuLv709wBouF7NmzBxcXF65fv05QUBDBwcEMGjSIDRs2pHne0z+7yMhIqlatipmZGcuXLycxMTFHMV+8eNFos9j0dPjwYQ4fPqx3GEVPVBQMHIjB0oJRr5TndlQoawavwa5U4azUqxJFBrydvfHt44uDrQMCgYOtA759fPF2foY641nIrMx2Tst254SrqytNmzalYcOGDB8+PF33zr1793BxceGbb77Bx8cn3es7dOjA8ePHU9b0BqhVqxYtW7bkxRdfZOHChZl+Gs+OnZ0djRo1Ijg4mJYtW6bb7+3tTUBAAM7OzixbtoyGDRume86qVavS1S0aNGhQutlPLi4umJub4+rqio+PD6+//jpLly7F1dWV8+fP53ihJH9/f3r16pWL77Jg8vLyyjA5K89AShg7Fs6dY968AWwL+YOvXviKFtVzv4xAgZHZ4EVhvmW3ZraSloODQ8r611mZPHmy3LVrVz5EVPC1b99e3r17N0+vVX+LRdw330gJct+nr0rzj83lkLVDMpx8UdCg1sxWjOH9998nOjpa7zB0FxYWxtSpU4vEgj9nzpxRFYiN6eBBePtt7gzsjlepbdSxq8NPfX4qlOMSqRXLwWwlraCgoBw9r3LlyvTt29e0wRQC9vb29O/fX+8wjCJ5ga+iMN6iu1u3wNOTxNoOePeK496te+wYsQMbKxu9I3tmKlEoSjHm/Szr+ypPxMfD0KHw4AGfft2f3ecX8nPfn3Gp7KJ3ZEahup4UpRiztLTE0tJS7zAKv3ffhQMH2PXNFD45/yMvub7Ey24v6x2V0ahEoSjF2KlTpzh16pTeYRRuq1eDjw83pozB+94iGts35oeePxT6cYnUVKJQlGLs2LFjHDt2TO8wCq+zZ+GVV0ho1wYv5wtEx0ez1nMtpUvkbJp1YaESRT5RZcZzL7dlxh0dHXF2dsbFxYUXXniB27dvP3MMqYsU5kZhKUU+cuRIRo4cqXcYhVNkJAwcCGXKMHOqGwdD/sS3jy+N7IveVe4qUWTmqh9sdISVZtr91YJTKVSVGc+cv78/p06dwt3dnblz5xoljrwoLKXIzc3NMTc31zuMwsPPDxwdwcwMqlaFS5fYMn8KX56az4TmExjuPFzvCE1CJYqMXPWDf8ZBdDAgtft/xj1zslBlxk1bZjy1Dh06cPnyZf755x9at25N06ZNadOmTcraC0uWLGHgwIH06NGD+vXrM3369JTXLl68mAYNGtCyZcs0b/QZ/T4A9u3bh5ubG25ubjRt2jSlREhhKEV+4sSJDOuMKRnw84Nx4yA4WLv6OiaGoArmvHR2Dk2rNMWnR/qKBkVGZlfiFeZbtldmB0yRclfHzG+rrKT0I/1tlVXmrwlQZcb1LjOe+grziRMnyunTp8vIyEgZHx8vpZRy165dcuDAgVJKrXR47dq15f3792VMTIysVauWvHbtmrx586asWbOmvHPnjoyLi5Nt2rSREydOzPL30bt3b3nw4EEppZQPHz5MOV9mpcgL0pXZixcvlosXL9Y7jMLBwUFKLUVICTLOHNliLNLmfSEvR1zWO7pnRnEpM240hkzKiWe2PYdUmXHTlhkH6Ny5M+bm5ri4uDB79mwiIyN56aWXuHTpEkII4uPjU57r4eGBra0tAI0bNyY4OJjw8HA6deqU8r0OHTo0pfR4Zr+Ptm3bMnXqVLy9vRk4cGDK91cYSpGnbnEq2bh2DT9nmOkB12yhzGN4aAXrV0vqzqmrd3QmVTwTRfOsy4yz0TGp2+kp1g7QdW+eT6vKjJuuzHgyf3//NN1jb775Jp07d2bDhg0EBQXRqVOnXMWWWma/jxkzZtCrVy+2b99O27Zt2blzJw0bNiwypcgVjV9HO8a1uUt0Ce3xQyuwSISYyhX0DSwfqDGKjLjOAfOnFnQxt9a2G5kqM26cMuOZSf0zXLJkSbbPb9WqFfv27SMiIoL4+PiU38vTx0r9+wgMDMTZ2Zl3332XFi1apLSsCkMp8qNHj3L06FG9wygUZraOTkkSyRLMYWZXfeLJTypRZKS2N7T01VoQCO2+pa+23QRUmfFnLzOemenTp/Pee+/RtGnTbFsMAFWrVmXWrFm0bt2atm3bplnQJ7Pfx9dff42TkxMuLi5YWlry4osvAoWjFPnZs2c5e/as3mEUfGvXcq1Exq3Yawl38zmY/CdS/+MXFe7u7jK52Fmyf//9V63ilQlHR0cCAgLSvPllZMqUKfTp04euXYvBRygj6NChA5s2bUpXZVb9LRYyFy6AuzsOEx9zrdTjdLsdbB0IejMo/+MyMiHEUSmle0b7VItCyTFVZjznilIp8mItKgoGDUKWtMLRsWm63aZa+bKgUYlCISgoKNvWBKgy47lRWEqRHzlyhCNHjugdRsEkJUyYAOfO8dmXfdkfepgBzw3It5UvC5LiOetJURSAlKm/LVoU4mU6TcXXF1asYPUsT2ZeW8xw5+GsGLCiSBX7y6lilSiklMXyl6wUHAVtTFCtR5GJgACYPJm/BrfiJfPNtKvejp/7/lxs3z+KTddTyZIliYiIKHD/qErxIaUkIiIiz7PDlHxy9y4MHsyV+hXp1yKQGjY12DB0AyUtiu/vrdi0KGrUqEFISAhhYWF6h6IUYyVLlkxzZbre/v77bwCef/55nSMpIAwGGDmS+xE36DWpBgmJMWz33k5F6+zH8IqyAp8ohBClgfnAY2CvlDJPVdYsLS2zLIGhKMXR1atXAZUoUnz2GfE7tjP40+cIjLnCrpG7aFChgd5R6U6XrichxP+EEHeEEGee2t5DCHFBCHFZCDEjafNAYJ2UciygptwoihENGzYspc5XsbdnD/LD/+O1KXXZE3+BRX0X0dGxo95RFQh6jVEsAdKs6iKEMAd+AF4EGgPDhBCNgRrA9aSnJeZjjIqiFBc3bsCwYXzZ356fbQP5oP0HjHIdpXdUBYYuiUJKuR94+rr3lsBlKeUVKeVj4BegHxCCliwgi3iFEOOEEAFCiAA1DqEoOXPo0CFdFsEqUOLjYcgQ1tV8yAyXO3g5efFJ50/0jqpAKUiznqrzpOUAWoKoDvwKDBJCLAC2ZPZiKaWvlNJdSun+dDlsRVEyFhISQkhIiN5h6Gv6dA4HH2Jkv0Ta1GzD4n6Li+002MwU+MFsKWUU8LLecShKUTRkyBC9Q9DX2rUELfmavpNLUa1cVTYO3Visp8FmpiC1KG4ANVM9rpG0TVEUxfguXCBywsv0eqUUj62t2DZ8G/alVW9ERgpSojgC1BdC1BZClAC8gM06x6QoRdrBgwc5ePCg3mHkv6go4gcPxLP/Yy7axLN+yHoaVsx5+friRq/psauAv4DnhBAhQohXpJQJwCRgJ/AvsEZKmatC+UKIPkII36dXYlMUJWO3b9/m9u3beoeRv6REThjPxNrn2FUrHt8+vnSp3UXvqAq0YrMehaIoCgALFzJv+WtMfwHeb/d+sSgTnhNqPQpFURSAgAB+nf8G73aDoY2H8GmXT/WOqFDIctaTEKIG2lhBe6AaEAOcAbYBv0kpDSaPUFEUk9m3bx8AHTsWgyuQIyI4MqEPI/ol0qqKO4v7L8FMqM/KOZFpohBCLEa7jmEr8AVwBygJNEC7qnqmEEFauEoAACAASURBVGJG0sVziqIUQhEREXqHkD8MBoJf9aRP59tUKVuNTSO3UcqylN5RFRpZtSj+K6U8k8H2M8CvSTOTapkmrLwRQvQB+tSrV0/vUBSlUBg4cKDeIeSLyLkf0buqP7FlS+H/8m4qla6kd0iFSqbtroyShBDCTgjhkrT/sZTysimDyy0p5RYp5ThbW1u9Q1EUpYBI2P07Qy/M5nwlwXrvzTSyb6R3SIVOth10Qoi9QggbIUR54BjwkxDCx/ShKYpiav7+/vj7++sdhsnIkBDe+LEfO+vBwh7f41G3q94hFUo5GcmxlVI+QCv3vUxK2QrwMG1YiqLkhwcPHvDgwQO9wzCN+Hh8prdnoVMs7zZ8lVeef13viAqtnNR6shBCVAWGADNNHI+iKPmoX79+eodgMhtnDuSdBkEMLtuKuUN+1DucQi0nLYpP0K6WviylPCKEqANcMm1YiqIoeXd02Rd4W26lRWJllr3hr6bBPqMidWV2qllPYy9dUrlMUbKze/duALp2LTp999eP7aXVqi6UMC/B4XcvUdmuZvYvUvJ2ZbYQ4oOkAezM9ncRQvQ2RoDGomY9KUruxMTEEBMTo3cYRvPw3m16L+9BlCVs896mkoSRZDVGcRrYIoSIRZvtFIZ2wV19wA3YDcw1eYSKophMnz599A7BaBIS4xn6WXPO2sTxm9NnNHFWc26MJdNEIaXcBGwSQtQH2gJVgQfACmCclLLofAxRFKVQk1Iy5b9d+a30TXxFX7p5ztA7pCIl21lPUspLqMFrRSmSfv/9dwBeeOEFnSN5Nt+se5v5MfuZdrM2Yxds0DucIqfAL4WqKIrpxMfH6x3CM9scsIKpZ30YGFyKz+cdBjM1w8nYVKJQlGKsV69eeofwTI7dCGDY5tG4hwqWj9+JWUW1lKkpFKnUq1a4U5TiI+RBCH0WdaHiw0Q2O8/F+vn2eodUZGW3HkVJoDcZrEeR22VK84OUcguwxd3dfazesShKYbBjxw4AevTooXMkufMw7iG9fTvyMO4hh+73pMrEd/UOqUjLaj2Kj9GSxF7gMGnXo/g8KYm8LaU8lQ9xKoqiAJBgSGCY3wDOPLzCtr9r4bRlDQihd1hFWlYtin+klB9lsu8rIUQlCth6FIqi5E5ha0kATP3tTbZd38OCPVZ0X7QTSpfWO6QiL6vrKLalfiyEsJZSRqfafwetlaEoipIvvjv8Hd8F/MDUQzBh8jJo2FDvkIqFnKxH0UYIcQ44n/TYVQgx3+SRKYpictu2bWPbtm3ZP7EA2HZxG2/umEK/8/Blw0kwZIjeIRUbOZn15AN0ByIApJQngQ6mDEpRlPxhaWmJpaWl3mFk68TtEwxdO4SmtwV+IS0xn/dfvUMqVnJ0HYWU8rpIO1iUaJpwFEXJT4XhiuwbD27Q268Xdg8es/k3W0ofXA8lSugdVrGSk0RxXQjRBpBCCEtgCvCvacPKm1RlxvUORVGUZ/D6Aj98r8wksfQ1MFhggYGjSxOptnw11Kihd3jFTk66niYAE4HqwA20yrETTRlUXqky44qSO1u2bGHLli16h5HG6wv8WHBjHIllgkFIMI8nQVqwsNcU6NZN7/CKpWwThZQyXErpLaWsLKWsJKUcIaWMyI/gFEUxrVKlSlGqVCm9w0jD98pMsIxOu9EiDt/yqtifXrLtehJC1AbeABxTP19K2dd0YSmKkh8K4sp2iaWvZbL9ej5HoiTLyRjFRuBnYAtgMG04iqIUdyK6ArJ0eLrt5pHVdIhGgZwlilgp5bcmj0RRlHy3adMmAPr166dzJBqfVceRVg/AIMBMPtnx2JpX9jjqFldxl5NE8Y0Q4iPgdyAueaOU8pjJolIUJV/Y2NjoHUIK319CmBrQmxLSjoEH6rC23TUSbW9iFlkdw57PKRMUnf1BFJPISaJwBkYCXXjS9SSTHiuKUoh17txZ7xAAWLLyIeMP9Mbc7j7+v5Slza3jrAqITdobwhsWD/gq4TU8tkPPnrqGWizlZHqsJ1BHStlRStk56aaShKIoRrF0eQIvbx8Klc6wbl8l2uw+BIsWgYODVhXWwYF5vuVwdYWXXoKbN/WOuPjJSYviDFCOQlAAUF1wpyi58+uvvwIwcOBAXc6/eLFkzPo3oMVvfHe0Nv3XH4IqVaBOHfD2TnleSeCX1tC8OYwcCb//DubmuoRcLOWkRVEOOC+E2CmE2Jx8M3VgeaEuuFOU3KlQoQIVKlTQ5dyLFsGYn3ygxULeuurIpOXHtSSRiYYN4bvv4I8/4Isv8jFQBSGlzPoJQnTMaLuUcp9JIjICd3d3GRAQoHcYiqJkYsF8yevfbYKhA+l/rxrrP7uAmXX260pIqTU01qyB/fuhTZt8CLaYEEIclVK6Z7gvu0RRGKlEoSgF17dfG5gy7yhmL7fDPbEcez+8TKlSZXP8+gcPoGlTSEiAEyfAzs6EwRYjWSWKTLuehBAHk+4fCiEepLo9FEI8MFWwiqLkn3Xr1rFu3bp8O99/v0hgyqzrWA1/gZrmpdj8/slcJQkAGxtYtUob1B47VmtlKKaVaaKQUrZLui8rpbRJdSsrpSw4k68VRcmzKlWqUCWLcQFj+vzjON75KAob73aULBPL9kmHqFw2b+du2RLmzoX16+HHH40cqJJOTla4W56TbYqiFD7t2rWjXbt2Jj/PJ+9G8d4nZlQZ0o7oSrf4ddQ2Gts3fqZjvv02dO8Ob70FZ84YKVAlQzmZ9dQk9QMhhAXQ3DThKIpSlEgJH065z0dfWlOv9wvcrnsG374/0aX2s1+KZWYGS5eCrS0MHQrR6sJtk8lqjOI9IcRDwCX1+AQQCmzKtwgVRTGZNWvWsGbNGpMcW0p4f2wYn35bDvcOXlxutpeZ7WfyctOXjXaOypVh+XI4d05rWSimkdUYxWdSyrLAvKfGJypIKd/LxxgVRTGRGjVqUMMEK8ZJCe8Mv8nnP9vTrelEArqswcvJi086f2L0c3XrBjNmgK8vrF1r9MMrZDE9VgjhKKUMyvSF2iLa1aWUISaKLc/U9FhF0Y+U8Gb/IL7d7Mjghh+yZfgXuFdvwe5RuylpUdIk54yPhw4d4N9/tSmzjo4mOU2RlqfpscA8IcR6IcQoIUQTIUQlIUQtIUQXIcSnwJ9AI5NErChKoWQwwMRuF/l2syNj6n3FvtHzqWFbk41eG02WJAAsLWHlSi1JDRumJQ7FeLLqevIE/g94DvgBOABsBsYCF4AuUspd+RGkoiimsWrVKlatWmWUYxkMML7tGRbsacCUej9x6I0fScDAdu/tVLSuaJRzZKV2bfjpJ/j7b/jwQ5OfrljJsiiglPIcMDOfYnlmqiigouRO7dq1jXKcxATJK82Os/R0M95vvIq/3vEjMOQqu0ftpkGFBkY5R04MGQK7d2u1oDw8oACu9Foo5aTWU0ZlJSOB01LKAllRVo1RKEr+SYhL5KUmAawMbMWs5pu4OvNXlp5axvIByxnhMiLf44mOhhYt4O5dbbyicuV8D6FQyusYRbJXgEWAd9LtJ+Bd4E8hxEijRakoSqET/zAW77p/szKwFXM7/Y75f0+x9NQyZnWcpUuSALC2hl9+gfv3tfUrDIbsX6NkLSeJwgJoJKUcJKUcBDRGW+GuFVrCUBSlkPLz88PPzy9Pr30c/gCvOv+w5kZb/tNvPw7fhvN/ez9kpMtIPuyo7yCBszN89RXs3KndK88mJwsX1ZRShqZ6fCdp210hhJpboCiFWIMGeRs/iLsWyhCXf9kc2YmvRwTQbLag6/KX6ejQkZ/6/IQ2e15fEyZo4xXvvQcdO2rdUUre5CRR7BVCbAWSL2UZnLStNHDfZJEpimJyLfLw7hl7PohBzYPYHt2JH14/S7dPbHn+5+44lnPk16G/YmVhZYJIc08IbXEkNzfw8oLjx7XKs0XSVT84OROir4F1LXCdA7W9s39dDuWk62kisBhwS7otBSZKKaOklAVjZXZFUfJFzJEz9HMN4rfoDvi+G8jQeVXoubInZsKM7cO3U75Ueb1DTMPOTru+IjhYa2EUyZLkV/3gn3EQHQxI7f6fcdp2I8k2UUhtWtRB4A9gD7BfFsXVjhSlGFq2bBnLli3L0XOjdh2id5sIdj3uwP9m32LU7Br0X92f65HX2Th0I3XL1zVxtHnTti18/LG2hsWSJXpHY2SGRDg+DRKfqoiYGK21MIwk264nIcQQYB6wFxDAd0KIaVLK/FvtRFEUk2jSpEn2TwIert5O72FlOSjbsfzruwyfXI0RG0Zw8NpBfhn0C21rtTVxpM9mxgzYswcmTYLWrbX1twulxMdw9yiE7Yc7+yHsIMRnso5c9DWjnTYnYxQzgRbJ10wIIeyB3YBKFIpSyDVvnv2KAQ8WruTF1xw5TEtW+kYxdGxFPvT/kJWnVzK3y1yGOg3Nh0ifjbk5rFgBrq5aSfLDh6Gk6SqKGE9CNEQc1pLCnf0Q/hckxmj7bBqBwzC4vh7iwtO/1rqW0cLISaIwe+rCughyNrahKEoyEw82msr92d/T4//cOSrcWb0snkEjbFh6Yimf7v+UMW5jmNFuht4h5li1alrXU+/eMG0afPed3hFl4HEkhB96khjuHgFDPCDAzg3qjYNKHcC+HZSspL3Gvr02JpG6+8ncWvsbM5KcJIodQoidQHJBmKHAdqNFoChFXfJgY/I/cvJgI+ieLJYkddqPHj067Q4puTvlY174rjenhBvr1kj6DS6F/1V/xm4Zi0dtDxb2XlggpsHmRq9e2roVPj5aeY9+/XQOKDYMwg4kJYYDcP8ESAMIC6jQAhpOBfsOYN8GSpTL+BjJf0Mm/CCSbQkPACHEICC5E/KAlHKD0SIwAVXCQykQEmLg3gnY1wse30u/v2QV6H8dzHLyec00Tpw4AYCbm9uTjQkJhI+aSrdVL3POzIlfN5jRq68558PP0/rn1lQtU5VDrxyiXMlM3rgKuLg4aNMGgoK0Eh81a+bjyaNDnrQW7uyHB/9q281LQsXWWlKo1AEqPg8W1vkYWNYlPHKUKAoblSiUfGdIhAfnIOIIRPyj3d8/BTIh69dZlIYKraBiG+1TY8XWmX9yzA8xMdwZMJ6uO9/hkkUjNm6xoHsPQVhUGK0WtSIqPorDrx7GsZyjaeMwcVfdpUvQrBk0bQp//AEWpsjVUsKjwLSJIeqqts/SRus+sm+vJYby7mBewgRB5FxWiSLTH0/SsqcZZRGBNmu2qF66oihZkxKigp4khIh/4N4xSIjS9lvaav/4jaZp3QcBb0DMjfTHsaoIDl4QdgjOfQYyERBg2xjs22rJo2IbKFtPu3rMBBJXrID/+z/Mg4OhenVuWzngEfgjVy0bsPU3Szw8ICY+hr6/9OXWo1vsG70vf5KEibvq6teH+fNh1CiYPRtmzcpFbJklMGmAyHNPkkLYfoi5pe2zqqglhOemaPflXMDM3CjfS35QLQpFyU7snaSEkJQU7h55MsvEzArsmmoJoUJL7b5sfRCp5ns8/cYH2mBjS98nbzLxj7Rjhx+CsD+12S3xkdo+K/uk1kZb7b58c62r4ln5+fHFnjNclQ74LhlHNW6QiBkPLSqybbcVHTuCQRrwWufFunPrWOu5lkGNBz37eTMjJcSGwm9u2v3TLG2g4dtgbgVmJbSfvVmJrB+bZ/28l0absWKF1qro2DGb+DL6PZqVhJoDITFKG2N4fFfbXqo6VOqoJYVKHcCmocmSvbGoridFyan4R9o89bupupCigpJ2CrBtkjYp2DrnrMsgt10pyZ9Oww9pLY6wP+HRZW2fWQktWVRs86TlUSr3tbT9Kk7m6+ojeYwVp065JJ+YD22+5uPItwB4b/d7fP7n58zrNo932ryT63Nk+H1F39C+l4eBSfdJt0eXn7TK8okU5sTEWfE4oQQ25awws8giwYT9+WRq6tPK1HuSFCp1gNKOBT4xPE0lCkXJSOJjiDydalzhH21wUSbVpS7tmCoptAS7ZmBZRr94Y+9oSSO51XE3AAyPtX1l6jxpcdi3BZvG2XZtOIoggnFMt92BIIKkI4uOLWLslrGMbz6eBb0W5HyGkyFBS4gpCSDwSSJ4GAiGuCfPNbOE0rW17rUy9bT7M7MhLoOlbqwdoO9l7Xs2xGm/P0Oc9jgx7sn2px9n87zQ249ZtyaOuo6P6d4tDpHZ6yL+zuQbFjC88Ncyz9MYRWH0TCvcFdJ57spTMvs9SgM8vPTUuMKJJ29aVhW1ZFBz8JPWQkl7fb+Xp5WsBDX7azfQ3rzuHoPwP7UEcnsnBC3X9lnaQIXntaRh30YbMLcsm+Zw16jF8HbL+XjQLOrYX+VaeC3eXzOHXw4NY1fgLiZsnUD3ut35vuf36ZNEYpzW0krdGkhOCo+uph3ENy+ZlATqQ9UXtWSQnBisa6ZPaCXKZ35dgJlF0iwx480IqgwkXIAX34Rv7eCNNzJ54kbHpHpKTzHihW0FlWpRQM76kJW0CmJizej3KCygbANtMDm5z9+itNZ1Uz5Va6G0Q6HrKkhHSnh0JdU4xyG4fwaQ2phJOZcn3VWhtrw+NYjmfY5hbmZgdI0lAETFWTNt67v4tfgvz9nW5I9BP1EmLjR9F1H09SctLwCLsqkSQN20LYRSVdOO2eREPv99SQl9+8Lvv2tXbaeeLZwmpiL8PqG6nrKT2ScFzKCMozaLxdIm6ZaDr0vYgkXS18865a2wvCHn9B9GSu1K08RorTxBmvuoDLaluk+Iynpf1NWkmUNPMbOEOq886UayaVSoZpw8k8f3Ifzwk1ZHxN8p4wAJiWacj24EgFPZsykviTXAPWlGVfOnulNKlE+bAJITQtl62oB7IU+04eFaiY8yZeDoUe0+nYL4/2gkKlFkZ6UZGc8EBhyGa0W3Eh5ol9en/jq7OfKgNbstbbTEUSKjxJJF4gn9A06+n3YAzdwa3L+HWp7am6JM0O4NSfept2W2PdvnZvP6059AfAZLkZiXhuo9s3nDj8r4zTwnP0dza+0iJHNrrVWQ8nXSffCqTF5cNPqQjeLgPna/8iWbHV7gm5fezPC9XUqIqNKbipVbPUkKZetCCbv8jzef+fuDh4e2hOrixXpHk7+KzRhFnlnXyqTv0QHaZlLTXUpIjNUSR3xSAsnp14+upN0uc/EmlhgNh8dot4ImMUrr6kh+4y5hp00TzOhNPas3/HT7SuWs6yLsULHtQ84Rf39+7LGB1x5voW25eAylfIiPug1ASfMnA8wxVvZU9NiiV5S66twZPvgAPv1UK/HhXTQaC89MJQrQmo+5LaolBFiU0m55mJqYQkrtvMmJ43Gk1mKJfwAHspiz3nQeCPOkm8WTr80sstluhOdud9H6qJ9m7QC9z+X9Z/Gs8vJ7LCbkjp181udPZiZ8S6+usazZVJK/Anpy4VIM5oInYxQGOF5pMO30DVdXH36otSwmTIBWrSAvc2OKGpUoIF+KamVKiKRPzqW1Qb/UrB0yb+k0MsKc9rxy/axgviHr+XsswAybt/LOgEB8DJ8wwjOW//mVxNISRhzbzgtY410GDBKuJcD74XAofDtBHfSOWj8WFuDnpw1oDxsGf/4JJfStrqE7NUZRkBXkWRZFeFCvKIlf/SuvDItmuRzBlPGxfDW/JGZJvXhmH5shMxibEwgMH6kxnQ0bYOBAePtt+M9/9I4ma35+MHMmXLsGtWrBnDm57zZTYxSFVUH+hFzbu2DEoWQqZukaho4uxRZG8OnMWGZ+WjJl8PrKvStYmFlgabAEIJonH0Zq2aoxHYABA+D11+G//9UGuF98Ue+IMubnB+PGQXTSrzA4WHsMxhtjUS0KRSmCIuf70WdiTQ7Sjh++esxrbz2pDbXz8k6GrR9GbEIsXgleSCRLWAKAtaU1vn188XZWHwIAYmK0cYrbt+HkSahaNfvXmFpiIoSEwOXL2m36dHiQwWqoDg5aKfWcUi0KRSlGbs9bTo/pzpwTTfhlaTxDRmpJQkrJ5wc/Z+YfM3Gq5MSGoRvYE7CH5SeXI6IFtWxrMcdjjkoSqZQqBatXQ/PmMHKkdkGeWS6vHcyL+HitZZCcDFLfrl6Fx4+zP8Y14y2ZrVoUilKUXP1oCd0+acct8xps2GjGC721UdiHcQ8ZvWk0v/77K8OchvFTn58oXaK0ztEWHj//DK++CnPnwnvvGeeYsbHam/7lyxAYmDYZBAVpLYdkpUtrs69S3+rW1e7btcs4KRizRaEShaIUEaenLqa7T3fiLMuybU9Jnm+vjT9cCL/AgNUDuBhxkXnd5vHm82+m1G569OgRAGUyvAxZSSalNgNqzRqoVAnu3MnZoHFUFFy5knHL4Pp17bjJbG3TJ4PkW+XKmV/4/vQYBYC1Nfj65m6MQnU9KUoRd2jsYnot6o91Kcn+QyVp4qYlic0XNjNyw0hKmJdg18hddK7dOc3r1q1bB2SwZraShhDaBXhr1kBo0lIZyYPGMTHaanlPJ4LAQLh5M+1xKlbU3vg7dEjbKqhXDypUyFsVlORk8KyznrKiWhSKUphJyW/DljFotSc1yj7g9+P2ONY1xyANzNo7i0/3f4p7NXfWD1mf4Wymy5e1NS7yVHG5mHF01JJDdqpUybhVULculCvAy4yrFoWiFEVSsqq3H6O2D8e5wk12nKlJpSpm3Iu5x4gNI9h+aTsvu73M/F7zKWmR8Yp4KkHkXFaDw+vWPUkGRbEXTyUKRSmMDAa+77SOyQeG06FaIJvP1sWmnBln7pyh/y/9uRZ5jfk95zPBfUKWCw5FRmql121tbfMr8kKrVq2MWxQODjDIhCvEFgT5MNFLURRjkokGZrlv5Y0DQ+hb9xw7LtfDppwZa86uodWiVkTFR7F39F5ea/FatqvSbdiwgQ0bNuRT5IXbnDnaIHFq1tba9qJOtSgUpRAxxCcy2dmfHy70ZbTLMX4KaArmiUz7/T3+89d/aFOzDes811G1bM6uDOvQoRgXdcql/Bg0LqjUYLaiFBKPo+IZ3fgfVl1ryztt/+LLA62JiAnHa50Xe67u4XX31/Hp4UOJZ10sSymW1GC2ohRyUfceM7jRGXaEtuWLnvuYvq0jx24dY8DqAYQ+CmVxv8WMdhud6+Peu3cPADu7or8okZJ3aoxCUQq4uzdj6VYnkN9DXfnJaw/Tt3Vk2clltP1fW6SUHBxzME9JAmDTpk1s2rTJuAErRY5qUShKAXYzMIbubre5+KgOa8fvofcPnZi0fRI/HPmBzo6dWT14Nfal7fN8/E6dOhkvWKXIUolCUQqoyyej6Pb8A8JjK/Lb9L00/j9XPJZ5cPDaQd5u/Tafd/0cC7Nn+xd2dHQ0TrBKkaYShaIUQMf3P6RH13gM8Rb4zz5E/Cgbmv3YjPux91k1aBVeTl5GOU94eDgAFStWNMrxlKJJjVEoSgGzf+sDOnURWMU/Yv/XxzjaPYiOSzpSyrIUf7/6t9GSBMDWrVvZunWr0Y6nFE2qRaEoBciWFZEMGWWFowxi86JAvrDfwM/bfqZHvR74DfSjfKnyRj2fh4eHUY+nFE0FPlEIIeoAMwFbKeVgveNRFFNZ9u19xkwpQzNxgp9WXMY7+iuOHD/CzPYz+bjTx5ibmRv9nDVr1jT6MZWix6RdT0KI/wkh7gghzjy1vYcQ4oIQ4rIQYkZWx5BSXpFSvmLKOBVFbz6z7vPSlHJ0MjvALL8/6XZzMufDz7Nh6AZmd5ltkiQBcOfOHe7cuWOSYytFh6lbFEuA74FlyRuEEObAD0A3IAQ4IoTYDJgDnz31+jFSSvVXrBRZUsIHb0Qy94dyDLTYwPP/86fvpfnUK1+PjV4baVixoUnPv337dkCtR6FkzaSJQkq5Xwjh+NTmlsBlKeUVACHEL0A/KeVnQO+8nksIMQ4YB1CrVvq6+4pS0CQmwusjIvH9xZYx1j8S89UGpl/ZSf+G/Vnafyk2VjYmj6Fbt24mP4dS+Okx66k6cD3V45CkbRkSQlQQQiwEmgohMl2tVkrpK6V0l1K629vn/QIkRckPcXHg1eshvr/YMqHKBxyd/RW/3P6d2Z1ns37I+nxJEgDVq1enevVM//0UBSgEg9lSyghggt5xKMqz8PN7UnW0Rg2wKRHL2cCyjHXyZvWwrcjHZmwbvo0X67+Yr3Hdvn0bgCpVquTreZXCRY9EcQNIPdWiRtI2RSmS/Pxg3JgEoh9r/27XrwOUoEVnTxZ1XI+TnRMbhm6gbvm6+R7bjh07ADVGoWRNj0RxBKgvhKiNliC8gOE6xKEo+WLmlEdEP7cJPGaC7TV4UAMeVeZI9QC8nLxY1GcRpUuU1iW2Hj166HJepXAx9fTYVcBfwHNCiBAhxCtSygRgErAT+BdYI6U8a6Tz9RFC+CYv76goBUFwtY3QZxyUCwYhwfY6VAuAk8NYOXClbkkCtC4n1e2kZEctXKQoJhAfD+vWwbdfxvJ3p+eg3LV0zzG/X50EnxAdonvixg2t11cNaCtq4SJFySdhYeD7w2O+X3CP23aHsa33i9bdlIFEW/2H5nbt2gWoMQolaypRKIoRnDhuYNbn+9h66y8S6+xCjD8I5gkkUIJSWBJDfLrXOFhW0CHStHr27Kl3CEohoBKFouRR6MNwvli2iZWHdxBa6SA0vg2N4bloe/o5etK94xjaOrRn3b/rGLdhDNHyccprrUUJ5vT9RsfoNZUqVdI7BKUQKFKJQgjRB+hTr149vUNRiqAEQwL/3PiHDae2s/rPzVwvcQaExKxqOVxv12asfS8GjHiHatXTlt3wdvYGYOaemVyLvEYt21rM8ZiTsl1P17W5uqo4oJIlNZitKFkIeRDCzss72RG4g98v/M6DxAdgMIMbrXC40pgJlavy1rueWLm56B1qnixZsgRQYxSKGsxWlByLTYjlQPABdlzewc7AnZwN02ZuWz20J+7SYCwud2FIXEmmvW6H2/x2UKKEzhE/m96981xeTSlGVKJQijUpJZfuXmLHeSyz/AAAE2RJREFU5R3suLyDvUF7iUmIoYSwpHbYc1Q89i7hl0dgF1GRiV0uMv6XBtg7F53rDtQSqEpOqEShFDsP4h7wx9U/UrqUgu4HAdDAti6esa2J3ObKH2fe4UJ8NVpVDOTbifEMeq8yJayKToJIFhQUBICjo6OucSgFm0oUSpHid9ov3aDxMKdhnLx9MqU76c/rf5JgSKBMiTJ4OHZhWpkelF1lwbo/urFc9sZcGBjSMojJc6No1SX/6y/lp7179wJqjELJWpEazE4162nspUuX9A5HyWd+p/0Yt2Uc0fHRKdvMhTmlLUvz4PEDANyquNGjbg96WDXGdcM51v4cz7cPXuIMzthbP2L8qFhe+7+KVKum13eRv+7duweAnZ2dzpEoestqMLtIJYpkatZT8RIWFcbJ0JN4rvXkfuz9dPutLa1Z0GsBL1RpS5Vt+7i+YCs/BLTkJ8Zylwq41Y5kyszSeHlbULKkDt+AohQAataTUiQYpIHAu4GcuH1Cu4Vq9zcf3szydTHxMYz8Zh+HVi1jcuw4fmUNUpgxoOdjJk+H9u1tESKfvokC5sqVKwDUqVNH50iUgkwlCqVAio6P5sydM0+Swu0TnAo9RVR8FAAWZhY0qtgIj9oeuFVxw62KGy/5eRKSeDfdscrft6bF0okcNTSjXNkEpo43Z+IkgYODaj7s378fUIlCyZpKFIruQh+FpmslXIy4iEEaALCxssGtihuvNH0lJSk0tm+MlYVVmuP02dqcBR4HoUTMk42PrYnY8yOV6rux4E0YOdKC0vpV9S5wBgwYoHcISiGgEoWSbxINiVy6eylNK+Fk6EluP7qd8hwHWwfcqrgxtMlQXCu74lbFDcdyjojM+obu3iVu7Wb+XXaENYdXQvTOJwsERdaCPXOodLorZw1mxbZ7KSu2trZ6h6AUAmowW8mTjKahpq5d9OjxI06Hnk7TUjgdepqYBO3TvqWZJU0qNUlJBm5V3HCt7Ipdqcxn30iprTl96uADTq+/yKm/HnH6tj0XeI7ELD7zCAwYpEnX6Cq0Ll++DICqj6YUm8FsVRQwfzw9DTU4MphXNr3CpvObADgZepJLEZeQaB9C7Era4VrFlfHNx6ckhUb2jShhnnn5i8hIOH0aTp3S7k8fj+f0KcmDmBKADeCOo8V1XOo9ZECHMJy7VeGt12K4dd863bFqVYgGyhj7x1AkHDx4EFCJQsmaalEo6UgpiYqPIjw6nLCoMMKiw9J8/f0/36cMKj+tdrnaKckg+VbTpmamXUfx8XDhwlNJ4bTWckhWzuIhzgkncOEkzhVv49y9Gk7j2mDT3pXU/Ul+fjBuTALRj598/rH+//bOPbiu4r7jn69kybIkv7DkK/OwbCzZ2LWNIQ0NBBhTp7RhoDCATRuVFEhxaYak6ZBAi9sZINWQDu3EpB2SisQ4tBoSXuYZkqEE86rDyxhb1BgbW3Z46MqWg7Eky7KkX//YI3QlXV3p+qF7Zf0+Mzvn3N09u7/709V+z+6es5vfQc2qMVRlfqHWrKS5uRmA4mIX0tHOqOlRHI8MNsQzFLqsi70H9rK7JWrw+zT83XGJ6W0dbUnLysvJ41BX/014AITY/rfbk6aZwUcf9YhB93Hz5iAWAGPGwNzZHZxbVs+C/BdYuP0xFnRt4OTpY9GypbB0KZxxBgNNNgQxGMOKFUFopk+H6moXiVS4QDhDwXsUWUyyN40L8wq556J7WHLqkl4Ne6/zPkKw98Dez54g6sv4/PGUFpVSUlhCaWFpOB9XQmlRKaWFUXxC+oSxE5h590x27tvZr6zyieXUf6ue5maoq+svCtFLwACcfDIsXAgLFsCC8k9Z2PAr5ry8ivwXnoXOTqioCMKwdCksWjSgODhHxpYtWwCYM2dOhi1xMo33KEYALe0tNDQ39Aorfr2il0hAeL/gmsevSVpGjnIoKSz5rFGfVzqvp/FPFILofErhFArGpP8uwUVjq/nhoeWQl2BbeyH8uppZ/w7bEzoVxcVBDJYti0QhCpM7dsOjj8JDD8G/ru0Rh5tvDplPP93FYRhYt24d4ELhpMaFIqK2lj5DFhzxkEV7ZzuNLY39BKChuYF4S7zX5+b25rTKrrm45rO7/e47/8njJpOjo/t0T0cH7NwJW7fCtm0h3PefVVBJv8dQP9xcxeWXw3XX9QhCeTnkdJvU2Ahr1sAdD8Hzz0NXF1RWwi23hJ6Di8Ows2zZskyb4IwAfOiJIBLXfr+WQ+f1NHx5L1Vz399V9ROL7vH+ZI1/39B0oClpfZMLJlNWXDZo+PzKeezq6F9G+Zgp1K/Yk5ZPUtHRAfX1QQS6BaH7uGNHSO+mqAhaks9jI4W2vxeNjT09h7VrQ4bZs3uGlRYudHFwnCzAFwUchJILamk6ZznkJwyldOSh9y9i1rQSugobaM9voEUNfNoVp9M6+pUxbsw4po2f1tPQF4VjrDjWq/GPFcUYe6grNKDdIR7v/TkKtV1vs/wSaE14irSwHWqeFlVFZ0NJCUyZkvp4wgmQm8uhQ717BonH+vreYlBcHEaBKiv7H2MxmDkzlNWX8vJQFvF4jzi88EIQhzlzesRhwQIXhyxh8+bNAMydOzfDljiZZtTMURzuexRNi1b0FgmAMYew2Y+zo/VEunaXYfvLoPl0aC7rCS1lTM4ro6w4xrTxYymbcICpBfuJ5e0lpkZiXR8TO7iLWOurTN23lfzdHwYRaB5gmKmoKLTEU6dCeTlVT7zNK5xNzZJddE78iNx9J/KXz02natM6+MOC0Cq/+Sbs2QMHD3KIMdQzg61Uso0KtlERznNms6OrvNdLacV5bVSWfsKZJ7aw7NKOIAbz8qlYVExsziSUnzegv6qrkzyGmneI6sXPwwV3wosv9ojDrbeGOYf5810cspBXX30VcKFwUuM9CkC35YCS+MGEfXkd1hBn/67fEd/RSvy37cQbuojvziW+N4/4/kLibROJM5U4MRqZSjPjk9YzOb+ZWFELUyceJFbSSawMYiflESsvIDarOBxjQSvGjYPakm+yvOlOWulZnKiQFu6Y9H3m1v5jQq/A2LbVqN8pOjt7GuPxY9upPGEPFUUfU5m/kwrep7L9HSpaNzJ177uo7UAyMwMTJ/bumSSeb9tG7f0drOi8g11MZzq7qOZWqngATjutp+fg4pD1tLWFx6ALfH31UY8PPQ1CyU0TaJqwv1/8lE8K2bOyT09jwoRwx58YunsBUWgpjtGoGPGDk4jvziEep1foHm2Kx+GT/tsnAGH4p621i46u1JPTEyb0DA31HSYqLR2knW5thaam0CMZ6nGgCQqAadPgww9dHBxnBDJqhp4Ol7uf3c91l+TSnt/5WVx+ey53P9cKTz/dIwalpQxlZ5siYGYUBuPgwd7CkSgmK1cOLBKvvBLEoKTkCNrlwsIQTjll6Ne0tYVrkt1gNDS4SIww6urqAJg/f36GLXGyGRcKoOrTcnhyJyuWwK6JMH0fVD/XGeIvuuiY1j12bGink7XVa9YMPGl8zjnH1KyBKSgIzw8nM2z69OG3xzkiunveLhROKlwoAKqrqVq+nKpNCcNMhYVQU505m4gmjZeHEaJuCgtDfEbJWsOcdKny9U2cIeBrL0N4s66mJtyqS+FYU3Pkb9wdn2ZlsWFOuuTl5ZGXN/ATbo4DPpntOKOajRs3ArBw4cIMW+JkGp/MdhwnKevXrwdcKJzUuFA4zijm6quvzrQJzgjguJqjkHSJpJp9+/Zl2hTHGRHk5uaSm5ubaTOcLOe4Egoze9LMlvuG8Y4zNDZs2MCGDRsybYaT5RxXQuE4Tnq4UDhD4bh86knSbqD7jbCJQN+xqMS4vuklwNFbw3vgeo/2NanyDZQ2mG8Gikv87P5yf7m/0suXrf4qN7PSpClmdlwHoCZVXN904I3htOVoXZMq30Bpg/kmhY8S/ef+cn+5v45zf42GoacnB4lLln6sOJy6hnpNqnwDpQ3mm4Hihstn7q/0cH+lh/triByXQ09HgqQ3bICXTpz+uL/Sw/2VHu6v9DhW/hoNPYp0qcm0ASMM91d6uL/Sw/2VHsfEX96jcBzHcVLiPQrHcRwnJS4UjuM4TkpcKBzHcZyUuFAMgqRTJf1E0sOZtmUkIOkySfdK+rmkCzNtT7Yjaa6kH0l6WNLfZNqekYCkIklvSLo407ZkO5IWS3op+o0tPtxyRqVQSFolqVFSXZ/4P5G0RdI2SX8PYGbbzexrmbE0O0jTX4+Z2fXADcBVmbA306Tpr81mdgOwDPhiJuzNNOn4K+IW4MHhtTJ7SNNfBjQDBcAHh13psXrrMZsDcD5wJlCXEJcLvA+cCuQDbwPzEtIfzrTdI8xf/wacmWnbR4K/gD8FngG+kmnbs91fwB8BfwZcA1ycadtHgL9yovQYUHu4dY7KHoWZvQjs7RN9FrDNQg+iHfgZcOmwG5eFpOMvBf4FeMbM1g+3rdlAur8vM3vCzL4MjMq9ZNP012LgC8BXgOsljbo2LB1/mVlXlP47YOzh1ukbF/VwEvDbhM8fAH8gaQpQDZwh6R/M7M6MWJd9JPUX8A3gS8BESRVm9qNMGJeFDPT7WgxcTvgn/kUG7MpWkvrLzG4EkHQNsCehIRztDPT7uhz4Y2AS8B+HW7gLxSCYWRNhvN0ZAmb2A+AHmbZjpGBma4G1GTZjxGFmqzNtw0jAzB4FHj3SckZdty0FHwKnJHw+OYpzkuP+Sg/3V3q4v9LjmPrLhaKH14FKSTMl5RMmzJ7IsE3ZjPsrPdxf6eH+So9j6q9RKRSSHgDWAXMkfSDpa2bWAdwI/ArYDDxoZu9k0s5swf2VHu6v9HB/pUcm/OWLAjqO4zgpGZU9CsdxHGfouFA4juM4KXGhcBzHcVLiQuE4juOkxIXCcRzHSYkLheM4jpMSFwpnWJDUfBTLWinp/KNV3gB13Cbp28eyjqie8yS9I2mDpHFHYk+0F8i8Y2Dj70tKuSyLpEmSvj6Esv5H0uSjZ50zHLhQOCOKaJHGL0QraGYl0Qq6Q/3fqgLuNLNFZnbgCKu+jLC09FHFzN4ws28Okm0SMKhQAP81xHxOFuFC4QwrUSN6l6Q6SZskXRXF50i6R9K7kp6V9AtJVyYp4grglwnl1Uu6XdL6qLzTovhed+BRfTOi8K6k1ZLek1Qr6UuSXpG0VdJZCXWdLmldFH99QlnfkfS6pI2Sbo/iZkSbxtwP1NF73R0kLZH0VmTjKkljJf0VYcOi70qqTeKrFZGNLwNzEuKvj+p/W9IjkgolnUPY1+KuqHcyK1m+6PrVCjuevRGVf3EUXyDpvsjGtyRdEMUvlvRUgl9XSVorabukbgH5HjArqvsuSdMkvRh9rpN0XpTvCeDPk/86nKwl05tweBgdAWiOjlcAzxI2WokBu4BpwJWEZbZzgDLC+vlXJinnp8AlCZ/rgW9E518Hfhyd3wZ8OyFfHTAjCh3AgqiuN4FVgAj7HTyWcP3bwDighLCE84nAhUBNlD8HeIqwkcwMoIvQ2+lrc0F0/ezo8/3At6Lz1QN8z88Bm4BCYAKwrfv7AFMS8v1zwvfvVdYg+X4Z2V9JWJK6ALgJWBXlOS362xQQ9oB4KsEv/0tYFr0EaALyou+fuJHOTcCK6DwXGJ+QtjXRNg/ZH7xH4Qw35wIPmFmnmcWBF4DPR/EPmVmXmTUAzw9w/TRgd5+47mWU3yQ0WIOxw8w2WdjL4B3gOQst2KY+1z9uZgfMbE9kz1kEobgQeAtYT2hQK6P8O83sN0nqmxPV+V70+acEcUnFecAaM2s1s0/pvcDbfIV9kDcRhq5+b4AyUuV7MPL1VmB79D3OBf4bwMzeBXYCs5OU+7SZHYz80kgQ/L68Dlwr6TZggZntT0hrJIiuM0JwoXBGGgcId7mJHIyOnfTssdJB7993QZL8EHoBBxPOE/do6bsQmhF6Et1zCovMrMLMfhKltwz5WxwZq4EbzWwBcDv9/TGUfMm+21BJ9F+iz3sKC3NI5xOWul4t6asJyQWEv6MzQnChcIabl4CrJOVKKiU0Jq8BrwBXRHMVMcJwRzI2AxVDqKeesK8wks4EZh6GrZdG4/ZTInteJ6zOeZ2k4qjskyRNHaScLcAMSd12X03oSaXiReAySeMkjQcuSUgbD3wsKY/e26fuj9IGywewNPL1LMI+y1sIf5uq6HvNBqZH8UOhV92SyoG4md0L/Jiev4UIQ4v1QyzXyQJ8hztnuFkDnE0Y/zfgZjNrkPQIsAT4P8J4/npgX5Lrnwb+mtD4pOIR4KuS3gFeBd4bJH8yNhKGnEqA75rZR8BHkuYC60KbRzPwF4Q766SYWZuka4GHJI0hCE7KLWLNbL2knxP81Bhd080/Rd9pd3TsbqB/BtwbTTBfmSIfhPmH1wjzHzdENt4D/DAaquoArjGzg9H3TImZNUUPBNQBzxDmhL4j6RDBR909is8Bv7GwLLYzQvBlxp2sQVKxmTVHd/CvAV+M5iv65nsZuNjMPhl2I48DJK0mTE4/nIG67waeMLPnhrtu5/DxHoWTTTwlaRKQT7iD7ycSETcRhkVcKEYedS4SIw/vUTiO4zgp8clsx3EcJyUuFI7jOE5KXCgcx3GclLhQOI7jOClxoXAcx3FS4kLhOI7jpOT/AbK73Y4vFpT6AAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loglog(df,\"basic scatter\",\"red\")\n", + "plot_loglog(df3,\"sampled scatter\",\"blue\")\n", + "plot_loglog(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "plot_loglog(df4,\"heatmap (bin via Pandas)\",\"orange\")\n", + "plt.axvline(x= 3100,linestyle=':',color=\"grey\")\n", + "plt.legend()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXgAAAEKCAYAAAAYd05sAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nO3dd5zU1b3/8ddnyu6yy7JUlbYs1Y5isKOiCApYsMQSYomJaLwp6k1+iSE3V3NDyk0x7cYEjTFlo0FjMMrOghQLAip2FAu9iVJkBZZld2bO74+ZhWELOwMz+50Z3k8f38d853zL+ezZ4ePZM+f7/ZpzDhERyT8+rwMQEZHMUIIXEclTSvAiInlKCV5EJE8pwYuI5CkleBGRPBXwOoBE3bt3dxUVFV6HISKSM1555ZXNzrkeLW3LqgRfUVHB4sWLvQ5DRCRnmNnq1rZpiEZEJE8pwYuI5CkleBGRPKUELyKSp5TgRUS8UlkJFRXg88VeKyvTevqsmkUjInLIqKyESZOgtjb2fvXq2HuAiRPTUoV68CIiXpg8eW9yb1RbGytPEyV4EREvrFmTWvkBUIIXEfFCeXlq5QdACV5ExAtTpkBR0b5lxcWx8jRRghcR8cLEiTBuXGzdDPr1g6lT0/YFK2gWjYiIdzZsgFNPhUWLMnJ69eBFRLywZQuVOxdRMfZdfPf4qPhlBZVvpXcefMYTvJn5zew1M3sq03WJiOSKyse+x6SLYTU1OByra1Yz6clJaU3y7dGD/zqwtB3qERHJGZPX/pnagn3LahtqmTwnR+bBm1kfYDzwQCbrERHJKdEoawI7W9y0piZ35sH/Evh/QLS1HcxskpktNrPFmzZtynA4IiJZ4LXXKK9peVN5WQ7Mgzezi4CPnXOv7G8/59xU59xw59zwHj1afOqUiEh+CYWYMgcKffuO0RQHi5kyKjfmwZ8JXGJmq4BHgPPM7G8ZrE9EJDdUVzOxcDgj+p2Fxf/rV9aPqRdPZeLxOTAP3jl3F3AXgJmNBL7hnPt8puoTEckJn3wCCxfiJn+HD7b+hUuOvITp10zPSFWaBy8i0p6efhqiUd4ZcSRratYwbvC4jFXVLleyOueeAZ5pj7pERLJaKARdulBVvB4gowlePXgRkfbiHFRXw5gxzFgWYujhQ+nTqU/GqlOCFxFpL2+8ARs3UjPmbOavmc/4weMzWp0SvIhIewmFAJh1ZJCIi2R0eAaU4EVE2k8oBMOGUbV5AV2KunBan9MyWp0SvIhIe6ipgQULiI69kKoPqrhg0AUEfJmd56IELyLSHmbPhkiEV8/oz8c7P874+DsowYuItI9QCMrKmNFhHYZxwcALMl6lEryISKY1To8cPZqqFdWc2udUepRk/t5bSvAiIpm2ZAmsX8/HY87k5fUvM25QZmfPNFKCFxHJtPj0yOrBhsNlfHpkIyV4EZFMC4Vg6FCqNi/kiI5HMKznsHapVgleRCSTtm+H+fMJj72AmctnMnbQWHzWPqlXCV5EJJPmzIFwmIWn9WFb3bZ2mR7ZSAleRCSTQiEoLWVG8VoCvgDnDzi/3apWghcRyRTnYgn+/POpWj6Ts8rPoqyorN2qV4IXEcmUpUth7VrWjD6Ftz5+q91mzzRSghcRyZT49MjQIAfQruPvoAQvIpI5oRAceyxVWxZR0bmCo7of1a7VK8GLiGTCjh3w/PPUjR3N7BWzGTdoHGbWriEowYuIZMK8eVBfz3On9aS2oZbxQ9p3eAaU4EVEMiMUgpISZhSuoShQxMiKke0eghK8iEi6NU6PHDWKqpUzOa//eRQHi9s9DCV4EZF0e/99WLWK90efxLKty9rt7pFNKcGLiKRbfHpk1YAIQLvPf2+kBC8ikm6hEBx1FDO2LOTo7kfTv0t/T8JQghcRSafaWnj2WXaMHcWzq55t94ubEinBi4ik0zPPwO7dzDm1Bw3RBs+GZ0AJXkQkvUIhKC5mRuEaSgtKGVE+wrNQlOBFRNIpFMKdO5KqFTMZM3AMQX/Qs1CU4EVE0uWDD2D5ct4cPZT129d7OjwDSvAiIulTXQ1AVUUYgLGDxnoZjRK8iEjahEIweDAztizkpJ4n0bO0p6fhKMGLiKTDrl0wbx5bx53LwnULPZ0e2UgJXkQkHZ57DurqmDm8C1EX9Xz8HZTgRUTSIxSCoiKqCtfQvbg7J/c62euIlOBFRNIiFCIy8hxCK2dx4aAL8fv8XkekBC8ictBWrID33+fl0cewZdeWrBh/ByV4EZGD1zg9sl89PvMxZuAYjwOKUYIXETlYoRAMGMCMLQs5o+8ZdO3Q1euIgAwmeDMrMrOXzOwNM3vbzO7JVF0iIp6pq4O5c/lw/Nm8+uGrnj3coyWZ7MHvBs5zzp0AnAhcaGanZbA+EZH29/zzUFtL6DOdAO8e7tGSQKZO7JxzwI7422B8cZmqT0TEE9XVUFBAVXA1vUt7M/TwoV5HtEdGx+DNzG9mrwMfA087515sYZ9JZrbYzBZv2rQpk+GIiKRfKET9yLOYtXou4waPw8y8jmiPjCZ451zEOXci0Ac4xcyOa2Gfqc654c654T169MhkOCIi6bV6NSxdygvnD2F7/fasmR7ZqF1m0TjntgHzgAvboz4RkXYRf7j2jL51FPgLGDVglMcB7SuTs2h6mFnn+HoHYDTwbqbqExFpd9XV0K8fVVsWcU6/c+hY0NHriPaRyR58T2Cemb0JvExsDP6pDNYnItJ+6uthzhxWXnQmSzcvzarZM40yOYvmTWBYps4vIuKp+fNhxw6qhnWEdWTd+DvoSlYRkQNTXQ3BIFXBVQzqOojB3QZ7HVEzSvAiIgciFKL2nDOYu/a5rLp6NZESvIhIqtauhSVLeGbUQOrCdYwfkn3DM6AELyKSuvjdI2f0qaU4WMzZ/c72OKCWKcGLiKSquhrXpzdVWxZx/oDzKQoUeR1Ri5TgRURS0dAAs2ez9OLTWbVtVdaOv4MSvIhIahYsgE8/perEYiC77h7ZlBK8iEgqQiEIBKgKrOT4w46nb1lfryNqlRK8iEgqqqupOftUnl+/MCsvbkqkBC8ikqwNG+CNN5g9qoJwNJzVwzOgBC8ikrzG6ZE9d9C5qDOn9z3d44D2TwleRCRZ1dVEe/UktPVFLhh4AQFfxm7nlRZK8CIiyQiH4emnee3ik9m4Y2PWD8+AEryISHIWLYJt26ga2gHDuHBQ9j+/SAleRCQZoRD4/czwL+fk3idzWMlhXkfUJiV4EZFkVFez6ezhvLTxlayfHtlICV5EpC0bN8KrrzLzvHIcLifG30EJXkSkbTNnAjDjiE85vORwTup5kscBJUcJXkSkLaEQ4Z6HM3PLS4wdPBaf5UbqbHMSp5n1Aa4BzgJ6AbuAJcAMIOSci2Y0QhERL0UiMGsWiz57Kp/UVefM+Du00YM3sz8BDwL1wE+Aa4HbgNnAhcB8M8vOO92LiKTDSy/BJ59QdXwhAV+A0QNGex1R0trqwf/cObekhfIlwONmVgCUpz8sEZEsEQqBz8cMljGifARlRWVeR5S0/fbgW0ruZtbFzIbGt9c755ZlKjgREc9VV7PunGG8ueXtrH64R0uS+qbAzJ4xs05m1hV4FbjfzO7NbGgiIh7btAkWL6ZqZG8gux/u0ZJkvwouc859ClwO/MU5dyowKnNhiYhkgZkzwTmqDquhX1k/julxjNcRpSTZBB8ws57AVcBTGYxHRCR7hELsPrw7s7cuZtzgcZiZ1xGlJNkE/31gJrDMOfeymQ0APshcWCIiHotEYOZMnrvkBHY27Myp6ZGNkrqZsXPuUeDRhPcrgCsyFZSIiOdeeQW2bKHq2CBFO4o4t/+5XkeUsrbmwX83/sVqa9vPM7OL0h+WiIjHQiEwY4Z7n3MrzqU4WOx1RClrqwf/FvCkmdURmz2zCSgCBgMnErvg6YcZjVBExAuhEB+MHMoHNW/wtTPu8DqaA9LWPPgnnHNnArcCbwN+4FPgb8Apzrk7nHObMh+miEg72rIFXnqJqrOPAHJvemSjZMfgP0BfqorIoWLWrNj0yO7bOMqOYkCXAV5HdEBy45ZoIiLtKRRixxFdeWbbazl39WoiJXgRkUTRKFRXM/eiY6mP1DN+SO5Nj2ykBC8ikui112DTJmYcHaC0oJQR5SO8juiAJXsvmiFmNsfMlsTfDzWz72Y2NBERD4RCOKAq+h6jB46mwF/gdUQHLNke/P3AXUADgHPuTWIPARERyS+hEEvOPYZ1Ozfk9Pg7JJ/gi51zLzUpC6c7GBERT33yCSxaxIwRhwMwdvBYjwM6OMkm+M1mNhBwAGZ2JfDh/g4ws75mNs/M3jGzt83s6wcZq4hIZj39NESjVHXbyrAjhtGrtJfXER2UpObBA/8BTAWOMrP1wErg820cEwb+0zn3qpmVAq+Y2dPOuXcOPFwRkQwKhfjkiDIW1CzhruPv8jqag5bshU4rgPPNrATwOee2J3HMh8R7+c657Wa2FOgNKMGLSPaJT4+cddExRNzCnL16NVFSCd7MOgPXAxXE7g0PgHPua0keXwEMA148gBhFRDLvzTdh40ZmHDmAbtFunNL7FK8jOmjJDtFUAYuI3XwsmkoFZtYR+Cdwe/ypUE23TwImAZSX6/ndIuKRUIioQSjyLhcOHovf5/c6ooOWbIIvcs7dmerJzSxILLlXOuceb2kf59xUYuP7DB8+3KVah4hIWoRCvHzuEDbXvZ8XwzOQ/Cyav5rZzWbW08y6Ni77O8Bi4zh/BJY6535x0JGKiGTKtm2wYAFVZ/TAZz4uGHiB1xGlRbI9+Hrgp8Bk4lMl46/7u8XamcB1wFtm9nq87DvOuaoDCVREJGPmzIFIhKouWzit82l0K+7mdURpkWyC/09gkHNuc7Inds7NB3LrCbUicmgKhdjYs5TF299lyslTvI4mbZIdolkG1GYyEBERTzgH1dVUjz8SyN2He7Qk2R78TuB1M5sH7G4sTHaapIhI1lqyBNavZ8bgI+gV6MUJh5/gdURpk2yCnx5fRETySyhEgw9mhd/nqqOupvE6n3yQ7JWsf850ICIingiFeGHkAD5tWJHTD/doyX7H4M1sWvz1LTN7s+nSPiGKiGTIp5/C/PlUnd6doC/IqP6jvI4ordrqwTfeAfKiTAciItLu5s6FcJgZZR9xzhHnUFpY6nVEabXfHnz8hmEAtznnVicuwG2ZD09EJINCIVb1LuGd2tU5/3CPliQ7TXJ0C2W5fSd8ETm0OQehEKGxg4D8mh7ZaL9DNGb2ZWI99QFNxtxLgRcyGZiISEa98w6sXcuMgZ0ZWDyQId2GeB1R2rU1Bv93IAT8CPh2Qvl259zWjEUlIpJp1dXsCsDc8Ad8afDNeTU9stF+E7xzrgaoAa5tn3BERNpJKMQz55SzK7KG8YPza3pko2TH4EVE8seOHfD881Sd2o3iYDHnVJzjdUQZkeyVrCIi+WPePFx9PTNKP2RUv1EUBYq8jigj1IMXkUNPKMR7fTuwcvfGvJw900gJXkQOLfHpkTMu6A/k5/TIRkrwInJoee89WLWKqgERjjvsOMrL8vdZ0ErwInJoqa7m00J4PrwiL69eTaQELyKHllCI2Wf1piHakHd3j2xKCV5EDh21tfDss1Sd0oWywjJO73O61xFllBK8iBw65s3D7d5NVckGLhh0AUF/0OuIMkoJXkQOHdXVvF5RxIcNW/N+/B2U4EXkUFBZCRUV8NvfMmNAGICxg/P/hrhK8CKS3yorYdIkWL0agKr+YU7+0Mdh05/2OLDMU4IXkfw2eXLsy1VgczEs6gPj343GyvOc7kUjIvltzZo9qzMHgjMY9wHw4ZrWj8kT6sGLSH7r02fPatVgOGwHfOZDoDx/r2BtpAQvIvkrEoHu3ak8HvrdDn8/HnYWwMMnBWHKFK+jyzgN0YhI/vrmN6kMv8aky/zU+iJALMFPusRgKEz0OLxMUw9eRPLTfffBvfcyeULpnuTeqNbVM3lO/n/JqgQvIvmnuhq++lUYP541/h0t7rKmRl+yiojklrfegquuguOOg4cfpkuHLi3uls+3CW6kBC8i+WPjRrjoIujYEZ58kr+umM7WXVvx2b6prjhYzJRR+f8lqxK8iOSH2lq45BLYvBmefJJ/1CzgxiduZFT/UTxw8QP0K+uHYfQr68fUi6cy8fh8/4pVs2hEJB9Eo3D99bB4MTz+OI8Xr2bioxMZUT6CJ655gpKCEr4w7AteR9nulOBFJPdNngz//Cf87Gc8ebSfa6ZdxSm9T+Gpa5+ipKDE6+g8owQvIrntwQfhxz+GW26h+pJjuPIfEzjxiBMJTQxRWljqdXSeUoIXkdw1dy7ccguMHs2cOy/jsmkTOLbHscz8/EzKisq8js5z+pJVRHLTu+/CFVfAkCE8d+/tXPzoZQzuOphZ181qdWrkoUYJXkRyz6ZNMH48FBSw4E/fZ9wTV1HRuYLZ18+me3F3r6PLGhlL8Gb2oJl9bGZLMlWHiByC6upgwgTYsIGX//Ijxs69iV6lvZhz/RwOKznM6+iySiZ78A8BF2bw/CJyqHEObroJFizgtT/cw5jX/5Puxd2Ze8Ncepb29Dq6rJOxBO+cew7Ymqnzi8gh6O674eGHeesHX+P8jT+hU2En5l4/lz6d+rR56KFIs2hEJDf87W/w/e/zzs0TGFXwMB38HZh7/Vz6de7ndWRZy/MvWc1skpktNrPFmzZt8jocEclGzz8PX/wi7489hVFDFuH3+Zl7w1wGdh3odWRZzfME75yb6pwb7pwb3qNHD6/DEZFss2wZTJjA8uN6cd55a4m4CHOun8OQbkO8jizraYhGRLLX1q0wfjyrO0U575p6dkV3M++GeRzT4xivI8sJmZwm+TCwEDjSzNaZ2RczVZeI5KH6erjiCtZtWcl5txbzabSWp697mqGHD/U6spyRsR68c+7aTJ1bRPKcczBpEh8ufobz7jqCTdHtzL5+Nif1PMnryHKKhmhEJPv86Ed8/NifGfWN7mxgO7M+P4tTep/idVQ5RwleRLLLtGls+cFkzr+9M6uCO6meWM0Zfc/wOqqcpAQvItlj0SI+mXQdo79cwgcldTx17VOc3e9sr6PKWUrwIpIdVq6k5sqLuOA64+3ODTxx9ROMGjDK66hymhK8iHhv2za2TxjLuPHbeK2H8fhVj3PhIN3K6mApwYuItxoa2HnNFVz0mfd4sZePaZ+dxsVHXux1VHlBCV5EvOMcu75yK5cePpf5/YzKKyq5/OjLvY4qb3h+qwIROXTt/vn/cvnOB5nbHx6a8GeuOe4ar0PKK0rwIuKJ+scf5bOvfpvqwXD/xVO57oTrvA4p7yjBi0i7a3j5Ra597FqePBJ+N/qXfPEzN3sdUl5SgheRdhVZvYrrfz2Sx4+M8Msz/ocvn/F1r0PKW0rwItJuIjXb+MI9w3hkUB3/e9ydfH30d70OKa8pwYtIu4g21HPLd47nr/228YO+N/DNK37udUh5TwleRDLOOcdXvjecPx62jv8qHsvkmx7yOqRDghK8iGSUc447fnIu9xW9xbfqhnPPN2Z4HdIhQxc6iUjGOOf41h+u5Fe7n+X2jwbwo18vxMy8DuuQoQQvIhnzvUdu4acfPc5tK7vzi9+8jgWUctqTWltE0ua2+yqZumIykZI1WH0nXGENX3q3mN/89FWstNTr8A45SvAikha33VfJfesmQcdaAFxhDUT9BI7+Ab4+fT2O7tCkL1lFJC2mLrsLCmr3LfRFuL/mXm8CEvXgReTgrPpoK3c/9giR0rUtbo+UrmvniKSREryIpGzz1gZ+OK2aR97+Ix92DkGgHiJBCDQ037mmnDPOgFtugauugg4d2j/eQ5USvIgkZds2+M20V/nTiw+wsus/oePH+Dp0Y9jLp/G1TSW86Gr5/diXoGDX3oPqO3D68xPYsh1uvBFuvx2uvz6W7I85xrMf5ZChBC8irdq2Df7yj3X8fu6DLO36GBzxFvQqYPD7R3HzpyfxtfPOo/D/LoeBA7mxshL7aZSp564gUrYBf00vJs0bwO++eTLuc/Dss/CHP8B998Gvfw0jRsQS/ZVXQlGR1z9pfjLnnNcx7DF8+HC3ePFir8MQOaR98gk89rct3Bd6jNc7P4kbXA2+CEesL+fzO4/kW6Mm0P3Sq6Fbt+YHV1bC5MmwZg2Ul8OUKTBx4j67fPwxPPQQTJ0Ky5dD166x3v2kSXDkke3yI+YVM3vFOTe8xW1K8CKydStMv/9jHnjyBV7sPJPocdOgwyd03F7G5bUn8K3zruWYi25Ma1c7GoW5c2O9+unTIRyGkSNjvfrLLoPCwrRVldeU4EWkma2bo0z/1Wr++sRanit7jugJldDjXQLhIKPqTuCOc67j/Au/jD8QzHgsGzfCn/4U69WvWgXdu8MXvhDr1Q8alPHqc5oSvIgAsGXDbqb/9H0emb6buaVvEz2xEgbMBnOcGB7CbWfcwFXn/gdlRWWexBeNwtNPx3r1//43RCIwahTceitceikEM///mva1shLemAy1a6C4HE6YAv0ntn1cAiV4kUPY5mXbmP7jd5n2VCFzirYRPeFv2LHTcIU76MVhfHH49dxw+q0M7DrQ61D3sWED/PGPcP/9sHYtHH443HQT3Hwz9O/vdXRpsLISXpoEkYSLw/zFcMrUlJK8ErzIgUpDD8sLm19Zzb9++gGPzurMHDoRPeHvBE54kHCXtRTTgauO/yw3nnQTZ/U7C5+l8YL2DLRXJALV1bFe/YwZ4ByMGRMbq7/4YsiZ+5dF6qB+GzTUQH0NPHsx7P64+X7F/WDCqqRPm98JPkf/AUoT2fZ7dFFY/hC88hWIJMzr9neAU+73/DNWedt8Jk+tYE2kF+X+DUyZtIoxl3XkX79czaPPHcbc+qOIHvsviob9gbrylzCM8yrO48ZhN3LZUZdRUlCS/qDS1CPdn7VrY736Bx6A9euhZ0/40pdiS3l5G7EdzOcr2hBLyg0JS2KybtiWsH3bvvs27hetT7Iyg89Fkw4tfxN8O3ygDli2Jaxsjutgf4/RBgjvhPAOaNgRe21cmr5Pumzn/usMlkGwFAKlLb+mss1fkFJzVd42n+otf+Z/LvwT5QUR1tT7+U71zTz86K+g/7OUfuY+dh1VRdi/myHdhnDDCTdw3dDr6Ft2gDf8ci6WnCJ1sSW6u/l6dDe88DnYvan58QXdYPhvAAPzgRnQ1mt831ZewxFjwUIf06fHXsE47XQfl19unDnCh9+fcI71VbDk7licjXyFMOAL0Pm4vQm4WdJOSNaRJvfYaUmgJPa5KOgc/3w0XS+DYOe96y9+Ceo+an4e9eDjpldA7erm5QXd4DO/AvPHP1D+5ovPT+zD1EK5tbDNl7CeuM3XwrlXPQIv39p2wnIOcAnrxN+75ttxB7/Pmsfg1Tua90hP/An0uTTWayUae21caGV9f9v2t5+LNN/+ytehfkvz32OgFCqubT0hR3bGXqO7mx/bGl8hBDtCoMnSUtmSe1o/z5CvQng7NMSX8PZ4XNv3lifbY/MVNE/6gY6xdV8x0R1RPv0wwuZ1xsb1Qd4pWcX1Jz5HUcLISl0Upm4J8kqkga4FHTi950mc2utEyjv2wPYk590Qrdu7HqmLv29rPYX2zVW+wpYTc0H8fbBzwnrT7Z0h2Al8KY4VrawkvGASAdubJ8KumMAZGoOP+buPvclN8lLR4ftPwsmU7XlfAr4UpmG01oFItocVqd+b7Jv+zyDxdfc2wh9vYMfGTeyq+ZSG3bVEXR2+QD3Bwt10KNpFaYft+H3J/9m+DwuAvwj8heCLv/qLWl/3F8USXtP1lsoSzzv/s1C3sXn9HXrBqLnx/9m7/b82dkaS2bfJazjsePmlKDNnOl5/3RHwRzl5uOP/nflZrMU8YXD5xlii9rf/pPvKSpj9QCX/PWEy5d3WsGZLOfdMn8L5X5rY9Nqw/crfBN/aP8AOvWDUvL09xhaXA92WxLFvfrf1mI/7LyD+5yPs/XM09qZ5WdPtlrhvivu88vXW4zr1j/E/gX3xv3qarB/otjb388OckbBrQ/OYUvxTNe3SOAToGsJsfWMty1/YyPLXalj+XpjlawpYvrUzyxp68GFHH3RaD6XrodM6CspWUtx1JYGuHxIu/YgdhR8R9DXQ0Qcb+4OvhafeRR34Ll3RPBH7/AfZEEnKoiHTFStis28efBBe/E4FFT2a54lP6vvxUs9VNDRAfX3rS6a219W1EDjQr1/sWoBk5W+Cz6IP1D4OtueXKdkaV7b+HoEHf3AZo3o/Sd+CCGvr/cxZfzE3ffdfLe4bqY+w/uUNLF/wEctf386y98O8tynMew31rO4Qoba0JiGJrydYtgo6baChuPnwVFGgiN6lvendqTd9OvWJrcffn/Ly1ZQHm/fm1zb46HtDJN1NkJos+46nvh6+ekklv7h6EiWFez9fO3cXc/MDU3l4QfKxFRTsXYLBfd83XZLZ/tOftlyPWex6gGTtL8HnygSjljV+cLLoAwXEYmgpYZ0wxbuYIHvj6j+RBysfa5JIx3DT1d7+Hm+783vc12EmrGlMmhGon8msG7/HNQMn8PrStbzz4Ucs21XDOl8tW4p3EO30EXRaB13Xw5j1UND8y9rOga706dKHvmV96NPptD2Ju3dpPJl36k2Xoi6tPpx6/uZb6LbmPkoSxuB3RmF1/1vw/LlJ/Sd6/+8vQUEB3D9rItu3ww+v2jsU8p1pU3hk4UReeCG5BB0IJPxhnCbTpsHqFvpb+50NlKLc7sET+0c41T249+51dhO/+8X3MxRh8lLp+R3qccUS6c+a3Wb2y7u+kdLv0jlHxEWoj9Szu2E3O3fs4tOt29les5Pt23awffsuduyILTtr69i5azc7d+2mdvdudu2uZ1dDA7sawtSFG6iLhHmm34PQoaZ5RdH4kIdv396yL+qnc6Q7RxQeTsVh/RhUPoC+ZX326Yn3Ku1FUeDg7+cy/7nbqFg9lV6+CBuiflb1m8SIs3930OfNRxUVLSfSVIdC0q2yMnYrhtqE/lZxcex2DRqDJ32JId2Sjcs5R9RFcTicczji7+PrrZW1dUzT7Y1l/zXlXh7u8EcIJgz+NRRxZd3n+eYdNxOJRghHI1G7QlwAAAqtSURBVNSHwzREIjSEI4QjERoiTcqiERrCYRrCDYTr62moryfcUE+4oSFWFm4g3NBAONJAOBwmHA4TiYQJRxsIR8KEI5H4+zCRaJhqNwcKW5iW2FBERc1RNBAmbGHChAlbhLCvgYgvTLRx8Tfg4gvWDp9nBzcW38TRgwdx5FFH07dzOb1Le9OjpEd6LxqStEhXIs2EJG6+2SbPEryZXQj8CvADDzjnfry//VNN8IE7+hDpvL75hnABxVuOBBxYdO+ruT3rDoeZw+3Z3rgvOOL7xvdP3Mc1nqPpe4vGvqc3RzhY13Kiie3QPkko20R94Pyx3q/zQzSwd714097viBM5YO2Z+CIBfJEA/qifwJ4lQND5CTofBQQImo9CC1Bofgp9AYr88SUQoEMwSHGwgOLCIMVFhRQXBSnpUERJSREdSzpQWtqBjp2KKe1UTKfOHSkpK6WgQ0cO++9hRMqaf/nr39ab8L16DF0uSUcizVaejMGbmR/4P2A0sA542cz+7Zx7J111tPSPDwB/PSU7i8HFL4xwlrAen70RL3NNt+OLrTvbs79LPNYZLmGffdcNnJ9tw6e2GnP3RV8hdjaHOR+Gw+di2c3nbM+8F59jzzYj9v8EnznMWXwb+JzDsPgr+Pbs7/A5F6vHxcp8zvHMmP9rJZEan336TgLmw28+Aj4/fvMT8MXWA75A/NVPwO8n6I+XBQIEA36C/gDBQAB/IEgwECAYDFAQLCAQDBIMBggGCwgUB/AX+PEF/fgL/PgL/fgLYmUnzz+baOfmCdNf05v6++fj86hTPIkvcl9987/EJtlN3gQkB2zixPxJ6KnI5JespwDLnHMrAMzsEeBSIG0J3l/Tq8UevL+mNx//eVG6qklZ4I4Zrca1qfrXHkQUE7hjeitx9WLaCz/zIKKYW174QquJ1KvkDsSG0+6EqbXZ9x2PSDIy+c+nN5D4mPV18bJ9mNkkM1tsZos3bWrhMuf9mGQ3QX2TJ/hmQQ9LcaXmd7/4Pl/e9Q3823qDM/zbenv+PUpibOF71+HujhK+d11WxCSSrIyNwZvZlcCFzrkvxd9fB5zqnPtKa8fk0ywaxSUi7cGTL1nN7HTgbufcBfH3dwE4537U2jG6XbCISGr2l+AzOUTzMjDYzPqbWQFwDfDvDNYnIiIJMvYlq3MubGZfAWYSmyb5oHPu7UzVJyIi+8rorQqcc1VAVSbrEBGRlumyOxGRPKUELyKSp7LqXjRmtglovC1QGZB4p6e23ncHNmcotKZ1pfOY/e3X2raWytsqU3ulVqb2Sr0s8b3aq/3aq59zrkeLW5xzWbkAU1N8v7i9YknnMfvbr7VtLZW3Vab2Untlsr1aaD+1Vxa0VzYP0TyZ4vtMOpC6kj1mf/u1tq2l8rbK1F6plam9Ui9rrzZTeyUpq4ZoDoaZLXatTPaX5tReqVF7pUbtlZpMtVc29+BT1fotHKUlaq/UqL1So/ZKTUbaK2968CIisq986sGLiEgCJXgRkTylBC8ikqfyMsGb2QAz+6OZPeZ1LLnCzCaY2f1m9g8zG+N1PNnOzI42s9+b2WNm9mWv48kFZlYSf7jPRV7Hku3MbKSZPR//jI080PPkTII3swfN7GMzW9Kk/EIze8/MlpnZtwGccyucc1/0JtLskWKbTXfO3QzcClztRbxeS7G9ljrnbgWuAs70Il6vpdJecd8CprVvlNkjxfZywA6giNjT8A5Mpq42y8DVa2cDJwFLEsr8wHJgAFAAvAEck7D9Ma/jzsE2+zlwktex50J7AZcAIeBzXsee7e0FjCb2TIgbgYu8jj0H2ssX3344UHmgdeZMD9459xywtUnxngd7O+fqgcYHewuptZnF/AQIOedebe9Ys0GqnzHn3L+dc2OBie0baXZIsb1GAqcBnwNuNrOcyT3pkkp7Oeei8e2fAIUHWmdG7wffDlp6sPepZtYNmAIMM7O73H4eE3gIarHNgK8C5wNlZjbIOfd7L4LLQq19xkYClxP7x6dnHuzVYnu5+LOYzexGYHNCAjvUtfb5uhy4AOgM/PZAT57rCb5FzrktxMaSJUnOuV8Dv/Y6jlzhnHsGeMbjMHKOc+4hr2PIBc65x4HHD/Y8uf5n0nqgb8L7PvEyaZ3aLDVqr9SovVKT0fbK9QSvB3unTm2WGrVXatReqcloe+VMgjezh4GFwJFmts7MvuicCwOND/ZeCkxzerD3Hmqz1Ki9UqP2So0X7aWbjYmI5Kmc6cGLiEhqlOBFRPKUEryISJ5SghcRyVNK8CIieUoJXkQkTynBS84ws2fMLO1Pnm+hnq+Z2VIzqzzYeMzsdjMrTm+EYGa3mtn1bexzopmNS3fdkjvy8l40Ik2ZWSB+UUkybgPOd84d+H2497od+BtQm4Zz7ZHkzeBOBIajm6EdstSDl7Qys4p47/d+M3vbzGaZWYf4tj09XjPrbmar4us3mtl0M3vazFaZ2VfM7E4ze83MFplZ14QqrjOz181siZmdEj++JP4whZfix1yacN5/m9lcYE4Lsd4ZP88SM7s9XvZ7YvfmDpnZHU3272Bmj8R/vn8BHRK23WexpxW9bWb3xMu+BvQC5pnZvNb2i5evMrP/NbO34j/HoIT2nGtmb5rZHDMrj5ffbWbfSGjXn8SPe9/Mzopf9v594Op4e11tZufE11+Pt1Ppgf2WJWd4fRN8Lfm1ABVAGDgx/n4a8Pn4+jPA8Ph6d2BVfP1GYBlQCvQAaoBb49vuBW5POP7++PrZxB+cAPwwoY7OwPtASfy864CuLcT5GeCt+H4dgbeBYfFtq4DuLRxzJ/BgfH1o/Ods/Hm6xl/98TiHtnSuNvabHF+/Hngqvv4kcEN8/SZgenz9buAbCe3y8/j6OGB2Qrv+NqHuJ4Ez4+sdgYDXnxctmV3Ug5dMWOmcez2+/gqxpN+Wec657c65TcQS/JPx8reaHP8w7Hl4Qicz6wyMAb5tZq8TS3ZFQHl8/6edc00fsgAwAviXc26nc24HsVuzntVGjGcTG27BOfcm8GbCtqvM7FXgNeBYYk/lacn+9ns44fX0+PrpwN/j63+Nx92SxlvL7q+9XwB+Ef/LorNLfshKcpQSvGTC7oT1CHu/6wmz9zNXtJ9jognvo+z7XVHTmyc5wIArnHMnxpdy59zS+PadBxB/SsysP/ANYJRzbigwg+Y/XzL7uVbWk9HYXontvQ/n3I+BLxEbWnrBzI5KsQ7JMUrw0p5WERsaAbjyAM9xNYCZjQBqnHM1xO7E91Uzs/i2YUmc53lggpkVm1kJcFm8bH+eI/bIOczsOGLDNACdiP2PpMbMDgfGJhyzndjQU1v77fnZ4q8L4+sLiN1CFmKPBmwrxkSJdWNmA51zbznnfkLsNrVK8HlOs2ikPf0MmGZmk4j1Xg9EnZm9BgSJjUkD/A/wS+BNiz3rcyVw0f5O4px71cweAl6KFz3gnHutjbrvA/5kZkuJ3dr1lfi53ojH9C6xx6+9kHDMVKDazDY4587dz34AXczsTWK98WvjZV+N1/lNYBPwhTZiTDSPvUNXPwJGmNm5xP4qepvYA8Mlj+l2wSJZID6jaLhzbrPXsUj+0BCNiEieUg9eRCRPqQcvIpKnlOBFRPKUEryISJ5SghcRyVNK8CIieUoJXkQkT/1/KDct6U2dNN8AAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_logx(df,\"basic scatter\",\"red\")\n", + "plot_logx(df3,\"sampled scatter\",\"blue\")\n", + "plot_logx(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "plot_logx(df4,\"heatmap (bin via Pandas)\",\"orange\")\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Up to about 3000 datapoints, we use scatterplots, above 3000 we use manually binned heatmaps." ] }, { diff --git a/experiments/scatter_benchmark.py b/experiments/scatter_benchmark.py index 9b3454ee..4226650b 100644 --- a/experiments/scatter_benchmark.py +++ b/experiments/scatter_benchmark.py @@ -2,34 +2,37 @@ import pandas as pd import numpy as np import json -# trial_range = np.geomspace(10, 1e3, num=3) -trial_range = np.geomspace(10, 1e8, num=8) -trial = [] #[cell count, duration] -for nPts in trial_range: - # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" - output_filename = "output.ipynb" - pm.execute_notebook( - 'uncolored_single_scatter.ipynb', - output_filename, - parameters = dict(numPoints=nPts) - ) - count = 0 - with open(output_filename) as json_file: - data = json.load(json_file) - for cell in data['cells']: - if "outputs" in cell and len(cell["outputs"]) > 0: - if cell["outputs"][0]["output_type"] == "display_data": - count += 1 - duration = cell["metadata"]["papermill"]["duration"] - trial.append([nPts,duration]) - print (nPts,duration) -trial_df = pd.DataFrame(trial,columns=["nPts","duration"]) -trial_df.to_csv("experiment_result_metadata_precomputed.csv",index=None) -# print (trial_df) -# import matplotlib.pyplot as plt -# plt.xlabel('cell execution count') -# plt.ylabel('time (s)') -# plt.plot(trial_df["cell_count"], trial_df["duration"]) -# plt.show() +# experiment_name = "sampled_scatter" +for experiment_name in ["sampled_scatter","basic_scatter","heatmap","manual_heatmap"]: +# for experiment_name in ["manual_binned_scatter"]: + trial_range = np.geomspace(10, 1e5, num=9) + trial = [] #[cell count, duration] + for nPts in trial_range: + # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" + output_filename = "output.ipynb" + # papermill basic_scatter.ipynb output.ipynb -p numPoints 1000000 --execute-timeout 1000 + pm.execute_notebook( + f'{experiment_name}.ipynb', + output_filename, + parameters = dict(numPoints=nPts) + ) + count = 0 + with open(output_filename) as json_file: + data = json.load(json_file) + for cell in data['cells']: + # For testing out Lux Performance + # if "outputs" in cell and len(cell["outputs"]) > 0: + # if cell["outputs"][0]["output_type"] == "display_data": + # count += 1 + # For testing Pandas Performance + if cell["execution_count"]==5: + duration1 = cell["metadata"]["papermill"]["duration"] + # For testing Altair Output Performance + if cell["execution_count"]==6: + duration2 = cell["metadata"]["papermill"]["duration"] + trial.append([nPts,duration1,duration2]) + print (nPts,duration1,duration2) + trial_df = pd.DataFrame(trial,columns=["nPts","pandas cost","altair cost"]) + trial_df.to_csv(f"{experiment_name}.csv",index=None) From 15adb773b07035bc86091a19a896798246d8954f Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Thu, 24 Sep 2020 16:50:24 +0800 Subject: [PATCH 03/18] experiment result --- experiments/manual_heatmap.ipynb | 65 ++++--- experiments/manual_heatmap_2x_coarse.ipynb | 188 +++++++++++++++++++++ experiments/sampled_scatter.ipynb | 163 ------------------ experiments/sampled_scatter_20000.ipynb | 163 ++++++++++++++++++ experiments/scatter_analysis.ipynb | 123 ++++++++++---- experiments/scatter_benchmark.py | 7 +- experiments/utils.py | 2 +- 7 files changed, 490 insertions(+), 221 deletions(-) create mode 100644 experiments/manual_heatmap_2x_coarse.ipynb delete mode 100644 experiments/sampled_scatter.ipynb create mode 100644 experiments/sampled_scatter_20000.ipynb diff --git a/experiments/manual_heatmap.ipynb b/experiments/manual_heatmap.ipynb index e7507560..799490d9 100644 --- a/experiments/manual_heatmap.ipynb +++ b/experiments/manual_heatmap.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": { "tags": [ "parameters" @@ -10,12 +10,12 @@ }, "outputs": [], "source": [ - "numPoints=1000" + "numPoints=10000" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -24,7 +24,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -33,28 +33,48 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Pandas Cost\n", "import pandas as pd\n", - "df[\"xBin\"] = pd.cut(df.x, bins=50)\n", - "df[\"xBinCtr\"] = df[\"xBin\"].apply(lambda x: x.mid)\n", - "df[\"yBin\"] = pd.cut(df.y, bins=50)\n", - "df[\"yBinCtr\"] = df[\"yBin\"].apply(lambda x: x.mid)\n", + "import numpy as np\n", + "binRange = np.linspace(-10,10,num=41)\n", + "df[\"xBin\"] = pd.cut(df.x, bins=binRange)\n", + "df[\"yBin\"] = pd.cut(df.y, bins=binRange)\n", "\n", - "groups = df.groupby(['xBinCtr','yBinCtr'])[\"x\"]\n", - "# groups = df.groupby(['xBin','yBin'])[\"x\"]\n", + "\n", + "#groups = df.groupby(['xBinCtr','yBinCtr'])#[\"x\"]\n", + "groups = df.groupby(['xBin','yBin'])[\"x\"]\n", "result = groups.agg(\"count\").reset_index()\n", "result = result.rename(columns={\"x\":\"z\"})\n", "\n", - "no0result = result[result[\"z\"]!=0]" + "result = result[result[\"z\"]!=0]\n", + "\n", + "# result[\"xBinCtr\"] = result[\"xBin\"].apply(lambda x: x.mid)\n", + "result[\"xBinStart\"] = result[\"xBin\"].apply(lambda x: x.left)\n", + "result[\"xBinEnd\"] = result[\"xBin\"].apply(lambda x: x.right)\n", + "\n", + "\n", + "# result[\"yBinCtr\"] = result[\"yBin\"].apply(lambda x: x.mid)\n", + "result[\"yBinStart\"] = result[\"yBin\"].apply(lambda x: x.left)\n", + "result[\"yBinEnd\"] = result[\"yBin\"].apply(lambda x: x.right)\n", + "\n", + "\n", + "result = result.drop(columns=[\"xBin\",\"yBin\"])" ] }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 20, "metadata": { "scrolled": true }, @@ -63,10 +83,10 @@ "data": { "text/html": [ "\n", - "
\n", + "
\n", "" ], "text/plain": [ "alt.Chart(...)" ] }, - "execution_count": 15, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -122,10 +142,13 @@ "source": [ "# Altair Rendering Cost\n", "import altair as alt\n", - "chart = alt.Chart(no0result).mark_rect().encode(\n", - " x=alt.X('xBinCtr', type='ordinal'),\n", - " y=alt.Y('yBinCtr', type='ordinal'),\n", - " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"))\n", + "chart = alt.Chart(result).mark_rect().encode(\n", + " x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=\"x\"), bin = alt.BinParams(binned=True)),\n", + " x2=alt.X2('xBinEnd'),\n", + " y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=\"y\"), bin = alt.BinParams(binned=True)),\n", + " y2=alt.Y2('yBinEnd'),\n", + " #opacity = alt.Opacity('z',type='quantitative',scale=alt.Scale(type=\"log\"))\n", + " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"),legend=None)\n", ")\n", "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", "chart = chart.interactive() # Enable Zooming and Panning\n", diff --git a/experiments/manual_heatmap_2x_coarse.ipynb b/experiments/manual_heatmap_2x_coarse.ipynb new file mode 100644 index 00000000..9293b1c7 --- /dev/null +++ b/experiments/manual_heatmap_2x_coarse.ipynb @@ -0,0 +1,188 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=1000" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost\n", + "import pandas as pd\n", + "import numpy as np\n", + "binRange = np.linspace(-10,10,num=21)\n", + "df[\"xBin\"] = pd.cut(df.x, bins=binRange)\n", + "df[\"yBin\"] = pd.cut(df.y, bins=binRange)\n", + "\n", + "\n", + "#groups = df.groupby(['xBinCtr','yBinCtr'])#[\"x\"]\n", + "groups = df.groupby(['xBin','yBin'])[\"x\"]\n", + "result = groups.agg(\"count\").reset_index()\n", + "result = result.rename(columns={\"x\":\"z\"})\n", + "\n", + "result = result[result[\"z\"]!=0]\n", + "\n", + "# result[\"xBinCtr\"] = result[\"xBin\"].apply(lambda x: x.mid)\n", + "result[\"xBinStart\"] = result[\"xBin\"].apply(lambda x: x.left)\n", + "result[\"xBinEnd\"] = result[\"xBin\"].apply(lambda x: x.right)\n", + "\n", + "\n", + "# result[\"yBinCtr\"] = result[\"yBin\"].apply(lambda x: x.mid)\n", + "result[\"yBinStart\"] = result[\"yBin\"].apply(lambda x: x.left)\n", + "result[\"yBinEnd\"] = result[\"yBin\"].apply(lambda x: x.right)\n", + "\n", + "\n", + "result = result.drop(columns=[\"xBin\",\"yBin\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "import altair as alt\n", + "chart = alt.Chart(result).mark_rect().encode(\n", + " x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=\"x\"), bin = alt.BinParams(binned=True)),\n", + " x2=alt.X2('xBinEnd'),\n", + " y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=\"y\"), bin = alt.BinParams(binned=True)),\n", + " y2=alt.Y2('yBinEnd'),\n", + " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"))\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/sampled_scatter.ipynb b/experiments/sampled_scatter.ipynb deleted file mode 100644 index f52fa49f..00000000 --- a/experiments/sampled_scatter.ipynb +++ /dev/null @@ -1,163 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=10000" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "import lux\n", - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost\n", - "if (numPoints>10000):\n", - " df = df.sample(n = 10000, random_state = 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "\n", - "import altair as alt\n", - "\n", - "chart = alt.Chart(df).mark_circle().encode(\n", - " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", - " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/sampled_scatter_20000.ipynb b/experiments/sampled_scatter_20000.ipynb new file mode 100644 index 00000000..33388ddd --- /dev/null +++ b/experiments/sampled_scatter_20000.ipynb @@ -0,0 +1,163 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "numPoints=10000" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import lux\n", + "from utils import generate_scatter_data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "# Pandas Cost\n", + "if (numPoints>20000):\n", + " df = df.sample(n = 20000, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.Chart(...)" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Altair Rendering Cost\n", + "\n", + "import altair as alt\n", + "\n", + "chart = alt.Chart(df).mark_circle().encode(\n", + " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", + " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", + ")\n", + "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", + "chart = chart.interactive() # Enable Zooming and Panning\n", + "\n", + "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", + "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", + "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", + "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", + "chart = chart.properties(width=160,height=150)\n", + "\n", + "chart" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb index 06a55ace..5614062e 100644 --- a/experiments/scatter_analysis.ipynb +++ b/experiments/scatter_analysis.ipynb @@ -36,37 +36,35 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(\"basic_scatter.csv\")\n", "df2 = pd.read_csv(\"heatmap.csv\")\n", "df3 = pd.read_csv(\"sampled_scatter.csv\")\n", - "df4 = pd.read_csv(\"manual_heatmap.csv\")" + "df4 = pd.read_csv(\"manual_heatmap.csv\")\n", + "df5 = pd.read_csv(\"manual_heatmap_2x_coarse.csv\")" ] }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "def plot_loglog(df,label=\"\",color=\"red\"):\n", " plt.xlabel('log (number of datapoints)')\n", " plt.ylabel('log(time) (s)')\n", - "# plt.loglog(df[\"nPts\"], df[\"pandas cost\"],'-o',label=label,color=color)\n", - "# plt.loglog(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", + " plt.loglog(df[\"nPts\"], df[\"pandas cost\"],'-',label=label,color=color)\n", + " plt.loglog(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", + " \n", + "def plot_loglog_total(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('log (number of datapoints)')\n", + " plt.ylabel('log(time) (s)')\n", " df[\"total\"] = df[\"pandas cost\"]+df[\"altair cost\"]\n", - " plt.loglog(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)" - ] - }, - { - "cell_type": "code", - "execution_count": 32, - "metadata": {}, - "outputs": [], - "source": [ + " plt.loglog(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)\n", + "\n", "def plot_logx(df,label=\"\",color=\"red\"):\n", " plt.xlabel('number of datapoints')\n", " plt.ylabel('time (s)')\n", @@ -79,22 +77,42 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.0331747676608791\n", + "0.0038180588235294144\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "print (np.mean(df2[\"altair cost\"]/df[\"altair cost\"]))\n", + "print (np.mean(df2[\"altair cost\"]-df[\"altair cost\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 29, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -110,28 +128,29 @@ "plot_loglog(df3,\"sampled scatter\",\"blue\")\n", "plot_loglog(df2,\"heatmap (bin via Altair)\",\"green\")\n", "plot_loglog(df4,\"heatmap (bin via Pandas)\",\"orange\")\n", + "plot_loglog(df5,\"heatmap (bin via Pandas, coarse)\",\"magenta\")\n", "plt.axvline(x= 3100,linestyle=':',color=\"grey\")\n", "plt.legend()\n" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 33, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ] @@ -143,22 +162,32 @@ } ], "source": [ - "plot_loglog(df,\"basic scatter\",\"red\")\n", - "plot_loglog(df3,\"sampled scatter\",\"blue\")\n", - "plot_loglog(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "plot_loglog(df4,\"heatmap (bin via Pandas)\",\"orange\")\n", - "plt.axvline(x= 3100,linestyle=':',color=\"grey\")\n", + "plot_loglog_total(df,\"basic scatter\",\"red\")\n", + "plot_loglog_total(df3,\"sampled scatter\",\"blue\")\n", + "plot_loglog_total(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "plot_loglog_total(df4,\"heatmap (bin via Pandas)\",\"magenta\")\n", + "plt.axvline(x= 20000,linestyle=':',color=\"grey\")\n", "plt.legend()\n" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 43, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", "text/plain": [ "
" ] @@ -170,17 +199,43 @@ } ], "source": [ - "plot_logx(df,\"basic scatter\",\"red\")\n", - "plot_logx(df3,\"sampled scatter\",\"blue\")\n", - "plot_logx(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "plot_logx(df4,\"heatmap (bin via Pandas)\",\"orange\")\n" + "df6 = pd.read_csv(\"sampled_scatter_20000.csv\")\n", + "plot_loglog_total(df,\"basic scatter\",\"red\")\n", + "plot_loglog_total(df3,\"sampled scatter\",\"blue\")\n", + "plot_loglog_total(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "plot_loglog_total(df4,\"heatmap (bin via Pandas)\",\"magenta\")\n", + "plot_loglog_total(df6,\"sampled scatter 20000\",\"cyan\")\n", + "plt.axvline(x= 20000,linestyle=':',color=\"grey\")\n", + "plt.legend()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "# plot_logx(df,\"basic scatter\",\"red\")\n", + "# plot_logx(df3,\"sampled scatter\",\"blue\")\n", + "# plot_logx(df2,\"heatmap (bin via Altair)\",\"green\")\n", + "# plot_logx(df4,\"heatmap (bin via Pandas)\",\"orange\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Up to about 3000 datapoints, we use scatterplots, above 3000 we use manually binned heatmaps." + "Preliminary insights: \n", + "\n", + "- Cost of drawing a heatmap in Altair cost about 1.03x (3.8ms) more than how much it takes to draw a scatterplot. This makes sense, because with a grid size of 50x50 (around 2500), it would actually be cheaper to draw the scatterplot with fewer number of points, than the full grid of values (minus zeroes). \n", + "- Up to about 3000 datapoints, it is cheaper to draw scatterplots than it is to draw heatmaps.\n", + "- Even though we can sample down to lower the cost of drawing scatterplot. The problem of occlusion kicks in also, which can actually mean that the binned heatmap can actually be a better representation of the data than scatterplots.\n", + "- The cost of all Altair plotting scales linearly as a function of the number of input data tuples (both heatmap and scatterplot cost the same to render). This explains why the cost of drawing heatmap is relatively constant due to the fixed grid size. The scatterplots scale with the number of samples (Blue v.s. cyan). \n", + "- The cost of plotting about 20000 samples scatter is about the same as 50x50 grid.\n", + "\n", + "--> The scatterplot plotting strategy we should use is to plot scatterplots for data size < 5000 and binned heatmap > 5000. (we can suppress the color bar for scatterplots)\n", + "\n", + "--> For colored scatterplot, we can use opacity to signal data size instead of color." ] }, { diff --git a/experiments/scatter_benchmark.py b/experiments/scatter_benchmark.py index 4226650b..51527f56 100644 --- a/experiments/scatter_benchmark.py +++ b/experiments/scatter_benchmark.py @@ -4,9 +4,12 @@ import json # experiment_name = "sampled_scatter" -for experiment_name in ["sampled_scatter","basic_scatter","heatmap","manual_heatmap"]: +# ["sampled_scatter","basic_scatter","heatmap","manual_heatmap","manual_heatmap_2x_coarse"] +for experiment_name in ["sampled_scatter_20000"]: # for experiment_name in ["manual_binned_scatter"]: - trial_range = np.geomspace(10, 1e5, num=9) + # trial_range = np.geomspace(10, 1e5, num=9) + # trial_range = np.geomspace(10, 1e5, num=9) + trial_range = np.geomspace(10, 1e5, num=17) trial = [] #[cell count, duration] for nPts in trial_range: # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" diff --git a/experiments/utils.py b/experiments/utils.py index 6dc650ff..d806130e 100644 --- a/experiments/utils.py +++ b/experiments/utils.py @@ -3,7 +3,7 @@ def generate_scatter_data(numPoints): import pandas as pd import numpy as np from collections import OrderedDict as odict - numPoints = int(numPoints) + numPoints = int(numPoints/5) np.random.seed(1) dists = {cat: pd.DataFrame(odict([('x',np.random.normal(x,s,numPoints)), From 48633d4cb631bee240a8bac69ef56dabac07ff58 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Thu, 24 Sep 2020 19:58:00 +0800 Subject: [PATCH 04/18] incorporated heatmap code into executor and renderer --- lux/executor/PandasExecutor.py | 26 +++++++++++++ lux/interestingness/interestingness.py | 2 + lux/vislib/altair/AltairRenderer.py | 3 ++ lux/vislib/altair/Heatmap.py | 53 ++++++++++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 lux/vislib/altair/Heatmap.py diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index fd828259..e3edff49 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -46,6 +46,7 @@ def execute(vislist:VisList, ldf:LuxDataFrame): if (clause.attribute): if (clause.attribute!="Record"): attributes.add(clause.attribute) + # General Sampling if len(vis.data) > 10000: vis._vis_data = vis.data[list(attributes)].sample(n = 10000, random_state = 1) else: @@ -54,6 +55,11 @@ def execute(vislist:VisList, ldf:LuxDataFrame): PandasExecutor.execute_aggregate(vis,isFiltered = filter_executed) elif (vis.mark =="histogram"): PandasExecutor.execute_binning(vis) + elif (vis.mark =="scatter"): + if (len(vis.data)>=3000): + vis._mark = "heatmap" + PandasExecutor.execute_2D_binning(vis) + @staticmethod def execute_aggregate(vis: Vis,isFiltered = True): @@ -226,7 +232,27 @@ def apply_filter(df: pd.DataFrame, attribute:str, op: str, val: object) -> pd.Da elif (op == '!='): return df[df[attribute] != val] return df + @staticmethod + def execute_2D_binning(vis: Vis): + x_attr = vis.get_attr_by_channel("x")[0] + y_attr = vis.get_attr_by_channel("y")[0] + df = vis._vis_data + df["xBin"] = pd.cut(df[x_attr.attribute], bins=30) + df["yBin"] = pd.cut(df[y_attr.attribute], bins=30) + + groups = df.groupby(['xBin','yBin'])[x_attr.attribute] + result = groups.agg("count").reset_index() + result = result.rename(columns={x_attr.attribute:"z"}) + result = result[result["z"]!=0] + + result["xBinStart"] = result["xBin"].apply(lambda x: x.left) + result["xBinEnd"] = result["xBin"].apply(lambda x: x.right) + + + result["yBinStart"] = result["yBin"].apply(lambda x: x.left) + result["yBinEnd"] = result["yBin"].apply(lambda x: x.right) + vis._vis_data = result.drop(columns=["xBin","yBin"]) ####################################################### ############ Metadata: data type, model ############# ####################################################### diff --git a/lux/interestingness/interestingness.py b/lux/interestingness/interestingness.py index bcc089ef..f272f1f8 100644 --- a/lux/interestingness/interestingness.py +++ b/lux/interestingness/interestingness.py @@ -66,6 +66,8 @@ def interestingness(vis:Vis ,ldf:LuxDataFrame) -> int: return -1 # Scatter Plot elif (n_dim == 0 and n_msr == 2): + if (vis.mark=="heatmap"): + return 0.3 #TODO: Need better interestingness metric for binned scatterplots (heatmaps) if (v_size<2): return -1 if (n_filter==1): v_filter_size = get_filtered_size(filter_specs, vis.data) diff --git a/lux/vislib/altair/AltairRenderer.py b/lux/vislib/altair/AltairRenderer.py index fb7880fe..55d1ab88 100644 --- a/lux/vislib/altair/AltairRenderer.py +++ b/lux/vislib/altair/AltairRenderer.py @@ -5,6 +5,7 @@ from lux.vislib.altair.ScatterChart import ScatterChart from lux.vislib.altair.LineChart import LineChart from lux.vislib.altair.Histogram import Histogram +from lux.vislib.altair.Heatmap import Heatmap class AltairRenderer: """ @@ -44,6 +45,8 @@ def create_vis(self,vis, standalone=True): chart = ScatterChart(vis) elif (vis.mark =="line"): chart = LineChart(vis) + elif (vis.mark =="heatmap"): + chart = Heatmap(vis) else: chart = None diff --git a/lux/vislib/altair/Heatmap.py b/lux/vislib/altair/Heatmap.py new file mode 100644 index 00000000..657f064b --- /dev/null +++ b/lux/vislib/altair/Heatmap.py @@ -0,0 +1,53 @@ +from lux.vislib.altair.AltairChart import AltairChart +import altair as alt +alt.data_transformers.disable_max_rows() +class Heatmap(AltairChart): + """ + Heatmap is a subclass of AltairChart that render as a heatmap. + All rendering properties for heatmap are set here. + + See Also + -------- + altair-viz.github.io + """ + def __init__(self,vis): + super().__init__(vis) + def __repr__(self): + return f"Heatmap <{str(self.vis)}>" + def initialize_chart(self): + # return NotImplemented + x_attr = self.vis.get_attr_by_channel("x")[0] + y_attr = self.vis.get_attr_by_channel("y")[0] + # x_min = self.vis.min_max[x_attr.attribute][0] + # x_max = self.vis.min_max[x_attr.attribute][1] + + # y_min = self.vis.min_max[y_attr.attribute][0] + # y_max = self.vis.min_max[y_attr.attribute][1] + + chart = alt.Chart(self.data).mark_rect().encode( + x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=x_attr.attribute), bin = alt.BinParams(binned=True)), + x2=alt.X2('xBinEnd'), + y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=y_attr.attribute), bin = alt.BinParams(binned=True)), + y2=alt.Y2('yBinEnd'), + #opacity = alt.Opacity('z',type='quantitative',scale=alt.Scale(type="log")) + color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type="log"),legend=None) + ) + chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null + chart = chart.interactive() # Enable Zooming and Panning + + #################################### + # Constructing Altair Code String ## + #################################### + + self.code += "import altair as alt\n" + # self.code += f"visData = pd.DataFrame({str(self.data.to_dict(orient='records'))})\n" + self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n" + self.code += f''' + chart = alt.Chart(visData).mark_bar().encode( + y = {y_attr_field_code}, + x = {x_attr_field_code}, + ) + {topK_code} + chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null + ''' + return chart \ No newline at end of file From dcc8ece3771e104f5a8eb8616c781de928282a2a Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Thu, 24 Sep 2020 21:46:54 +0800 Subject: [PATCH 05/18] additional experiments to evaluate scatter v.s. heatmap performance --- experiments/execute_lux.ipynb | 345 +++++++++++++++++++++++++++++ experiments/lux_benchmark.py | 34 +++ experiments/scatter_analysis.ipynb | 118 ++++++++++ experiments/utils.py | 14 +- lux/executor/PandasExecutor.py | 4 +- lux/vislib/altair/Heatmap.py | 11 +- 6 files changed, 518 insertions(+), 8 deletions(-) create mode 100644 experiments/execute_lux.ipynb create mode 100644 experiments/lux_benchmark.py diff --git a/experiments/execute_lux.ipynb b/experiments/execute_lux.ipynb new file mode 100644 index 00000000..82f77365 --- /dev/null +++ b/experiments/execute_lux.ipynb @@ -0,0 +1,345 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "ncopies=10" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork\n" + ] + } + ], + "source": [ + "cd ../" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import lux\n", + "from utils import generate_airbnb_copies\n", + "df = generate_airbnb_copies(ncopies)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idnamehost_idhost_nameneighbourhood_groupneighbourhoodlatitudelongituderoom_typepriceminimum_nightsnumber_of_reviews
02539Clean & quiet apt home by the park2787JohnBrooklynKensington40.64749-73.97237Private room14919
12595Skylit Midtown Castle2845JenniferManhattanMidtown40.75362-73.98377Entire home/apt225145
23647THE VILLAGE OF HARLEM....NEW YORK !4632ElisabethManhattanHarlem40.80902-73.94190Private room15030
33831Cozy Entire Floor of Brownstone4869LisaRoxanneBrooklynClinton Hill40.68514-73.95976Entire home/apt891270
45022Entire Apt: Spacious Studio/Loft by central park7192LauraManhattanEast Harlem40.79851-73.94399Entire home/apt80109
.......................................
4889036484665Charming one bedroom - newly renovated rowhouse8232441SabrinaBrooklynBedford-Stuyvesant40.67853-73.94995Private room7020
4889136485057Affordable room in Bushwick/East Williamsburg6570630MarisolBrooklynBushwick40.70184-73.93317Private room4040
4889236485431Sunny Studio at Historical Neighborhood23492952Ilgar & AyselManhattanHarlem40.81475-73.94867Entire home/apt115100
488933648560943rd St. Time Square-cozy single bed30985759TazManhattanHell's Kitchen40.75751-73.99112Shared room5510
4889436487245Trendy duplex in the very heart of Hell's Kitchen68119814ChristopheManhattanHell's Kitchen40.76404-73.98933Private room9070
\n", + "

488950 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " id name host_id \\\n", + "0 2539 Clean & quiet apt home by the park 2787 \n", + "1 2595 Skylit Midtown Castle 2845 \n", + "2 3647 THE VILLAGE OF HARLEM....NEW YORK ! 4632 \n", + "3 3831 Cozy Entire Floor of Brownstone 4869 \n", + "4 5022 Entire Apt: Spacious Studio/Loft by central park 7192 \n", + "... ... ... ... \n", + "48890 36484665 Charming one bedroom - newly renovated rowhouse 8232441 \n", + "48891 36485057 Affordable room in Bushwick/East Williamsburg 6570630 \n", + "48892 36485431 Sunny Studio at Historical Neighborhood 23492952 \n", + "48893 36485609 43rd St. Time Square-cozy single bed 30985759 \n", + "48894 36487245 Trendy duplex in the very heart of Hell's Kitchen 68119814 \n", + "\n", + " host_name neighbourhood_group neighbourhood latitude \\\n", + "0 John Brooklyn Kensington 40.64749 \n", + "1 Jennifer Manhattan Midtown 40.75362 \n", + "2 Elisabeth Manhattan Harlem 40.80902 \n", + "3 LisaRoxanne Brooklyn Clinton Hill 40.68514 \n", + "4 Laura Manhattan East Harlem 40.79851 \n", + "... ... ... ... ... \n", + "48890 Sabrina Brooklyn Bedford-Stuyvesant 40.67853 \n", + "48891 Marisol Brooklyn Bushwick 40.70184 \n", + "48892 Ilgar & Aysel Manhattan Harlem 40.81475 \n", + "48893 Taz Manhattan Hell's Kitchen 40.75751 \n", + "48894 Christophe Manhattan Hell's Kitchen 40.76404 \n", + "\n", + " longitude room_type price minimum_nights number_of_reviews \n", + "0 -73.97237 Private room 149 1 9 \n", + "1 -73.98377 Entire home/apt 225 1 45 \n", + "2 -73.94190 Private room 150 3 0 \n", + "3 -73.95976 Entire home/apt 89 1 270 \n", + "4 -73.94399 Entire home/apt 80 10 9 \n", + "... ... ... ... ... ... \n", + "48890 -73.94995 Private room 70 2 0 \n", + "48891 -73.93317 Private room 40 4 0 \n", + "48892 -73.94867 Entire home/apt 115 10 0 \n", + "48893 -73.99112 Shared room 55 1 0 \n", + "48894 -73.98933 Private room 90 7 0 \n", + "\n", + "[488950 rows x 12 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "celltoolbar": "Tags", + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.7" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/experiments/lux_benchmark.py b/experiments/lux_benchmark.py new file mode 100644 index 00000000..4119c437 --- /dev/null +++ b/experiments/lux_benchmark.py @@ -0,0 +1,34 @@ +import papermill as pm +import pandas as pd +import numpy as np +import json + +experiment_name = "execute_lux" +# # ["sampled_scatter","basic_scatter","heatmap","manual_heatmap","manual_heatmap_2x_coarse"] +# for experiment_name in ["sampled_scatter_20000"]: +# for experiment_name in ["manual_binned_scatter"]: +# trial_range = np.geomspace(10, 1e5, num=9) +# trial_range = np.geomspace(10, 1e5, num=9) +trial_range = [1,3,5,7] +trial = [] #[cell count, duration] +for nCopies in trial_range: + # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" + output_filename = "output.ipynb" + # papermill basic_scatter.ipynb output.ipynb -p ncopies 1000000 --execute-timeout 1000 + pm.execute_notebook( + f'{experiment_name}.ipynb', + output_filename, + parameters = dict(ncopies=nCopies) + ) + count = 0 + with open(output_filename) as json_file: + data = json.load(json_file) + for cell in data['cells']: + # For testing out Lux Performance + if cell["execution_count"]==5: + duration = cell["metadata"]["papermill"]["duration"] + trial.append([nCopies,duration]) + print (nCopies,duration) + +trial_df = pd.DataFrame(trial,columns=["nCopies","time"]) +trial_df.to_csv(f"{experiment_name}.csv",index=None) diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb index 5614062e..99cd51c7 100644 --- a/experiments/scatter_analysis.ipynb +++ b/experiments/scatter_analysis.ipynb @@ -238,6 +238,124 @@ "--> For colored scatterplot, we can use opacity to signal data size instead of color." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Analysis of Lux display performance (heatmap v.s. scatterplot)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"execute_lux_heatmap.csv\")\n", + "df2 = pd.read_csv(\"execute_lux_scatter.csv\")\n", + "df3 = pd.read_csv(\"execute_lux_sampled_heatmap.csv\")\n", + "df4 = pd.read_csv(\"execute_lux_sampled_scatter.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_loglog(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('log (number of datapoints)')\n", + " plt.ylabel('log(time) (s)')\n", + " plt.plot(48895*df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)\n", + " plt.yscale('log')" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Altair Rendering Cost')" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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tnuiukeIBhrqqv9/qrplrFN2MnfV119/Xa+//vrC8X379unRo0e1ffv2umjRIlVV3b9/v+bk5JSZFt031fqLL76oN998c+F4oFTnL774op500kmF6dx9HT16VFu1alU4PnXq1MLU7rm5uXrgwAFVLTsV/LPPPquqqrfddpumpKTogQMHdNeuXdqyZcvCctetW1c3btyoubm5es455+icOXMK1//xxx91zZo1esEFF+ixY8dUVXXChAk6a9Ys3bZtm5588sm6a9cuPXr0qJ5++unFjvmRRx7RqVOnlvPpBxbVdO7AfBF5F5jjjV/qTWsI7At7RDPGRFygpO2VSeaekpLC7bffzl133cUFF1zAwIED+frrr2ndujV9+/YFXGJFcGcrgdKilyVQqnOAYcOGcdxxx5VaZ/fu3TRtWvRQ1b59+zJu3DhycnK46KKLCtPPl5UKfuTIkYXHmJWVRVJSEklJSdStW5d9+1w1mJ6eTocOHQCXMv6LL74olrLk448/ZunSpYWfRXZ2Ni1btmThwoUMHjy4MJX86NGji30eLVu2LJXyPVYEE0BuBi4GzvTGZwFveFFsSKQKZowJXTnJ3EnGNVuV1A6YH+I+O3fuzLJly5g3bx73338/Z599Nr/4xS/8Ljtt2rSAadHLogFSnS9cuDBgYsP69esXS+s+aNAgPvvsM9577z3Gjh3LpEmTGDhwYJmp4MtLJQ/BpWm/9tpreeyxx4pNnzt3bpnHHI007cEqtw/ECxRfAP8BPgY+86YZY+LUFKDkE5wbeNNDtW3bNho0aMBVV13FHXfcwbJlyzj11FPZvn07ixcvBuDgwYPk5uYGTIteMo17yfFAqc7L0qxZM/Ly8goDwubNm2nVqhU33HAD119/PcuWLSs3FXwwFi1axKZNm8jPz2f27NmceeaZxeafffbZvP766+zatQuAn376ic2bN9OvXz8+/fRT9uzZQ05OTmHa+wLr1q2je/fuFS5PVQjmMt7LgEW4pqvLgIUiEt5UksaYKjUGmI474xDvdbo3PVRff/11YQfxQw89xP3330+dOnWYPXs2t956K6mpqQwbNowjR44ETIveo0cPEhMTSU1NZdq0aQwZMoQ1a9YUdqIHSnVenuHDh/PFF18ArsO7IPX77NmzmThxYrmp4IPRt29fbrnlFrp06UL79u1LnX117dqVRx55hOHD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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loglog(df,\"heatmap\")\n", + "plot_loglog(df2,\"scatter\",color=\"blue\")\n", + "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", + "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", + "plt.legend()\n", + "plt.title(\"Altair Rendering Cost\")" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_linear(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('log (number of datapoints)')\n", + " plt.ylabel('log(time) (s)')\n", + " plt.plot(48895*df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Altair Rendering Cost')" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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buC1116LdhimhNu2DW64AS67DGrVgtmzYdAgOOKIaEdW+pSPRLE2FWb1hr3rAHXPs3oXOVlkZmZyyy23EB8fT+fOndm3bx8Aq1ev5oILLqBly5acc845LF/uOvb77LPPaN26Nc2bN+e8885j48aNpKWlMWLECIYPH05SUhLff/89PXv2pE+fPpxxxhk0bNiQ6dOn06tXL5o0aULPnj1z1t+nTx+Sk5OJj4/nscceyxkfFxfHfffdR0JCAikpKaxateqw2FesWEGlSpWoUaMGABMmTKBp06YkJibStm1bwB01nXPOObRo0YIWLVrkJLPp06fTrl07LrvsMho2bMgDDzxAamoqKSkpJCQksHr1agB69uzJbbfdRnJyMo0bN86plOtrz5499OrVi5SUFJo3b84nn7juSfbt28e1115LkyZNuOKKK3I+W4BLL72U999/v9Dfmyn7PvvM3Qcxdiw8+qhLEklJ0Y6qFAtHrfJIP/Ltj2JOf9Wp7QI/3q+kmsrhj/crBZ5nTv+gdd7Xrl2rsbGxOn/+fFVV7dKli77zzjuqqtqhQwddsWKFqqr+/PPP2r59e1VV3bZtm2ZlZamq6ptvvqkDBgxQVdXHHntMn3vuuZxl9+jRQ7t27apZWVk6ceJErVq1qi5atEgzMzO1RYsWOevcunWrqqpmZGRou3btdOHChaqqWr9+fR08eLCqqo4ZM0Yvuuiiw+IfNWpUzvpVVZs2barr169XVdW//vpLVVX37Nmj+/btU1XVFStWaPb3MG3aND322GN1w4YNun//fj3hhBP00UcfVVXVF198Ufv375+zHeeff75mZmbqihUrtG7durpv3z6dNm1aTkwPPvhgzuf2119/aaNGjXT37t36/PPP60033aSqqgsXLtTY2FidPXt2TrynnHKKbtmy5bDtsv4oyrdt21RvvNH1F5GQoDpvXrQjii5Ken8UJUpWgHrigcaHqEGDBiR5/6a0bNmStLQ0du/ezYwZM+jSpUvOdAe8eubr16+na9eupKen8/fff9OgQYOAy77kkksQERISEqhduzYJ3gXe8fHxpKWlkZSUxPjx4xk5ciQZGRmkp6ezdOlSmnmXcHTr1i3n+a677jps+enp6dSsWTNn+KyzzqJnz55cc801XHnllQAcPHgwYIn0Vq1aUadOHQBOPvlkOnfuDLjy69OmTcuZ7ppr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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_linear(df,\"heatmap\")\n", + "# plot_linear(df2,\"scatter\",color=\"blue\")\n", + "plot_linear(df3,\"heatmap (sampled)\",color=\"orange\")\n", + "plot_linear(df4,\"scatter (sampled)\",color=\"cyan\")\n", + "plt.legend()\n", + "plt.title(\"Altair Rendering Cost\")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/experiments/utils.py b/experiments/utils.py index d806130e..4a5857da 100644 --- a/experiments/utils.py +++ b/experiments/utils.py @@ -1,7 +1,7 @@ +import pandas as pd +import numpy as np def generate_scatter_data(numPoints): # Example from https://datashader.org/user_guide/Points.html - import pandas as pd - import numpy as np from collections import OrderedDict as odict numPoints = int(numPoints/5) np.random.seed(1) @@ -18,4 +18,12 @@ def generate_scatter_data(numPoints): ( 0, 0, 3.00, 50, "d5")] } df = pd.concat(dists,ignore_index=True) - return df \ No newline at end of file + return df + +def generate_airbnb_copies(ncopies): + df = pd.read_csv("https://github.com/lux-org/lux-datasets/blob/master/data/airbnb_nyc.csv?raw=True") + df = df[['id', 'name', 'host_id', 'host_name', 'neighbourhood_group', + 'neighbourhood', 'latitude', 'longitude', 'room_type', 'price', + 'minimum_nights', 'number_of_reviews']] + df_copies = pd.concat([df for _x in range(ncopies)]) + return df_copies \ No newline at end of file diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index e3edff49..2d0671d0 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -51,12 +51,14 @@ def execute(vislist:VisList, ldf:LuxDataFrame): vis._vis_data = vis.data[list(attributes)].sample(n = 10000, random_state = 1) else: vis._vis_data = vis.data[list(attributes)] + # vis._vis_data = vis.data[list(attributes)] + if (vis.mark =="bar" or vis.mark =="line"): PandasExecutor.execute_aggregate(vis,isFiltered = filter_executed) elif (vis.mark =="histogram"): PandasExecutor.execute_binning(vis) elif (vis.mark =="scatter"): - if (len(vis.data)>=3000): + if (len(vis.data)>=50000): vis._mark = "heatmap" PandasExecutor.execute_2D_binning(vis) diff --git a/lux/vislib/altair/Heatmap.py b/lux/vislib/altair/Heatmap.py index 657f064b..4f7dec5a 100644 --- a/lux/vislib/altair/Heatmap.py +++ b/lux/vislib/altair/Heatmap.py @@ -43,11 +43,14 @@ def initialize_chart(self): # self.code += f"visData = pd.DataFrame({str(self.data.to_dict(orient='records'))})\n" self.code += f"visData = pd.DataFrame({str(self.data.to_dict())})\n" self.code += f''' - chart = alt.Chart(visData).mark_bar().encode( - y = {y_attr_field_code}, - x = {x_attr_field_code}, + chart = alt.Chart(self.data).mark_rect().encode( + x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=x_attr.attribute), bin = alt.BinParams(binned=True)), + x2=alt.X2('xBinEnd'), + y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=y_attr.attribute), bin = alt.BinParams(binned=True)), + y2=alt.Y2('yBinEnd'), + #opacity = alt.Opacity('z',type='quantitative',scale=alt.Scale(type="log")) + color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type="log"),legend=None) ) - {topK_code} chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null ''' return chart \ No newline at end of file From b7e0f60f2753506308ec885632e90dd6d9270da8 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 25 Sep 2020 11:48:34 +0800 Subject: [PATCH 06/18] experiment based on real estate and airbnb data --- experiments/execute_lux.ipynb | 307 ++++++----------------------- experiments/lux_benchmark.py | 7 +- experiments/scatter_analysis.ipynb | 125 +++++++++++- experiments/utils.py | 13 +- lux/executor/PandasExecutor.py | 5 +- 5 files changed, 201 insertions(+), 256 deletions(-) diff --git a/experiments/execute_lux.ipynb b/experiments/execute_lux.ipynb index 82f77365..2b9c85b0 100644 --- a/experiments/execute_lux.ipynb +++ b/experiments/execute_lux.ipynb @@ -10,13 +10,15 @@ }, "outputs": [], "source": [ - "ncopies=10" + "ncopies=5e4" ] }, { "cell_type": "code", "execution_count": 2, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -38,262 +40,62 @@ "source": [ "import pandas as pd\n", "import lux\n", - "from utils import generate_airbnb_copies\n", - "df = generate_airbnb_copies(ncopies)" + "from utils import downsample_realestate\n", + "df = downsample_realestate(ncopies)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork/lux/executor/PandasExecutor.py:265: UserWarning: \n", + "Lux detects that attributes ['Month', 'Year'] may be temporal.\n", + "In order to display visualizations for these attributes accurately, temporal attributes should be converted to Pandas Datetime objects.\n", + "\n", + "Please consider converting these attributes using the pd.to_datetime function and providing a 'format' parameter to specify datetime format of the attribute.\n", + "For example, you can convert the 'month' attribute in a dataset to Datetime type via the following command:\n", + "\n", + "\t df['month'] = pd.to_datetime(df['month'], format='%m')\n", + "\n", + "See more at: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html\n", + "\n", + " self.compute_data_type(ldf)\n", + "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork/lux/core/frame.py:55: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " super(LuxDataFrame, self).__setitem__(key, value)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "24a65d21dbaf4164b7ef30942e422f0d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Button(description='Toggle Pandas/Lux', layout=Layout(top='5px', width='140px'), style=ButtonStyle())" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idnamehost_idhost_nameneighbourhood_groupneighbourhoodlatitudelongituderoom_typepriceminimum_nightsnumber_of_reviews
02539Clean & quiet apt home by the park2787JohnBrooklynKensington40.64749-73.97237Private room14919
12595Skylit Midtown Castle2845JenniferManhattanMidtown40.75362-73.98377Entire home/apt225145
23647THE VILLAGE OF HARLEM....NEW YORK !4632ElisabethManhattanHarlem40.80902-73.94190Private room15030
33831Cozy Entire Floor of Brownstone4869LisaRoxanneBrooklynClinton Hill40.68514-73.95976Entire home/apt891270
45022Entire Apt: Spacious Studio/Loft by central park7192LauraManhattanEast Harlem40.79851-73.94399Entire home/apt80109
.......................................
4889036484665Charming one bedroom - newly renovated rowhouse8232441SabrinaBrooklynBedford-Stuyvesant40.67853-73.94995Private room7020
4889136485057Affordable room in Bushwick/East Williamsburg6570630MarisolBrooklynBushwick40.70184-73.93317Private room4040
4889236485431Sunny Studio at Historical Neighborhood23492952Ilgar & AyselManhattanHarlem40.81475-73.94867Entire home/apt115100
488933648560943rd St. Time Square-cozy single bed30985759TazManhattanHell's Kitchen40.75751-73.99112Shared room5510
4889436487245Trendy duplex in the very heart of Hell's Kitchen68119814ChristopheManhattanHell's Kitchen40.76404-73.98933Private room9070
\n", - "

488950 rows × 12 columns

\n", - "
" - ], + "application/vnd.jupyter.widget-view+json": { + "model_id": "7877fef1c2af4a9abd1a95b2dbe17b70", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - " id name host_id \\\n", - "0 2539 Clean & quiet apt home by the park 2787 \n", - "1 2595 Skylit Midtown Castle 2845 \n", - "2 3647 THE VILLAGE OF HARLEM....NEW YORK ! 4632 \n", - "3 3831 Cozy Entire Floor of Brownstone 4869 \n", - "4 5022 Entire Apt: Spacious Studio/Loft by central park 7192 \n", - "... ... ... ... \n", - "48890 36484665 Charming one bedroom - newly renovated rowhouse 8232441 \n", - "48891 36485057 Affordable room in Bushwick/East Williamsburg 6570630 \n", - "48892 36485431 Sunny Studio at Historical Neighborhood 23492952 \n", - "48893 36485609 43rd St. Time Square-cozy single bed 30985759 \n", - "48894 36487245 Trendy duplex in the very heart of Hell's Kitchen 68119814 \n", - "\n", - " host_name neighbourhood_group neighbourhood latitude \\\n", - "0 John Brooklyn Kensington 40.64749 \n", - "1 Jennifer Manhattan Midtown 40.75362 \n", - "2 Elisabeth Manhattan Harlem 40.80902 \n", - "3 LisaRoxanne Brooklyn Clinton Hill 40.68514 \n", - "4 Laura Manhattan East Harlem 40.79851 \n", - "... ... ... ... ... \n", - "48890 Sabrina Brooklyn Bedford-Stuyvesant 40.67853 \n", - "48891 Marisol Brooklyn Bushwick 40.70184 \n", - "48892 Ilgar & Aysel Manhattan Harlem 40.81475 \n", - "48893 Taz Manhattan Hell's Kitchen 40.75751 \n", - "48894 Christophe Manhattan Hell's Kitchen 40.76404 \n", - "\n", - " longitude room_type price minimum_nights number_of_reviews \n", - "0 -73.97237 Private room 149 1 9 \n", - "1 -73.98377 Entire home/apt 225 1 45 \n", - "2 -73.94190 Private room 150 3 0 \n", - "3 -73.95976 Entire home/apt 89 1 270 \n", - "4 -73.94399 Entire home/apt 80 10 9 \n", - "... ... ... ... ... ... \n", - "48890 -73.94995 Private room 70 2 0 \n", - "48891 -73.93317 Private room 40 4 0 \n", - "48892 -73.94867 Entire home/apt 115 10 0 \n", - "48893 -73.99112 Shared room 55 1 0 \n", - "48894 -73.98933 Private room 90 7 0 \n", - "\n", - "[488950 rows x 12 columns]" + "Output()" ] }, "metadata": {}, @@ -312,6 +114,13 @@ "df" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/experiments/lux_benchmark.py b/experiments/lux_benchmark.py index 4119c437..7e0e57bc 100644 --- a/experiments/lux_benchmark.py +++ b/experiments/lux_benchmark.py @@ -9,7 +9,10 @@ # for experiment_name in ["manual_binned_scatter"]: # trial_range = np.geomspace(10, 1e5, num=9) # trial_range = np.geomspace(10, 1e5, num=9) -trial_range = [1,3,5,7] +# trial_range = [1,3,5,7] +# trial_range = np.geomspace(10, 4e5, num=10) # airbnb +trial_range = np.geomspace(10, 7e5, num=12) # real estate (total 739818) +# trial_range = [10,100, 1000, 10000] trial = [] #[cell count, duration] for nCopies in trial_range: # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" @@ -31,4 +34,4 @@ print (nCopies,duration) trial_df = pd.DataFrame(trial,columns=["nCopies","time"]) -trial_df.to_csv(f"{experiment_name}.csv",index=None) +trial_df.to_csv(f"realestate_heatmap_unsampled.csv",index=None) diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb index 99cd51c7..f779727a 100644 --- a/experiments/scatter_analysis.ipynb +++ b/experiments/scatter_analysis.ipynb @@ -356,12 +356,133 @@ "plt.title(\"Altair Rendering Cost\")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### New set of experiments" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"airbnb_heatmap_unsampled.csv\")\n", + "df2 = pd.read_csv(\"airbnb_scatter_unsampled.csv\")\n", + "df3 = pd.read_csv(\"airbnb_heatmap_sampled.csv\")\n", + "df4 = pd.read_csv(\"airbnb_scatter_sampled.csv\")" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 117, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "def plot_loglog(df,label=\"\",color=\"red\"):\n", + " plt.xlabel('log (number of datapoints)')\n", + " plt.ylabel('log(time) (s)')\n", + " plt.loglog(df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Total Lux Display Cost (Airbnb)')" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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yODLPPzTwzz8U37KUuedn376iZ9++innEw0e4ejRvLXnB2MUwsMhKAj8/PRruLPSudZjjIIB4O2ub/N217ctkdW1a1e6du1qiSxD3qlaNev2OnVcJ8MnjYJSqo9SanpsbAHrdadN0B05AiL6dfRolxiGlJQUHnroIRo3bkyPHj2Ij4/n4MGD9OzZkxYtWnDrrbeyd68ulrVkyRLatGlDWFgY3bp149SpU0RGRjJt2jSmTp1KaGgov//+OyNHjmTMmDHcfPPN1KtXj4iICEaNGkWjRo0yrBYZM2YMLVu2pHHjxrz++uvp7UFBQTz//PM0bdqU1q1b888//xT4cxrcT7va7WhXu50lsmrXrk3t2rVzPtFgOVFREB8PjrOhgYHa2ewyRMRntxYtWogje/bsubbz5JMiHTs630qUENHmIONWooTza558MpNMRw4fPiz+/v7y559/iojIwIED5auvvpIuXbrI/v37RURkw4YN0rlzZxEROXfunKSmpoqIyIwZM+SZZ54REZHXX39d3n///fT7jhgxQgYPHiypqamyaNEiKVu2rOzcuVNSUlKkefPm6fJiYmJERCQ5OVk6duwoO3bsEBGRunXrysSJE0VEZM6cOdKrV68cP0thIcPvwsf469Rf8tepvyyRderUKTl16pQlsgy558oVkZYtRcqUEXn3XZG6dUWU0q9z5+b9fsAWcdKv+uSSVJeRmJi39jwQHBxMaGgoAC1atCAyMpJ169YxcOBAOzFaTlRUFIMHDyY6OpqrV69mu3SyT58+KKVo2rQp1apVo2nTpgA0btyYyMhIQkNDmT9/PtOnTyc5OZno6Gj27NlDs2bNABgyZEj669NPP13gz2lwP48tewywJk5h2bJlgIlT8CZE4JFHYMsWWLQI+vWD591YgLRwG4UPP8z+eFCQnjJypG5diIgokOgSJUqkv/f39+fUqVNUqFCB7du3Zzr38ccf55lnnqFv375EREQwYcKEHO/r5+eXQYafnx/JyckcPnyYKVOmsHnzZipWrMjIkSMzBPLZr8Tx9VU5RYX3u79vmazu3btbJsuQOz76CL78Et54QxsEd+OTPgWXMWmSnpCzx+UTdJpy5coRHBzMggULAD1tt2PHDgBiY2OpWbMmAHPmzEm/pmzZsly8eDFPcuLi4ihdujTly5fn1KlT/PzzzxmOz5s3L/21bdu2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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loglog(df,\"heatmap\")\n", + "plot_loglog(df2,\"scatter\",color=\"blue\")\n", + "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", + "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", + "plt.legend()\n", + "plt.axvline(x= 10000,linestyle=':',color=\"grey\")\n", + "plt.axvline(x= 4e3,linestyle=':',color=\"green\")\n", + "plt.title(\"Total Lux Display Cost (Airbnb)\")" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [], + "source": [ + "df = pd.read_csv(\"realestate_heatmap_unsampled.csv\")\n", + "df2 = pd.read_csv(\"realestate_scatter_unsampled.csv\")\n", + "df3 = pd.read_csv(\"realestate_heatmap_sampled.csv\")\n", + "df4 = pd.read_csv(\"realestate_scatter_sampled.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 1.0, 'Total Lux Display Cost (Real Estate)')" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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Lo6IiAgWLlzIjBkzyMjIICEhgV27dtGiRQsA7r333pz1U089dYX8hIQErrrqqpztm2++meHDhzNo0CDuuusuANLT052GKY+KiqJu3boAXHvttfTq1QvQIdDXrFmTc96gQYPw8/Pj+uuvp1GjRjmtqWychTRft24dTzzxBKBjVmWXK5tatWpx9OhRatSo4fQ7LIsEWzjQv2awdbklSoL339fdS//+t25BGFzHtw1EZAHxvheH2rqX8hDcEHrEFPm2gYGBOZ/9/f1JTU0lKyuLqlWrss1BBqOxY8fy9NNP079/f2JiYpg8eXKBsv38/HLdx8/Pj4yMDA4cOMC0adPYvHkz1apVY/jw4aSlpeWcp5Ry+DmbChUqcO7cuZztjz/+mI0bN7J8+XIiIyPZunUr77//vtMw5Xl1stfXPg1q3nvn3RYnIc0LIi0tjQoVKhTqmrLA7t27ASyJR/X17q8BuKvJXW7LKm527NDRWfv1g9GjPa1N6aNs+yDCXwf/PG9W/sF6v8VUrlyZsLAwFi1aBOgKcPv27YDOOFevXj0A5syZk3NN3jDfrpCUlETFihWpUqUKx48fZ+XKlbmOL1iwIGfdvn37K65v0qRJLt/E/v37adu2La+++ipXXXUVhw8fdhqmvDAsWrSIrKws9u/fz19//XWFIXAW0rxz5845+bp/++03duzYkXONiHDs2DFLkuL4Ghs3bmTjxo2WyHpv43u8t9F7063Z55mPjISgIPjsM3DwPmQogLJtIMKGQpsZusWA0us2M/T+YiA6OprPPvuM8PBwmjZtmuN4nTx5MgMHDiQyMjJXash+/frxzTff5DipXSE8PJyWLVty4403ct9993HzzTfnOp6YmEiLFi149913mT59+hXXd+7cmV9//TWnYn722Wdp3rw5zZo1o0OHDoSHhzNmzBjmzJlDeHg4f/zxR5GSFDVo0IA2bdpw22238fHHH1+RLOmll14iPT2dFi1a0LRpU1566SVAO+CTk5Np0qQJL7/8MpGRkTnXbN26lXbt2lGunG83jIvCkCFDGDJkiCWylgxZwpIhSyyRZTXR0Tor3MGDOpxGRobOEPndd57WrHRiwn2XIUJDQ9myZUuB+YnHjRtHv379cvJcW83w4cPp27evpZO3QOvdv39/brnlliuOmeeibJBflkhb1lUDrof7LtstCINDJk6cyIULFzytRqFp1qyZQ+Ng0N1xv/32myWyFvy2gAW/LbBEltXYUrO7vN+QP6YtXoaIc/EVqnbt2vTv37/Y9Jg9e3axyB01ykRecUZ2S9uKWf4fbfkIgMHNBrsty2quvhqOHLlyf4MGJa+LL2AMhMFQBhjqbh5dO1YMXWGZLCtJSQFH7icr8syXVUwXk8FQBggICCAgIMASWcEBwQQHeFcChawsGDYMDh+GZ57RPgel9HrGDPfzzHsV9sO0QkP1djFRKlsQJty3wVA4socD551YWBTm7ZgHwLAWw9yWZRUTJ8LixTrW0rhxYJtf6XtkD9PK9hEePKi3oVisYKlsQYjIUhF52MosWQaDLxMbG0tsbKwlsj6N/ZRPYz+1RJYVzJoF//wnPPoo2CbZ+y4vvHDZOGRz4YLeXwyUSgPh68TFxeVMBgPYtm0bK1a43++bmppKly5dijSxzV1CQ0M5deqUy+fPnj2bxx9/HIAPPviAmTNnFpdqZYL777+f+++/3xJZ39//Pd/f/70lstwlJka/QPfsCe+9VwYmw5XwMK0ybyCigVD0FxFq2/Y0VhgI+7AW2cycOZO77roLf39/t3UsSUaMGMH777/vaTVKNf7+/pb97gH+AQT4W+PPcIc//4S77oLrr4eFC8EiF4v3smcPOPsNi2mYVpk2ENHAw4At2DcHbdvuGImUlBT69OlDeHg4zZo1ywltsXnz5pyZyG3atOH8+fNOw2aPHz+eH3/8kYiICP75z3/y8ssvs2DBAiIiIliwYIHTUNizZ8+mf//+dO/e3eF8gOjoaAYMGADooHydO3cmIiKCZs2a5czUzi9U+IQJE4iIiKB169bExsZy6623cu211/Lxxx8DOtx3586d6dOnDzfccAOPPvooWVlZV+gxb9482rRpQ0REBI888khOi2bWrFk0btyYNm3a8NNPP+WcHxwcTGhoKJs2bXLjlynbbNu2zWEcsKIwe9tsZm+bbYmsonLmDPTpo+vLZcugalWPqlP8fPstREXpuCF28c6A4h2m5UrIV29dCgr3PU5EuuSzBDoRHJjPNfkH+xb58ssvZeTIkTnbZ8+elYsXL0pYWJhs2rRJRETOnTsn6enp+YbNtg/FPWvWLHnsscdytp2Fwp41a5bUq1cvJ9y3PRcvXpTatWvnbE+bNi0n9HdGRoYkJSWJSP6hwj/88EMREXnyySelefPmkpSUJCdOnJBatWrl6B0YGCj79++XjIwM6dGjhyxatCjn+pMnT8quXbukb9++cunSJRERGT16tMyZM0eOHj0q9evXlxMnTsjFixelQ4cOucr82muvybRp0wr49p1T1sN9z5o1S2bNmmWJrC6zukiXWV0skVUULl4U6dpVpHx5kfXrPaZGyZCZKTJpkgiIREaKHDwoMm+eSMOGIkrp9bx5hRaLCfddMM6CersT7Lt58+Y888wzPP/88/Tt25dOnTqxc+dO6tatS1RUFKAD94FubTgLm50fzkJhA/Ts2ZPq1atfcc2pU6eoaveaFSKdOr4AACAASURBVBUVxYgRI0hPT+eOO+7ICU+eX6jw7MlzzZs3Jzk5mZCQEEJCQggMDOTs2bMAtGnThkaNGgE6pPj69etzhdT44Ycf2Lp1a853kZqaSq1atdi4cSNdu3bNCTU+ePDgXN9HrVq1rggJbnAd+4RS7hIzPMYyWYVFREdljYmBuXMhT6gx3+LcOT12d9kyePBB+OgjqFBBj1YqoXG7Pm0gCgj2TSi6WykvDYGYIt6zcePGxMbGsmLFCl588UVuueUW7rzzTofnTp8+3WnY7PwQJ6GwN27c6DRwXoUKFXKF/e7cuTPr1q1j+fLlDB8+nKeffppOnTrlGyq8oFDj4FoY7wcffJA333wz1/7FixfnW2YTxtsAevjqzJnw4ou67vRZdu2CO+6AAwfggw9gzBiPeODLtA/idSDvdJ9g2/6icvToUYKDgxk2bBjPPvsssbGx3HDDDSQkJLB582YAzp8/T0ZGhtOw2XnDfOfddhYKOz+qVatGZmZmToV/8OBBateuzahRoxg5ciSxsbEFhgp3hU2bNnHgwAGysrJYsGABHTt2zHX8lltu4csvv+TEiRMAnDlzhoMHD9K2bVvWrl3L6dOnSU9PzwmLns3evXstCRNRVtm6dStbt261RNYnWz/hk62fWCKrMCxeDM8/D4MGwSuvlPjtS46vv4a2bXUL4v/+Dx57zGPDs8q0gRgKzEC3GJRtPcO2v6js3LkzxwH7yiuv8OKLL1K+fHkWLFjA2LFjCQ8Pp2fPnqSlpTkNm92iRQv8/f0JDw9n+vTpdOvWjV27duU4qZ2Fwi6IXr16sX79ekA7lLNDgy9YsIBx48YVGCrcFaKionj88cdp0qQJYWFhV7SebrrpJl577TV69epFixYt6NmzJwkJCdStW5fJkyfTvn17br755isir/7000/07Nmz0PoYNL///ju///67JbIW/L6ABb+XbLC+2FjdqxIVBbNn60nEPkdmpp7PcPfdcNNNsHUrdOrkWZ1ccVR461JgTmpDLrZu3SrDhg0rNvl5netWERsb67be5rkovcTHi1x9tUiDBiIJCZ7Wppg4c0akd2/tjB45UiQtrVhvh3FSG/LSqlUrunXrRmZmZqmaC3Hq1Cn+8Y9/eFoNgwdISdHpQpOS4KefoE4dT2tUDOzcCXfeqSe7/ec/l0NneAHGQJQxRowYUWyyu3btSteuXS2Xa7qW3Cfb/5U9eswdPtz8IQBjosa4LSs/sgPwbd+upwFYEEbK+1i4EB56CKpUgbVrwUEaYE/iiz15BoMhD3v37nV5GHVBLN27lKV7l1oiKz8mTNCO6X/9S0+K8ykyMrTHffBgiIjQ/gYvMw7goy0IEblieKWh7CKlOK2uVViZD2Ll0MKPbissn30Gb72l5zz4XAC+06dhyBBYvVoX8J13oHx5T2vlEJ9rQQQFBXH69GlTKRgAbRxOnz7t8hwTg+eJidGRWXv18sEAfNu2QevWsG4dfPopfPih1xoH8MEWxDXXXEN8fDwnT570tCoGLyEoKIhrrrnG02p4lF9++QWAdu3auS3r3V/eBWBcu3Fuy8rL3r2XA/AtWOA4Q1yp5b//hZEjoXp1+PFHaNPG0xoViC99/YDOnBUWFuZpNQwGr+LAgQOANQbihwM/ANYbiDNnoG9fHwzAl5EBzz0H06freQ2LFkHt2p7WyiVUae6Kad26tWQnYzcYDKWXS5fg1lthwwY9edhnYiydPKkd0WvWwNix8Pbb7sclPxAN21+AC4cguAGEvw5hhfMxKaW2ikjrgs7zuRaEwWAoXdgH4Js3z4eMw9aten7DiRN6+veDD7ov80A0bHoYMm1Z5S4c1NtQaCPhCj7npDYYDFeyYcOGnHwj7jJtwzSmbbAu6fPUqToA30svlViQ0uLn88+1pVNKz/CzwjgAbJ942Thkk3lBtyiKAdOCMBjKAPHx8ZbJ+jn+Z8tkffMNjB+ve2FKbQC+6GgdQ+nQIahfH268Eb77Drp10552Wwh7tzm1UXcrOcLZfjfxGh+EUqoR8AJQRUTuKeh8MD4Ig6E0ExurfbbNm+su+lIZzT06WofGuJDnrf622/T0byuGYV1KhG0TYd9/QPmBOMgpH9wQ7ohzWaSrPohi7WJSSs1USp1QSv2WZ39vpdQepdQ+pdR4ABH5S0T+Vpz6GAwG7+DIER1jqWZNWLKklBoH0C2HvMYBdD4Hd42DiPY5LLsR9s+AG8ZB1H/AP0+SAv9g7aguBoq7i2k28AHwefYOpZQ/8G+gJxAPbFZKfSsiu4pZF4OhzJId5j1vfo6iMGX9FADGdxxfpOvtA/Bt2FBqRnw65pCTrh1n+10laQ9sHgPH/w9qtIGuq6B6S33MP8jtUUyuUqwGQkTWKaVC8+xuA+wTkb8AlFLzgQGASwZCKfUw8DBAgwYNLNPVYPBljh07Zpmsbce2Ffla+wB8S5fq7qVSyZkz8MYb+i3fEUWtmzLT4Pc3YdcU8K8AUR/BtaPAzy76ctjQYjMIefGEk7oecNhuOx5oq5SqgU7m1lIpNUFE3nR0sYjMQOf1oXXr1t7hQDEYvBz7vODuMv+e+YW+JtuPe9CW4/f+++H22y1TqeRIS4P339fG4dw56NIFNm2C1NTL5wQHw+tF6PJJ+E63GpL3Q+hQaDkNKng2vrnXDHMVkdMi8qiIXOvMOBgMhtJHth/3oF0C+K++0vtLDVlZMHcu3HCDnhXdoYNuBsXEwCefQMOGekhrw4YwY0bhxuumJsD6IbDmVu2E7r4aOszzuHGAAloQSqlrgCFAJ+BqIBX4DVgOrBSRrCLc8whQ3277Gts+g8FQTKxduxaALl26uC3rH2t18qaXuriW6taRH/fCBb2/VMx7+P57bRS2bYPISJg1C7p3v3x86NCiFSQrE/78CHa8AJkXofkrcNNz2sfgJTg1EEqpWejuoGXAP4ETQBDQGOgNvKCUGi8i6wp5z83A9UqpMLRhGALcVxgBSql+QL/rrruukLc2GMomp0+ftkzWntN7CnV+cflxi51t23TOhu++g9BQHWxv8GBrEmKf2QqbHtHrOj2g9YdQ+Xr35VqM03kQSqlmIvKbw4P6eHmggYjsy+ecL4CuQE3gODBJRD5TSt0OvAP4AzNFpEhjtMw8CIPBuzlzRo9Sysi48ljDhhAXV+IqFczBg3pa97x5UK0avPgijBkDgYHuy750Dna8BH/+GwKvglbvQMPBJR7T3O1YTI6Mg1KqGlBfRHaIyCXAqXGwybjXyf4VwIqClDMYDKWXS5fg7rv1QJ/AQLh48fKxovpxi5XERHjzTZ2EAnS30vjx1oSVFYFDiyD2SUg9BtePgfDXoLx3h6wtcBSTUioG6G87dytwQim1QUSeKmbdDAaDRaxZswaAbt26uS3r5TUvA/Bqt1ednpM3AB9cjkbRoIE2Dl7jf7h4Ef79b3jtNTh7Fh54AF59tehDVfNyfj9seQwS/gfVWkLnJVDD/dzgJYErw1yriEiSUmok8LmITFJK7ShuxfLD+CAMhsKRlJRkmazDSYcLPGfatCsD8HmNQcgmKwvmz9eWKy5Oxxv/5z8hPNwa+ZkXYfdU+P11UAEQ+a5uOfiVnhB4BcZiUkrtBHoBc4AXRGSzUmqHiLQoCQXzw/ggDAbvY/FinRVu0CD44gsvTRn6ww+6Cyk2FiIidALsnj2tk398DWwerWdENxgIraZDcD3r5LuJlfkgXgX+B6y3GYdGwJ/uKmgwGHyP2FjdUmjTRo8G9TrjsGOHHpm0apXuQpo7F+67z72RSfYJfCrUg4oN4dRPUDEMuq6Aq2+zTv8SxmuiuRYF04IwGFxj9erVAPTo0cNtWRNWTwDgzR6557MeOaINQ7lysHEj1LGf52VBFjS3OHwYXn4Z5syBKlX0yKTHHoMgN+cc5E3gk029AXDzF1DOO6MQut2CUEq9CHwoImecHO8OBIvIsqKraTAYSoJU+1AQbnI69co5FfYB+H76yYFxKMEsaLnyM9SrBy1b6sluWVnwzDMwYQJUr1402ZlpkHwAzu+D5H2w4+UrjQNA4javNQ6FIb95EAOA54A0IBY4iZ4odz0QAawG3hCRkyWjai7dsp3Uo/7808t7uzz95mQoHUSPgbMzoGomnPWHqg/D0A89rZVLZGXp4azffquXPn1sB0Qg/Rwsv0mHk8hLcH24w+LZcp9/Do8+mjs2EujsbvPm6QlvBZGRCsl/aQNwfh+c//OyQUg5BLjS66LgvqIEmiiYaHTinENAA3QAu8LWKK62IFxxUl8P3AzURYfa2A2sExHrXkmKiNd3MTlqfvoHQ5sZvmEkStr4lXQlWlLlix4Dlz4C+3lYF4Hyo4uvfO6ULSsD0o5D2jFITeCreQls++UYA/sm0OJ6vY+0Y3rJTMtfVkBlCKwFQVdBUK3LnyUE0oMhrTyk+EMSkJgOiUl69l1iol7bf05MhORk6AAMQk/PPQUsBI7kmZWXcUEHxctrAM7vgwvx5DIC5atDyHUQcj1Uus722ba9spXjbG6FTODjKtHoUNb2bZZgdPTSwjyZlhkIb8brDcTiUN2czktwA7jDwX4rsG9eF+eA8wPRsGEEqEuX90l56DDTNyrRwpQvK1O/BGQkQ3oyZKbodUaK3pezTobURLiQCGnn4OI5uHQezq+HAAc6pAPVu0NQZQiqChWqQEAIlAuGchX14u/oc559fuX47rvvAOjVq5fzsrX9EGp1hrQEPZkrNSHPZ73+e7zuNJiWJ5OmlK+OqlAXgupA+VrgVw2yqsDuKVDJQT1zATjWGNR58E+BwDSokA4VRcdYyEsWkAKcV5AaABeDIKuiNib+1aB8TdixHPoC5fN8j1uAYX+zGYR9kJon/FtgTVvlf/1lA5BtDALz6Y4q4ZfAUMBRzdEQiCuEHGMgvIFoBY5GcQhQuTFUbKCNRc66oe3zNUUL2OUo/WFwcOGjS+YlK0NXEmcPQtIhSI6HPS+Dn4O3w6xyUN6W2ERshRfbZ7H/LIDSf3rQa8m7iF5nAeU3gqMu3VQgqxP4++shM35+4Odgrey2lQJ/29p+X865Co5+CerilffL8ody9SArFSQVuAgqvXDfZ5ptuWhbN8D5cxKPNorlbetACh+DWQWw/GQfUAH0Cd0OSftBOUhb6RB/oCpkVYb0inAxiMfOxEO64tG4rjy6/jFCM88wu+okAs6e1U6IpCRIt/tOOgAjudK4fwocv1b7A6pVs1tXg+qBUN0fKgPBGRB0CQJSwS8ZMs5A2gm4eALSTsIlh27SKwmqldsI2LcG3JnRXEItzTNADSfHFJf/Sq5gDIQ38O9yUM3BH/ECsDcIqmfp4yEOzkkNhLSKcLESpFeGjKqQVQ2kBvhdBf5VITBIxzDIXp5+GhqfurJ5vbsaTJyo+2XT0vQ69YLuH5azoM6B33kolwzlUyEoDYIv6j9mSKZ+o3O1UhLgAPqJzbtky7D/7Ofk3LxLJZxXoqlc2S0sedYF7c97rGo+99vM5cr9om3JLAeqgl7KBYN/Rf22H1gZAqtAhapQoRpUqgYhVSAkBCpV0uvdvfSzkJczflB3oc47kLOchfNnIPk0XDgLqXYtkfQU8M+4bEjsjYr90i6fsn0MnLVbUhx8VxUq8GdwOG0TV1Kn/Bk2tB5H1Rr+ULly7iUkRK+feQauP6mfyxrAaRx3+xSVrHS4eEobjRURzss2tHTWdanA+8Cb6J/EEcXVgig9U/rsKDUzqf+bCY+Q+1u+CMwCmt4Pxy/qaf7pF8A/CQKSICgZKlyA4FQISYOQ81D7MJTP83BfQhuAePQf7jTQD+jM5eb1VegOy9hE2P0sVEFXfLUVVBHH3RqZfrrpfqkiZFSCCyFwoQqoquBXAwJq6O6DlAnaCOXlFNDjZ/1G7+fneF2UYzMqODa2Z/1h6CkdDS4jQ7+5WvH51CP6+3NUvqGbLlfu2RW9v6M+ERc59ghcdNB9Vu0R7f0tDGlpeQzKOR0+wn771KvOyzZg6pUVfZ5K/8z5APq0A38FyzZWpWqjpfnr5OenW7Yb8rZsLQrG5BcAFerqpWJDx926FRtac68SJBOYC7yE/pvfjs678A+u9EEUV1irfFsQSqkgdI/eFfkgROT3YtLJZby+BREaCo8dhNroN+WivjmJ6GZ0yiHdjE0+COf/0uuUQ5AWD5dO5HM9uo+1Qp3Lf6SgOno77zqgqmuzmwbUhDtOX1mpLa4BS065XjZXKWkfhCfKd3YGVMmEc9Y74FetWgVA79693SrbpUtw7WNPcvQorJv4Djff7KICJekbK+UDQwQdyXQ8urJtg8630NV2vCRHMeU3D+IVtHGIATaSOx/EFJvxeEZEPBqXyat5/QXIfFj/2gts+4ry5qQUBNbQS3bi8rxkXoT5QY6b1wD3WDwaedC78OlDcEf65W6DxQEw8l1r75PN0A/1PyOx+CrRXHiifJTQsNYilk1ER72OP6LDFrlsHKDoSXUKS7YRKKVDyzcCzwNrgevQ75P3kPtvPZTCG4QiIyIOF6CPs2O247WA1vmdU9xLZGSkeDWHvhaJRqR5gIhSIg0bisybV3z3+6ahvl/e5ZuGxXO/efN0mUqibJ7Al8tXhLJNnSoCIi++WOzalTn2isg9oiu2WiLybxG5VIz3A7aIC3Wsy05qpVSwiDiYMug5vL6Laf1D8MdsiBsPr5VAmm0faF4bvJPsAHwDB+oAfFYkVTPoLGqvoucxBAJ/B54BQor5vq52MRX4MyulOiildgF/2LbDlVKlY4qnJxGB+OW6E7FL9wJPt4SwodoYBDcElF4b42AAli9fzvLly4t07a+/6t6hqCiYPRvGrnyMx5Y/Zq2CZYzzwGTgWrRxeBjYb9tX3MahMLgyimk6cCvwLYCIbFdKdS5WrXyBc7sg6yT85gevdyi5+4YNNQbBcAUBAY6GrBXMkSM6xlKNGrBkCVSoABUCSn+MIU+RDnwCvIJ26g5EO5m9Lxu1xqVhriJyWOUe2eLqLJtioVQMc03Qo0ZQ4VCxomd1MZR5evXqVehrUlKgf389MtY+AN+0XtMs1s73EeBLYCI6T3MXYCl6hJI340pP4mGlVAdAlFIBSqm/o+MxeQwRWSoiD1epUsWTauTP4WV68HJk4f+YBoOnycqC+++Hbdt00rUWHk8PVnpZi56bOAg9DHQZsAbvNw7gmoF4FHgMqAccQUdyNR2Q+ZGerBOGbAO6dPG0NgYDS5cuZenSAia02TFxInzzDbz9tl10VhsPL32Yh5c+bLGGvsdO9DyBrsBR9PzYbUAfnI9G9zYK7GISkVOU4LBbn+D4GiBd+x8KNVjcYCgeKlRw3W8wa5ZOzfzoozBu3JXHa1RwFhGobJJ34trTwK/oHM1V0JPcxuI4lJi3U6CBUEqFocsXan++iPQvPrVKOQmrIN0PKrbU4QkMBg/jaia5tWvhkUd0eub33nM8qT5vJrmyTN7w2weBcegQh88AE4AipibyClxxUi8GPkP7VIonA4YvIQJHVsBvAh27eVobg8Fl/vxTz3W49lpYuBCKOPDJp0lDjz46gZ7DMI7ccZGyqQNMLUG9igtXDESaiLxX7Jr4Cuf/hAtxuo35pPE/GLyDJUuWADBgwACHx8+cgb59dYth2TKomk/064eWPATArAGzLNfTCgoTq0iARC5X+CcK+Jzkog5Hi6i7t+GKgXhXKTUJ+A4d0gsAEYktNq1KM0dX6vVOoGNHj6piMGRTOZ+uzvR0uOceHT/yhx90CyI/6leub61yFuKoy2cEuvvjGq6s8E8AGQ7kKHTA21q2Jcrucy10/M1awF04NgYNLCmN53HFQDQH7ge6c7mLSWzbHsGr50EkrIKzFaDejfm/hhkMJUi3brm7O+2Dq1asqDN1zpnj2jvNq91eLSYtC4egK/vdwC7b+lPs3mJtXELHyqzA5Yq9PhBJ7sre/nMNHCe1y8tbOE4BWlzht0saVwzEQKCRiFwq8MwSQkSWAktbt249ytO65CIjFY7HwOZ0M7zV4LXkTTyYnAzlyrmX0qI4yUJ3F2UbgexlF7kT6FTmSuOQjcKxr8Bdsruu3A2/7a24Mg/iN3SaGUNBnFgLWWkQm2kMhMGr+Prrr/n6668B3XK4kKe2zMjQ+11h2NfDGPb1sELdPxo9DNLPto52cE46uuL/Gl3JDgNaoWMThaHnD/wd3V0UAAwB3gO+R89JPYvOrOaI4uzyGYrO5pZlW/uKcQDXWhBVgT+UUtmJFgEzzNUhR1fqnMy7M6BTJ09rYzDkUKPG5bkLhw4B9wJvoGvOQ8BEODTfNVk31LihUPd25BcYCWxADwHNbhn8SW5/QAOgCTosxU22z01wnpcZtGHx5S6fksYVAzGp2LXwFRJWwdEqcOPVOrqZweAldLG1aLOyIPAhSHsPyA4RFgp8AtUdpZDNgwB/7/ISyejU4+eBZNvi7POnXNm9k4ZOj+SPjmjaBLiDy0bgRnQa8sLi610+JY0rM6nXloQipZ7kv+D8Xlhf3nQvGbySlBQYNgzSpnPZOGRTEVKm6RTq2ZW7swrf1UidfuhKPsXJcWU7FujkeFEp0YxrPk5+KUfXi0hHpdR59ItDziFARMRMEbbnqC166+ZL8IAxEAbvYu7cL/nxR/j223t0J78D0srDEnSffyXbchW6/7+S3f6lXw4hABh7z/xc5+b9HISuLELR3Up5aYD1xsFgLU4NhIh0tK29KX+F93J0JWRUh2NnoLNJl2HwHmJj4Ysv6pCmoP+fsNhJpLiGaCdrQYTUiQBguIv3N36B0osrsZjmisj9Be0r02RehOP/B/trQpPaUKuWpzUyGACdKvS+ByHoyY5kvQRJ5bTTdxOQandeYSrs8R3HF0oH4xcovbgyzLWp/YZSqhx6jokhm5M/6jzQq08a/4PBKxCBf74Fd34Gsh0SX4HIcjoCTAw6q5ktMS0N0Wkvi7PC9uWhoL5Mfj6ICegESBWUUtkhSBR6YuKMEtDNKV43k/roKlABsDUVxhoDYfAsly7BoNdhSSfgOaifBY8tXEgdIHzQIMA9R+7dC+8G4KtBX1mhrsGLcdqCEJE3bf6HqSJS2baEiEgNEZlQgjo60s27MsolrIK0UD1LxLQgDB5kdyKEfgdLJkFQB3gnC373g6hrrqH+NddYco/217Sn/TXtLZFl8G6UiDg+oFSoiMQ5vVAnqa4nIvHFpFuBtG7dWrZs2eKp22tSDsOSBvDrTbAkHfbu9aw+hjJJKvDCKXgnCKQ89N4P0U1Kdy4CQ/GhlNoqIq0LOi8/J/VUpZQfeuTbVuAkeuTadUA34Bb0JDqPGQivIME2vHXpIegyxLO6GMocAnwBPJUGJ2pC+WUwpy4MMV5CgwXkN8x1oFLqJnRX5QigLvpFZTewHHhdRNJKREtv5uhKKFcH9hyDF033kqHk2IBOb7kRYDc0eAfWTIJGja4894svvgDg3nvvdfu+/b/QUXa+vfdbt2UZvJt8h7mKyC706DSDI7LS4dhqON8MOGb8D4YSIQ54HlgIVEwCnoAeCbBogfMI82FhYZbd/5awWyyTZfBuXJkHcZeD3eeAnSJywnqVShEnN0DGeR29NSwM6ntvIhVD6ScJHV/vHcBP4IYFsOdvMPpBeG+5DtntjHbt2lmmx7h24yyTZfBuXAnW9zegPbDGtt0V7ZMIU0q9KiJzi0k37ydhFahysPhP6OU4laPB4C4Z6KTwL6EdgfdcgN13we7v4d3pMHasThVqMFiNKxPlygFNRORuEbkbHXlXgLbolm7Z5ehKCI6Ao4mme8lQLPwPiAAeRUc4/Xw3bLgeDv4E334LTzzhmnGIjo4mOtpRFobCc1v0bdwWfZslsgzejSstiPoictxu+4Rt3xmlVHox6eX9XDgKZ7fDhX562xgIgxtEkzsUxRj0jOeVQCPgK4Bv4P5hULMmbNgAzZu7Lr9x48aW6dqvcT/LZBm8G1cMRIxSahmwyLZ9j21fRXJn/CtbJPxPr39O1b6H0FCPqmMovThKqPM8OofyNOAxgfemwvjx0KaNjq9Up07h7hEVFWWZvmOixlgmy+DduGIgHgPuArLTmc8BvhI9w66b06t8nYRVUKEuLNsOvW41ncCGIvMCjvMl1wDGXoLRo2HmTBg0CGbPhgoVSlY/Q9nFlYRBopRaj47BJMAmcTb9uqyQlQEJ30FINzjxjeleMrjFISf7jwjceivExMBLL8HkyeDnitfQAZ9//jkADzzwQNEE2NHj8x4ArH5gtduyDN6NK8NcBwFT0V2iCnhfKfWsiHxZzLp5L6c3QfpZiLelFTUGwlBENqBHijjK0uZ/VPsa5s7VmeDcoWnTpgWf5CKDmw62TJbBu3Gli+kFICp7zoNS6ipgNVB2DcTRlaD8YN0ZqFsXvCWqrKHUkAm8CUxGx0s6mwHp9v/GFAh6FVb9H9x8s/v3i4y0LvbGqMhRlskyeDeuNFj98kyIO+3idcWGUqqfUmrGuXPnPKNAwiqo0Q5W/6xbD8b/YCgE8ehAZi8Bg4HXFwCjyJ0w4WF49UZrjIPBUFRcqehXKaX+p5QarpQajo7DtKJ41cofj4b7TjsBZ7ZAYBtISDDdS4ZC8S0QDmwBZgPzgNefh/TZ6OTP/rb1f+Hdd6277+zZs5k9e7YlsrrO7krX2V0tkWXwblxxUj+rlLobyH6XmSEi3xSvWl5Mwnd6vb+iXhsDYXCBNOBZ4AOgJTAfaIxO7nPwoONrDjnzXheBiIgIy2QNjxhumSyDd+OKDwIR+QrbXJ0yz9GVEHgVrIzTuadvvNHTGhm8nN3AEGAHOvrqG0AgsHIlPPmk8+saNLBOB2MgDEXBaReTUuq8UirJwXLeLgVp2SIrE479D+reCmvXQefOxv9gcIoAn6ITuCeg+2bfBg7vg3794Pbbde7ov/8dgoNzXxscDK+/bp0umZmZZGY6GitVeNIz00nPLLtBFMoS+aUcpCGOYwAAHEBJREFUDbFLNWq/hIhI5ZJU0ms4sxUunoZykXD4sOleMjjlLNoBPQrdN7sd6HRez4Zu2lTPbXjrLfjtN5g6FWbMgIYN9ftGw4Z6e2hRk0Y7YO7cucyda01czZ5ze9Jzbk9LZBm8G5e6mAw2ElYBCnb5621jIAwO2ADcBxwBpgB/F/giGp57To9rePBBePNNPUI6m6FDrTUIeWnVqpVlska2GmmZLIN3YwxEYTi6EmpEwfxYqF5dvwoaDDYy0QZhEjrg3nqg3Fbo/ISe8Na6NXz9NViYmsFlWrRoYZmsYS3cnLVnKDV4dD5DqeLiaTizCer2hrVrtf+hqHEPDD7HEaAn8CIwCPjuJHw6CqKiYN8+HUtp40bPGAeA9PR00tOt8RtcSL/AhXRH0aMMvoap4Vzl2GqQLPBvBQcOmO4lQw5L0XMbNgGfZkCbd6H19Tqw3lNPwd698NBDnn2fsDIfxO3Rt3N79O2WyDJ4N6aLyVWOroTy1eBX2+xtYyDKPGnosNzvoec2jN0A00bBrl3Qqxe88w40aeJZHbNp3bq1ZbJGtx5tmSyDd2MMhCtIlnZQ1+kFc37UmeEt7NM1lD7+QM9t2A48dA5Oj4IRi6BRI1iyRA9j9aYR0M2aNbNM1uBmJlhfWcF0MblC4nZIOw5X36b9D506gb+/p7UyeABB54eOBOIFhsyD/9aG1cv1vIXff4f+/b3LOACkpaWRlpZmiaxzaec4l+ahOGiGEsUYCFdIWKXXfhHw55+me6mMcg64FxgJNDoG5VvD/Pvh7rthzx6YOBGCgjyspBPmz5/P/PnzLZE1YP4ABswfYIksg3djuphc4ehKqNYSftmtt42BKBPY54muDWQAiQKhM+C30RARDgvW6Qalt9O2bVvLZD3R9gnLZBm8G2MgCuLSOTi1AZo8B9+uhZAQsDCujcE7iQZGZMAl2z/kGOhQ3K/A+X/Dxx/ByJGlp6exiYXe8rua3GWZLIN3YwxEQRxbDZJp8z88Ah07Qjnztfk6T6TApYp5dvpB0Bj480moVs0jahWZCxf0vIXgvEGfisCpC6cAqBlc021ZBu/G+CAKImEVBFSGrEawe7fpXvJh9gHTgZsvwhkn9WjaVaXPOAAsXLiQhQsXWiLrnoX3cM/CeyyRZfBuzKtwfoho/0OdnrD+Z73PGAifIQOIuQSzTsHqQDhhSzHOXnSsDEf5qA4BoSWkoIW0b9/eMlnPtH/GMlkG78YYiPw49zukHtHhNRauhYoVwcLcvoaSRQR2HobP4uF/5WH/9ZBRBagJxEC1n6DDGehxLUzaC0lTAftuphSo8S/0zLhSxg033GCZrH439LNMlsG7MQYiP46u1Oure8Pa96BDBwgI8KxOBpe5cAG2bIFlf8CqcrCnMVxqi24dnIRaG6DdKRhUFbpFwtW9Ll97VTQ89DikZ0feOwQBr8C7PTxTFndJTk4GoFKlSm7LOpZ8DIA6leq4Lcvg3RgDkR8Jq6BKM0itADt3wmAzg9STREfDCy/oVJwNGuiJadkhskVg/3745Rf4aSP8kAr7bgTpA3TW51SJhy47YEhFuO9aCLrN+b2y5b7Q1fH9ShtffvklAMOHD3db1pAvhwAQMzzGbVkG78ZrDIRSqiLwIXAJiBERayKLFZX083DyR7jhSfjxR73P+B88RnQ0PLQa0mOABnDwEDw4CRYvhrQ02PA7nIkC+gGvANXBLwPCE2FgMgypBI2uAa5x/Z7FnaOhJOnYsaNlssZ3HG+ZLIN3U6wGQik1E+gLnBCRZnb7ewPvAv7ApyIyBbgL+FJEliqlFqCHonuO42sgK137Hz5fqqfIRkV5VKWySnIyjFn//+3de3RU1b3A8e8vISEJCKG8wytGFPVWS20UH4j0qkAtFB9oW2Nt1QrVRW+9t3rb2vaqq9ra5e1aQim0qEhV6qOILwqxyG2CEUQiRAyNKNAgJIEIYgTCK8m+f+wTmIRJJpPZM3Mm8/usNSszZ878zm/PwPzm7D2zNxybw4kxgVxonAeLF0PWGXAoH+gG2Q0wJQW+AUzoBr36xy1tXxk5cqSzWJNGTnIWS/lbtM8gFgJzgKeaN4hIKvAH7PT5O4F1IvIq9rPd+95ubhbPjUT1cujWA/qPheK74aKLoHv3eGfV5e3eDRs22EtZmf27ZQuYSloOGANkATfbLxVN8S4XdrOfOlRLdXV27qTevYN9NSs8O+p2ADCs97CIYyl/i2qBMMasEpHcVpsvALYYY7YBiMhzwFRssRgKlNHO7zNEZDowHWD48OHukwbboV1TCAMvh/319p3qvvuic6wk1dRkxwzKyuDd92DtDtj4GXzaAzsoPBwyZ0BaHnQfBIfbmuOoCTbpr3lCeumllwA3YxDfeek7gI5BJIN4jEEMAXYE3N4JjMF+eXCOiHwduwZLUMaY+cB8gPz8fBOVDD/fDAcr4eyfQEmJLRg6/nCSO0tgfi405kBqNUyvhLmturoNsPsIFG2Dt7wisPUY7E6HhsHYV/5aTvrY36cJRqTYWjEMePIo1KefnEPfeiDyL+Z0eePGjXMW6xfjfuEslvI33wxSG2MOArfEOw/gxOytgyfBn+ZAejp0crKzjryJuhSr491ZAvPOw3bzAI1DYV5/WLsVcjJhy1GoSYP92dDUAzjLuwByFHrVwaAGGJkO5xjI4/iJA8OAnq3OCi5Kbzk3EkB6A8zS4tAheXl5zmJdkZeg3/VVYYtHgajCvgc0G+pt84/q5dDrTOiZa9d/GDMGMjPDDnNnCcz7Msf7zhuHwrw+QEkU37SDHK9hNfz6YjgAHCT03/0GPm+AukZ7/YCx99UD9SlwKAUOXAK0XvOgO6w/DdbvBj6B7p/AsKO2CHwpGy4eBhcNgUHpkBLm4HEBQLcTs6sOBx7q5m1XIe3btw+APg7mCdm2bxsAeX3cFR3lT/EoEOuA00XkVGxh+BZwYzgBRGQKMMXlNzOOa6iH2mI4/Q74/HNYv95O9N8J83M5eWC1h30T37Dddr80iZ0ktEkCbgdcD7at+bqRlrd3jQFa/46vBzx2MTzW0aSPErqCHARmtvH4JigssxPeDnT8pa8CtCB01iuvvAK4GYO49ZVbAR2DSAbR/prrs8B4oJ+I7ATuM8Y8ISIzgdexPc8LjDGbwolrjHkNeC0/P/921zmzuwiajtjupbfesqOpnRx/aMxp444sePsQXmXwLo1h3g627bo2jmeg1y8howG6N0BmI2Q2QQ9j61dPoKdAr1TomW5PljIzISvrxPXMTMjKhszB9vqFO6EpyJdYUqth4sSwnyoVZePHj3cW64HxDziLpfwt2t9i+nYb25cBy6J57E6rKYTUTBh4GRTfb6f27uREZ6k10Djk5O0pO2ETIKkg3ezylO1dIPQ+IjC4ynYrnZRHFdQ92KkmtGlGCcz7AifNVTS9krB+jKZiIzc311msy3L1CxvJwjeD1L5RUwgDxkNqhh1/OP98O0lfJwyog5ocWvbVH4QZ2+HMKIxBTC/xxjhi8KY9dywQ4wF41Xl79nhrOPSLfA2HzXs2AzCqn7sJAJU/JeQ3yEVkiojMb/7xjzP7t8L+j+ziQAcP2pneOtm99HQt1JwNPYohdSfQZP/esSF6b6Jzx9r4sTxew1AwKfavFgf/Wrp0KUuXLnUSa8bSGcxYOsNJLOVvYkx0fkoQC/n5+aa0tNRdwA//AKUzYfKHsLYSJkyA5cthUnhTC+wzMHgPHN0LFZkwaoS7FJXqjB07vF8/D4v818+rd6wG4OJhF0ccS8WHiLxrjMkPtZ92MQWqXg49T4Nep0Pxn+2Cw5dcEnaYqz6EI6fBz1bBqLYGjpWKIReFoZkWhuSRkF1MUdF42E7QN9g7WyguhvPOg1NOCSvM/N3w9ig49Tl4SNd2Vz5RW1tLbW2tk1jlteWU15Y7iaX8TQtEs9o3obHejj8cOgTvvBP2+ENtE8xMg5T34O/jTnwDSal4W7ZsGcuWufni4MxlM5m5rK0fwqiuJCG7mKLyQ7maQkhJh4Hj4c234ejRsAvEpK1wbATcvxVG6tmD8pErr7zSWaxHrnzEWSzlbwlZIKLyQ7nq5TDgMjvFd3Gx/fgfxiIrs3bBhtPhjIXwP991lpVSTgwZEuQHOZ10/hBdFyVZaBcTwMHt8HlFy/GH0aMhO7tDD69ugrszIbUU/n6ldi0p/9m1axe7du1yEqtsVxllu8qcxFL+pgUCoNqbvTXna3DkiF3YuIPdSwa4shIa0uHBnTDC3Qc1pZwpLCyksLDQSay7Cu/irsK7nMRS/paQXUzO1RRC1nA7g2tJiV3kuIMF4uEa+GcenP04/OS2KOepVCdNCvO3PO15dNKjzmIpf0vIAuF0kLrxKOx6A3ILbN9QcbHdfumlIR9a2Qi/PAW6vQUrJmvXkvKvQYMGOYs1etBoZ7GUvyVkF5Mx5jVjzHQX6+uyZzU0HGg5/nDOOdC3b/s5ABN22AlVH9kLOe7+/ynlXFVVFVVVbpZdWVe1jnVV65zEUv6WkAXCqerldkrVQZfDsWOwenWHupfur4GPcmH0IvjRlOinqVQkVqxYwYoVK5zEumfFPdyz4h4nsZS/JWQXk1M1hdB/LKSdAmvWQH19yALxYQM82BvS/gGF12jXkvK/q666ylmsOVfNcRZL+VtyF4j6KvhsI4z+rb3dPP7QzgLvTcDEamjqDXMOwsAB0U9TqUgNGODuH+oXB3zRWSzlb8ndxVTzuv0bOP5w1lnQzn+mn1ZD5XC4YBHcMTkGOSrlwI4dO47P6Bqp1TtWH5/RVXVtyV0gqpdDZg5knwMNDfYrru10L71/DP63L6S/DktviGGeSkVo5cqVrFy50kmse1fey70rO7dOu0osCdnF5ORrrk0NsGsFDLvODiJs2AAHDrRZIBqAr+0GkwnzGqF/5AtzKRUzkye7O9390+Q/OYul/C0hzyCcfM11z9twrA5yArqXoM0CcVc1VA2FS/4Ct7ob71MqJvr16+dkuVGwS43qcqPJISELhBM1hSCpMMib5bK4GM44AwYPPmnXd4/B3P6Q8Sq8WhDjPJVyoLKyksrKSiexiiuLKa4sdhJL+VvyFYh/LYKXc2HTQ/b3D1V/g8ZGePPNoGcPR4Gr9oD5FB7vDl/4QswzVipiRUVFFBUVOYl1X9F93Fd0n5NYyt8Scgyi0/61CN6ZbhcGAmg6Ym9vr4S6uqAF4s4qqB0C/z4LCn4U23SVcmXq1KnOYi2YusBZLOVvyVUg3vv5ieLQrLEedvzOXm9VIEqOwBMDIfOv8KKu8aASWJ8+fZzFyuuT5yyW8rfkKhD1HwffnrIP8vJg6NDjmw4DV38GHIOn+nR4aQilfGnbtm0A5OVF/ub+xrY3ALgi74qIYyl/S64CkTUc6refvH1fyklnD7dVw94cmPQoTNOp71WCW7VqFeCmQDy46kFAC0QySMgC0enfQXzpoZZjEACSAc8ehuknCsTKI/CXQdDzGXj+Vjc5KxVP11xzjbNYT1/ztLNYyt8S8ltMnf4dxKkFcMF8yBoBiP27/wZYzfEziIPAdfuB7bBoCPTq5Th5peKgd+/eOJkeHxjWexjDeg9zEkv5W0KeQUTk1AJ7aXb99TB8OOTmAnBzNdTlwNSn4Rv/GZ8UlXJty5YtALhYZKtwi126dNJId6vUKX9KvgIRyBhYtQomTgRg6SFYkgO9noRnbo9zbko5VFJSArgpEA+XPAxogUgGyV0gPvgAamvhssv4HLjxEPAxvDASevaMd3JKuTNt2jRnsZ6b9pyzWMrfkrtABMy/9O0a2D8Arl8IE/8rrlkp5VxPh594BvXU9XWThRaInBwW55zGsizI/iM8OSPeSSnl3ubNmwEYNSrySfZe2/waAFNG6Vq7XV3yFghjoLiYT7/+db57VGArLDkXevSId2JKubdmzRrATYH43Ro784AWiK4veQvEli1QU8P1M+6nvgfctAK+ql1Lqou64QZ3K1wtvmGxs1jK35K3QBQV8fS1Bfxf/hD6zob5d8Q7IaWiJysry1msflm6WlaySMgfyonIFBGZX1dXF/ZjFwG5QMr3v8/NLzwF2wwvj4HMTNdZKuUfFRUVVFRUOIm1pGIJSyqWOIml/C0hC0Rnf0m9CLj1SCPbASMCqSmk5Bi2j4lKmkr5xtq1a1m7dq2TWLPXzmb22tlOYil/E2NMvHPotPz8fFNaWtrh/fvtPczevhknbe+79zB7gmxXqqs4fPgwABkZkf87rztsz9x7Z7iZukPFnoi8a4zJD7VfUo1B7O3TPaztSnUVLgpDMy0MySMhu5g6rY3lINrcrlQXUV5eTnl5uZNYz5c/z/PlzzuJpfwtqQpE3198aqdrDXTQ265UF1ZaWko43bHtmVc6j3ml85zEUv6WVF1Ms3pVcMvt+Rz7dQYMBz6GtHsPMyu7Ahgb7/SUipqCgoLQO3XQsoJlzmIpf0uqM4iCuWN5MruUESN3IqlNjBi5kyezSymYq8VBdW1paWmkpaU5iZWVlkVWmrvfVSj/SqpvMSmVrDZu3AjAueeeG3GsZzY+A8BN594UcSwVH/otJqXUcevXrwfcFIjH1z8OaIFIBnoGoVQSaGxsBCA1NTXiWMcajwGQluqmy0rFnp5BKKWOc1EYmmlhSB5JNUitVLIqKyujrKzMSayFZQtZWLbQSSzlb1oglEoCWiBUZyT0GISIfAJ8BrSe1rV3wLa2rvcD9jhKJTBupPu2dX+w7a23tXdb225p293wY9vbu89V2/3S7tbbwn3NRxhj+reTm2WMSegLML+9be1cL41mDp3dt637Q7Uz1G1tu7a9q7c9xH1O2u6Xdod4nZ21uyt0Mb0WYltb16OdQ2f3bev+UO0MdVvb7p623c2+rtoe6nlxwS/tbr0tKq95QncxRUJESk0HvubVFWnbte3JJlnbHmm7u8IZRGfNj3cCcaRtT07a9uQTUbuT9gxCKaVU+5L5DEIppVQ7tEAopZQKSguEUkqpoLRAeEQkT0SeEJHF8c4l1kTkahF5TESeF5EJ8c4nlkTkLBH5o4gsFpE74p1PLIlIDxEpFZHJ8c4llkRkvIi86b3u4+OdTyyJSIqIPCQivxeR74bav0sXCBFZICK1IlLeavskEdksIltE5KcAxphtxpjb4pOpe2G2/WVjzO3AD4BvxiNfl8Jse4Ux5gfADcAl8cjXlXDa7fkJ8EJss4yOMNtugANABrAz1rm6FmbbpwJDgWN0pO0ufl3o1wswDjgPKA/YlgpsBfKAdOA94OyA+xfHO+84tv13wHnxzj3WbQe+ASwHbox37rFqN3Al8C3ge8DkeOce47anePcPBBbFO/cYt/2nwAxvn5DvdV36DMIYswr4tNXmC4Atxp4xHAWew1bVLiWctov1W2C5MWZ9rHN1LdzX3RjzqjHma4C7hZvjIMx2jwcuBG4EbheRhH4vCKftxpgm7/59QPcYphkVYb7uO7HtBmgMFTsZ14MYAuwIuL0TGCMifYGHgC+LyM+MMb+JS3bRFbTtwA+BK4DeIjLSGPPHeCQXZW297uOBa7FvFMvikFe0BW23MWYmgIh8D9gT8KbZlbT1ml8LTASygTnxSCwG2vq/Pgv4vYhcCqwKFSQZC0RQxpi92D74pGOMmQ3Mjnce8WCMKQKK4pxG3BhjFsY7h1gzxiwBlsQ7j3gwxtQDHR5rTejTyk6qAoYF3B7qbUsG2vYTkqXtydpu0LZH3PZkLBDrgNNF5FQRSccO1L0a55xiRduefG1P1naDtj3itnfpAiEizwJrgFEislNEbjPGNAAzgdeBCuAFY8ymeOYZDdr25Gt7srYbtO1Eqe06WZ9SSqmguvQZhFJKqc7TAqGUUiooLRBKKaWC0gKhlFIqKC0QSimlgtICoZRSKigtEMopETngMNajIjLOVbw2jnG/iNwdzWN4x7lURDaJSJmIZEaSj7d+x9lRyDFfRNqdckVEskXkzg7EekNE+rjLTsWDFgjlS97kiRd6M1X6kjcLbkf/DxUAvzHGjDbGHIrw0Fdjp252yhhTaoz5jxC7ZQMhCwTwdAf3Uz6mBUJFhffm+YiIlIvI+yLyTW97iojMFZEPRGSFiCwTkWlBQlwHFAbEqxSRB0RkvRfvTG97i0/c3vFyvcsHIrJQRD4UkUUicoWIvCUiH4nIBQHH+pKIrPG23x4Q6x4RWSciG0XkAW9brrcIy1NAOS3nu0FELheRDV6OC0Sku4h8H7sg0a9EZFGQ5+rnXo4lwKiA7bd7x39PRF4UkSwRuRi7fsUj3tnIacH28x6/UOyqaaVe/Mne9gwRedLLcYOIfNXbPl5ElgY8rwtEpEhEtolIc+F4GDjNO/YjIjJYRFZ5t8vFzhIKdlqHbwf/16ESRrwXu9BL17oAB7y/1wErsAuXDAQ+BgYD07DTaqcAg7Bz008LEufPwJSA25XAD73rdwKPe9fvB+4O2K8cyPUuDcA53rHeBRYAgp0X/+WAx78HZAL9sFMk5wATgPne/inAUuzCLLlAE/bspnXOGd7jz/BuPwXc5V1f2EY7vwK8D2QBvYAtze0B+gbs92BA+1vECrFfoZf/6dgpnzOAHwMLvH3O9F6bDOwaEUsDnpfV2GnQ+wF7gTSv/YEL0/wY+Ll3PRU4JeC+jwJz00viXfQMQkXLWOBZY0yjMWY3UAyc723/qzGmyRizC/hHG48fDHzSalvzFM3vYt+oQvmXMeZ9Y9c62ASsNPad6/1Wj3/FGHPIGLPHy+cCbIGYAGwA1mPfSE/39t9ujHk7yPFGecf80Lv9Z2xRac+lwEvGmHpjzOe0nFDti2LXTn4f20X1b23EaG+/F7zn+iNgm9eOscAzAMaYD4DtwBlB4v7NGHPEe15qsYW+tXXALSJyP3COMWZ/wH212GKrEpQWCOVXh7CfagMd8f42cmItkwZa/jvOCLI/2E/9RwKuB66F0npCMoM9c2geMxhtjBlpjHnCu/9gh1sRmYXATGPMOcADnPx8dGS/YG3rqMDnL/A5PxHMjhGNw04lvVBEbg64OwP7OqoEpQVCRcubwDdFJFVE+mPfRN4B3gKu88YiBmK7NYKpAEZ24DiV2PV4EZHzgFM7ketUr1++r5fPOuwsmLeKSE8v9hARGRAizmYgV0Sa8/4O9sypPauAq0UkU0ROAaYE3HcKUCMiabRcDnW/d1+o/QCu957r07DrE2/GvjYFXrvOAIZ72zuixbFFZASw2xjzGPA4J14LwXYhVnYwrvIhXVFORctLwEXY/n0D/LcxZpeIvAhcDvwT21+/HqgL8vi/ATOwbzrteRG4WUQ2AWuBD0PsH8xGbNdSP+BXxphqoFpEzgLW2Pc6DgA30c46vsaYwyJyC/BXEemGLTTtLt9qjFkvIs9jn6da7zHNfum16RPvb/Mb83PAY97A8bR29gM7vvAOdnzjB16Oc4F5XpdUA/A9Y8wRr53tMsbs9Qb6y4Hl2DGfe0TkGPY5aj6D+ArwtrHTTqsEpdN9q5gTkZ7GmAPeJ/Z3gEu88YjW+5UAk40xn8U8yS5ARBZiB50Xx+HYs4BXjTErY31s5Y6eQah4WCoi2UA69hP7ScXB82Ns94cWiMRTrsUh8ekZhFJKqaB0kFoppVRQWiCUUkoFpQVCKaVUUFoglFJKBaUFQimlVFBaIJRSSgX1//NZSU4ycqajAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_loglog(df,\"heatmap\")\n", + "plot_loglog(df2,\"scatter\",color=\"blue\")\n", + "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", + "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", + "plt.legend()\n", + "plt.axvline(x= 1e4,linestyle=':',color=\"grey\")\n", + "plt.axvline(x= 2e4,linestyle=':',color=\"green\")\n", + "plt.title(\"Total Lux Display Cost (Real Estate)\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Somewhere between 5000~20000 is the right point to switch from a sampled scatterplot to a heatmap" + ] } ], "metadata": { diff --git a/experiments/utils.py b/experiments/utils.py index 4a5857da..fa72f077 100644 --- a/experiments/utils.py +++ b/experiments/utils.py @@ -26,4 +26,15 @@ def generate_airbnb_copies(ncopies): 'neighbourhood', 'latitude', 'longitude', 'room_type', 'price', 'minimum_nights', 'number_of_reviews']] df_copies = pd.concat([df for _x in range(ncopies)]) - return df_copies \ No newline at end of file + return df_copies +def downsample_airbnb(numPoints): + df = pd.read_csv("experiments/airbnb_10x.csv") + df = df[['id', 'name', 'host_id', 'host_name', 'neighbourhood_group', + 'neighbourhood', 'latitude', 'longitude', 'room_type', 'price', + 'minimum_nights', 'number_of_reviews']] + df_sampled = df.sample(n=int(numPoints)) + return df_sampled +def downsample_realestate(numPoints): + df = pd.read_csv("experiments/real_estate_3x.csv") + df_sampled = df.sample(n=int(numPoints)) + return df_sampled \ No newline at end of file diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 2d0671d0..48df739e 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -4,6 +4,7 @@ from lux.core.frame import LuxDataFrame from lux.executor.Executor import Executor from lux.utils import utils +from lux.utils.date_utils import is_datetime_series from lux.utils.utils import check_import_lux_widget, check_if_id_like import warnings @@ -58,7 +59,7 @@ def execute(vislist:VisList, ldf:LuxDataFrame): elif (vis.mark =="histogram"): PandasExecutor.execute_binning(vis) elif (vis.mark =="scatter"): - if (len(vis.data)>=50000): + if (len(vis.data)>10000): vis._mark = "heatmap" PandasExecutor.execute_2D_binning(vis) @@ -255,7 +256,7 @@ def execute_2D_binning(vis: Vis): result["yBinEnd"] = result["yBin"].apply(lambda x: x.right) vis._vis_data = result.drop(columns=["xBin","yBin"]) -####################################################### + ####################################################### ############ Metadata: data type, model ############# ####################################################### def compute_dataset_metadata(self, ldf:LuxDataFrame): From de07933ab623c10872cc565b3c7d62ba44458263 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 25 Sep 2020 16:17:23 +0800 Subject: [PATCH 07/18] modified general sampling criteria, suppress SettingWithCopyWarning stemming from groupby .agg (#93) --- lux/core/frame.py | 1 - lux/executor/PandasExecutor.py | 36 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/lux/core/frame.py b/lux/core/frame.py index 6a1fc7e2..2ec0b4fb 100644 --- a/lux/core/frame.py +++ b/lux/core/frame.py @@ -4,7 +4,6 @@ from lux.vis.Vis import Vis from lux.vis.VisList import VisList from lux.history.history import History -from lux.utils.date_utils import is_datetime_series from lux.utils.message import Message from lux.utils.utils import check_import_lux_widget #import for benchmarking diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 48df739e..6fcceacc 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -48,8 +48,8 @@ def execute(vislist:VisList, ldf:LuxDataFrame): if (clause.attribute!="Record"): attributes.add(clause.attribute) # General Sampling - if len(vis.data) > 10000: - vis._vis_data = vis.data[list(attributes)].sample(n = 10000, random_state = 1) + if len(vis.data) > 1e5: + vis._vis_data = vis.data[list(attributes)].sample(n = 50000 , random_state = 1) else: vis._vis_data = vis.data[list(attributes)] # vis._vis_data = vis.data[list(attributes)] @@ -59,7 +59,7 @@ def execute(vislist:VisList, ldf:LuxDataFrame): elif (vis.mark =="histogram"): PandasExecutor.execute_binning(vis) elif (vis.mark =="scatter"): - if (len(vis.data)>10000): + if (len(vis.data)>1e4): vis._mark = "heatmap" PandasExecutor.execute_2D_binning(vis) @@ -237,25 +237,25 @@ def apply_filter(df: pd.DataFrame, attribute:str, op: str, val: object) -> pd.Da return df @staticmethod def execute_2D_binning(vis: Vis): - x_attr = vis.get_attr_by_channel("x")[0] - y_attr = vis.get_attr_by_channel("y")[0] - df = vis._vis_data - df["xBin"] = pd.cut(df[x_attr.attribute], bins=30) - df["yBin"] = pd.cut(df[y_attr.attribute], bins=30) - - groups = df.groupby(['xBin','yBin'])[x_attr.attribute] - result = groups.agg("count").reset_index() - result = result.rename(columns={x_attr.attribute:"z"}) - result = result[result["z"]!=0] + pd.reset_option('mode.chained_assignment') + with pd.option_context('mode.chained_assignment', None): + x_attr = vis.get_attr_by_channel("x")[0] + y_attr = vis.get_attr_by_channel("y")[0] - result["xBinStart"] = result["xBin"].apply(lambda x: x.left) - result["xBinEnd"] = result["xBin"].apply(lambda x: x.right) + vis._vis_data.loc[:,"xBin"] = pd.cut(vis._vis_data[x_attr.attribute], bins=30) + vis._vis_data.loc[:,"yBin"] = pd.cut(vis._vis_data[y_attr.attribute], bins=30) + groups = vis._vis_data.groupby(['xBin','yBin'])[x_attr.attribute] + result = groups.agg("count").reset_index() # .agg in this line throws SettingWithCopyWarning + result = result.rename(columns={x_attr.attribute:"z"}) + result = result[result["z"]!=0] + result.loc[:,"xBinStart"] = result["xBin"].apply(lambda x: x.left) + result.loc[:,"xBinEnd"] = result["xBin"].apply(lambda x: x.right) - result["yBinStart"] = result["yBin"].apply(lambda x: x.left) - result["yBinEnd"] = result["yBin"].apply(lambda x: x.right) + result.loc[:,"yBinStart"] = result["yBin"].apply(lambda x: x.left) + result.loc[:,"yBinEnd"] = result["yBin"].apply(lambda x: x.right) - vis._vis_data = result.drop(columns=["xBin","yBin"]) + vis._vis_data = result.drop(columns=["xBin","yBin"]) ####################################################### ############ Metadata: data type, model ############# ####################################################### From 3d59c5f2210fd7d3037bc9e078d9b0a368786e38 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 25 Sep 2020 16:29:50 +0800 Subject: [PATCH 08/18] decrease sampling parameter --- lux/executor/PandasExecutor.py | 2 +- tests/test_performance.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 6fcceacc..9ff9b301 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -48,7 +48,7 @@ def execute(vislist:VisList, ldf:LuxDataFrame): if (clause.attribute!="Record"): attributes.add(clause.attribute) # General Sampling - if len(vis.data) > 1e5: + if len(vis.data) > 50000: vis._vis_data = vis.data[list(attributes)].sample(n = 50000 , random_state = 1) else: vis._vis_data = vis.data[list(attributes)] diff --git a/tests/test_performance.py b/tests/test_performance.py index 169ec31f..8e992ac4 100644 --- a/tests/test_performance.py +++ b/tests/test_performance.py @@ -17,5 +17,5 @@ def test_q1_performance_census(): delta2 = toc2 - toc print(f"1st display Performance: {delta:0.4f} seconds") print(f"2nd display Performance: {delta2:0.4f} seconds") - assert delta < 3.8, "The recommendations on Census dataset took a total of {delta:0.4f} seconds, longer than expected." + assert delta < 4.0, "The recommendations on Census dataset took a total of {delta:0.4f} seconds, longer than expected." assert delta2 < 0.1 Date: Fri, 25 Sep 2020 16:45:23 +0800 Subject: [PATCH 09/18] change sampling strategy (above threshold keep 3/4 of data) --- lux/executor/PandasExecutor.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 9ff9b301..8910cbb9 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -48,8 +48,9 @@ def execute(vislist:VisList, ldf:LuxDataFrame): if (clause.attribute!="Record"): attributes.add(clause.attribute) # General Sampling - if len(vis.data) > 50000: - vis._vis_data = vis.data[list(attributes)].sample(n = 50000 , random_state = 1) + if len(vis.data) > 10000: + n_samples = int(len(vis.data)*0.75) + vis._vis_data = vis.data[list(attributes)].sample(n = n_samples , random_state = 1) else: vis._vis_data = vis.data[list(attributes)] # vis._vis_data = vis.data[list(attributes)] @@ -59,7 +60,7 @@ def execute(vislist:VisList, ldf:LuxDataFrame): elif (vis.mark =="histogram"): PandasExecutor.execute_binning(vis) elif (vis.mark =="scatter"): - if (len(vis.data)>1e4): + if (len(vis.data)>10000): vis._mark = "heatmap" PandasExecutor.execute_2D_binning(vis) From 520885ca1be9d2d0417713b2007f37fd1784f8dd Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 25 Sep 2020 18:10:12 +0800 Subject: [PATCH 10/18] remove experiment dir --- experiments/.gitignore | 2 - experiments/basic_scatter.ipynb | 160 -- experiments/execute_lux.ipynb | 154 -- experiments/heatmap.ipynb | 163 -- experiments/lux_benchmark.py | 37 - experiments/manual_heatmap.ipynb | 196 -- experiments/manual_heatmap_2x_coarse.ipynb | 188 -- experiments/sampled_scatter_20000.ipynb | 163 -- experiments/scatter_analysis.ipynb | 2246 -------------------- experiments/scatter_benchmark.py | 41 - experiments/uncolored_single_scatter.ipynb | 101 - experiments/utils.py | 40 - 12 files changed, 3491 deletions(-) delete mode 100644 experiments/.gitignore delete mode 100644 experiments/basic_scatter.ipynb delete mode 100644 experiments/execute_lux.ipynb delete mode 100644 experiments/heatmap.ipynb delete mode 100644 experiments/lux_benchmark.py delete mode 100644 experiments/manual_heatmap.ipynb delete mode 100644 experiments/manual_heatmap_2x_coarse.ipynb delete mode 100644 experiments/sampled_scatter_20000.ipynb delete mode 100644 experiments/scatter_analysis.ipynb delete mode 100644 experiments/scatter_benchmark.py delete mode 100644 experiments/uncolored_single_scatter.ipynb delete mode 100644 experiments/utils.py diff --git a/experiments/.gitignore b/experiments/.gitignore deleted file mode 100644 index 0f87c92d..00000000 --- a/experiments/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -output.ipynb -*.csv diff --git a/experiments/basic_scatter.ipynb b/experiments/basic_scatter.ipynb deleted file mode 100644 index 71b11e02..00000000 --- a/experiments/basic_scatter.ipynb +++ /dev/null @@ -1,160 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=10000" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "import lux\n", - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "import altair as alt\n", - "\n", - "chart = alt.Chart(df).mark_circle().encode(\n", - " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", - " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/execute_lux.ipynb b/experiments/execute_lux.ipynb deleted file mode 100644 index 2b9c85b0..00000000 --- a/experiments/execute_lux.ipynb +++ /dev/null @@ -1,154 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "ncopies=5e4" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork\n" - ] - } - ], - "source": [ - "cd ../" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import lux\n", - "from utils import downsample_realestate\n", - "df = downsample_realestate(ncopies)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork/lux/executor/PandasExecutor.py:265: UserWarning: \n", - "Lux detects that attributes ['Month', 'Year'] may be temporal.\n", - "In order to display visualizations for these attributes accurately, temporal attributes should be converted to Pandas Datetime objects.\n", - "\n", - "Please consider converting these attributes using the pd.to_datetime function and providing a 'format' parameter to specify datetime format of the attribute.\n", - "For example, you can convert the 'month' attribute in a dataset to Datetime type via the following command:\n", - "\n", - "\t df['month'] = pd.to_datetime(df['month'], format='%m')\n", - "\n", - "See more at: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_datetime.html\n", - "\n", - " self.compute_data_type(ldf)\n", - "/Users/dorislee/Desktop/Research/lux/dorisjlee_lux_fork/lux/core/frame.py:55: SettingWithCopyWarning: \n", - "A value is trying to be set on a copy of a slice from a DataFrame.\n", - "Try using .loc[row_indexer,col_indexer] = value instead\n", - "\n", - "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", - " super(LuxDataFrame, self).__setitem__(key, value)\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "24a65d21dbaf4164b7ef30942e422f0d", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Button(description='Toggle Pandas/Lux', layout=Layout(top='5px', width='140px'), style=ButtonStyle())" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "7877fef1c2af4a9abd1a95b2dbe17b70", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Output()" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/plain": [] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/heatmap.ipynb b/experiments/heatmap.ipynb deleted file mode 100644 index e5e41667..00000000 --- a/experiments/heatmap.ipynb +++ /dev/null @@ -1,163 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=1000" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "import lux\n", - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "import altair as alt\n", - "\n", - "chart = alt.Chart(df).mark_rect().encode(\n", - " x=alt.X('x', bin=alt.Bin(maxbins=50), scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", - " y=alt.Y('y', bin=alt.Bin(maxbins=50), scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative'),\n", - " color = alt.Color('count():Q', scale=alt.Scale(scheme='blues',type=\"log\"))\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/lux_benchmark.py b/experiments/lux_benchmark.py deleted file mode 100644 index 7e0e57bc..00000000 --- a/experiments/lux_benchmark.py +++ /dev/null @@ -1,37 +0,0 @@ -import papermill as pm -import pandas as pd -import numpy as np -import json - -experiment_name = "execute_lux" -# # ["sampled_scatter","basic_scatter","heatmap","manual_heatmap","manual_heatmap_2x_coarse"] -# for experiment_name in ["sampled_scatter_20000"]: -# for experiment_name in ["manual_binned_scatter"]: -# trial_range = np.geomspace(10, 1e5, num=9) -# trial_range = np.geomspace(10, 1e5, num=9) -# trial_range = [1,3,5,7] -# trial_range = np.geomspace(10, 4e5, num=10) # airbnb -trial_range = np.geomspace(10, 7e5, num=12) # real estate (total 739818) -# trial_range = [10,100, 1000, 10000] -trial = [] #[cell count, duration] -for nCopies in trial_range: - # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" - output_filename = "output.ipynb" - # papermill basic_scatter.ipynb output.ipynb -p ncopies 1000000 --execute-timeout 1000 - pm.execute_notebook( - f'{experiment_name}.ipynb', - output_filename, - parameters = dict(ncopies=nCopies) - ) - count = 0 - with open(output_filename) as json_file: - data = json.load(json_file) - for cell in data['cells']: - # For testing out Lux Performance - if cell["execution_count"]==5: - duration = cell["metadata"]["papermill"]["duration"] - trial.append([nCopies,duration]) - print (nCopies,duration) - -trial_df = pd.DataFrame(trial,columns=["nCopies","time"]) -trial_df.to_csv(f"realestate_heatmap_unsampled.csv",index=None) diff --git a/experiments/manual_heatmap.ipynb b/experiments/manual_heatmap.ipynb deleted file mode 100644 index 799490d9..00000000 --- a/experiments/manual_heatmap.ipynb +++ /dev/null @@ -1,196 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=10000" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost\n", - "import pandas as pd\n", - "import numpy as np\n", - "binRange = np.linspace(-10,10,num=41)\n", - "df[\"xBin\"] = pd.cut(df.x, bins=binRange)\n", - "df[\"yBin\"] = pd.cut(df.y, bins=binRange)\n", - "\n", - "\n", - "#groups = df.groupby(['xBinCtr','yBinCtr'])#[\"x\"]\n", - "groups = df.groupby(['xBin','yBin'])[\"x\"]\n", - "result = groups.agg(\"count\").reset_index()\n", - "result = result.rename(columns={\"x\":\"z\"})\n", - "\n", - "result = result[result[\"z\"]!=0]\n", - "\n", - "# result[\"xBinCtr\"] = result[\"xBin\"].apply(lambda x: x.mid)\n", - "result[\"xBinStart\"] = result[\"xBin\"].apply(lambda x: x.left)\n", - "result[\"xBinEnd\"] = result[\"xBin\"].apply(lambda x: x.right)\n", - "\n", - "\n", - "# result[\"yBinCtr\"] = result[\"yBin\"].apply(lambda x: x.mid)\n", - "result[\"yBinStart\"] = result[\"yBin\"].apply(lambda x: x.left)\n", - "result[\"yBinEnd\"] = result[\"yBin\"].apply(lambda x: x.right)\n", - "\n", - "\n", - "result = result.drop(columns=[\"xBin\",\"yBin\"])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "import altair as alt\n", - "chart = alt.Chart(result).mark_rect().encode(\n", - " x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=\"x\"), bin = alt.BinParams(binned=True)),\n", - " x2=alt.X2('xBinEnd'),\n", - " y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=\"y\"), bin = alt.BinParams(binned=True)),\n", - " y2=alt.Y2('yBinEnd'),\n", - " #opacity = alt.Opacity('z',type='quantitative',scale=alt.Scale(type=\"log\"))\n", - " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"),legend=None)\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/manual_heatmap_2x_coarse.ipynb b/experiments/manual_heatmap_2x_coarse.ipynb deleted file mode 100644 index 9293b1c7..00000000 --- a/experiments/manual_heatmap_2x_coarse.ipynb +++ /dev/null @@ -1,188 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=1000" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost\n", - "import pandas as pd\n", - "import numpy as np\n", - "binRange = np.linspace(-10,10,num=21)\n", - "df[\"xBin\"] = pd.cut(df.x, bins=binRange)\n", - "df[\"yBin\"] = pd.cut(df.y, bins=binRange)\n", - "\n", - "\n", - "#groups = df.groupby(['xBinCtr','yBinCtr'])#[\"x\"]\n", - "groups = df.groupby(['xBin','yBin'])[\"x\"]\n", - "result = groups.agg(\"count\").reset_index()\n", - "result = result.rename(columns={\"x\":\"z\"})\n", - "\n", - "result = result[result[\"z\"]!=0]\n", - "\n", - "# result[\"xBinCtr\"] = result[\"xBin\"].apply(lambda x: x.mid)\n", - "result[\"xBinStart\"] = result[\"xBin\"].apply(lambda x: x.left)\n", - "result[\"xBinEnd\"] = result[\"xBin\"].apply(lambda x: x.right)\n", - "\n", - "\n", - "# result[\"yBinCtr\"] = result[\"yBin\"].apply(lambda x: x.mid)\n", - "result[\"yBinStart\"] = result[\"yBin\"].apply(lambda x: x.left)\n", - "result[\"yBinEnd\"] = result[\"yBin\"].apply(lambda x: x.right)\n", - "\n", - "\n", - "result = result.drop(columns=[\"xBin\",\"yBin\"])" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "import altair as alt\n", - "chart = alt.Chart(result).mark_rect().encode(\n", - " x=alt.X('xBinStart', type='quantitative', axis=alt.Axis(title=\"x\"), bin = alt.BinParams(binned=True)),\n", - " x2=alt.X2('xBinEnd'),\n", - " y=alt.Y('yBinStart', type='quantitative', axis=alt.Axis(title=\"y\"), bin = alt.BinParams(binned=True)),\n", - " y2=alt.Y2('yBinEnd'),\n", - " color = alt.Color('z',type='quantitative', scale=alt.Scale(scheme='blues',type=\"log\"))\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/sampled_scatter_20000.ipynb b/experiments/sampled_scatter_20000.ipynb deleted file mode 100644 index 33388ddd..00000000 --- a/experiments/sampled_scatter_20000.ipynb +++ /dev/null @@ -1,163 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=10000" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "import lux\n", - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)[[\"x\",\"y\"]]" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [], - "source": [ - "# Pandas Cost\n", - "if (numPoints>20000):\n", - " df = df.sample(n = 20000, random_state = 1)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - "
\n", - "" - ], - "text/plain": [ - "alt.Chart(...)" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Altair Rendering Cost\n", - "\n", - "import altair as alt\n", - "\n", - "chart = alt.Chart(df).mark_circle().encode(\n", - " x=alt.X('x', scale=alt.Scale(domain=(-9.657396316871525, 10.839831021249443)),type='quantitative'),\n", - " y=alt.Y('y', scale=alt.Scale(domain=(-10.969320297764385, 10.682619962116647)),type='quantitative')\n", - ")\n", - "chart = chart.configure_mark(tooltip=alt.TooltipContent('encoding')) # Setting tooltip as non-null\n", - "chart = chart.interactive() # Enable Zooming and Panning\n", - "\n", - "chart = chart.configure_title(fontWeight=500,fontSize=13,font='Helvetica Neue')\n", - "chart = chart.configure_axis(titleFontWeight=500,titleFontSize=11,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue',labelColor='#505050')\n", - "chart = chart.configure_legend(titleFontWeight=500,titleFontSize=10,titleFont='Helvetica Neue',\n", - "\t\t\tlabelFontWeight=400,labelFontSize=8,labelFont='Helvetica Neue')\n", - "chart = chart.properties(width=160,height=150)\n", - "\n", - "chart" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/scatter_analysis.ipynb b/experiments/scatter_analysis.ipynb deleted file mode 100644 index f779727a..00000000 --- a/experiments/scatter_analysis.ipynb +++ /dev/null @@ -1,2246 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from matplotlib.pylab import plt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "execution": { - "iopub.execute_input": "2020-08-27T10:52:25.603235Z", - "iopub.status.busy": "2020-08-27T10:52:25.602652Z", - "iopub.status.idle": "2020-08-27T10:52:25.913845Z", - "shell.execute_reply": "2020-08-27T10:52:25.914159Z" - }, - "papermill": { - "duration": 0.320834, - "end_time": "2020-08-27T10:52:25.914312", - "exception": false, - "start_time": "2020-08-27T10:52:25.593478", - "status": "completed" - }, - "tags": [] - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import lux" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(\"basic_scatter.csv\")\n", - "df2 = pd.read_csv(\"heatmap.csv\")\n", - "df3 = pd.read_csv(\"sampled_scatter.csv\")\n", - "df4 = pd.read_csv(\"manual_heatmap.csv\")\n", - "df5 = pd.read_csv(\"manual_heatmap_2x_coarse.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_loglog(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('log (number of datapoints)')\n", - " plt.ylabel('log(time) (s)')\n", - " plt.loglog(df[\"nPts\"], df[\"pandas cost\"],'-',label=label,color=color)\n", - " plt.loglog(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", - " \n", - "def plot_loglog_total(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('log (number of datapoints)')\n", - " plt.ylabel('log(time) (s)')\n", - " df[\"total\"] = df[\"pandas cost\"]+df[\"altair cost\"]\n", - " plt.loglog(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)\n", - "\n", - "def plot_logx(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('number of datapoints')\n", - " plt.ylabel('time (s)')\n", - "# plt.plot(df[\"nPts\"], df[\"pandas cost\"],'-o',label=label,color=color)\n", - "# plt.plot(df[\"nPts\"], df[\"altair cost\"],'--',color=color)\n", - " df[\"total\"] = df[\"pandas cost\"]+df[\"altair cost\"]\n", - " plt.plot(df[\"nPts\"], df[\"total\"],'-o',label=label,color=color)\n", - " plt.xscale('log')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 41, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "1.0331747676608791\n", - "0.0038180588235294144\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "print (np.mean(df2[\"altair cost\"]/df[\"altair cost\"]))\n", - "print (np.mean(df2[\"altair cost\"]-df[\"altair cost\"]))" - ] - }, - { - "cell_type": "code", - "execution_count": 42, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 42, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loglog(df,\"basic scatter\",\"red\")\n", - "plot_loglog(df3,\"sampled scatter\",\"blue\")\n", - "plot_loglog(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "plot_loglog(df4,\"heatmap (bin via Pandas)\",\"orange\")\n", - "plot_loglog(df5,\"heatmap (bin via Pandas, coarse)\",\"magenta\")\n", - "plt.axvline(x= 3100,linestyle=':',color=\"grey\")\n", - "plt.legend()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEKCAYAAAAMzhLIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjAsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8GearUAAAgAElEQVR4nOzdd3hUVfrA8e9JIRBKCL0mIdQIKYQA0ktoUhcQBYO72OKCFZQi+BN0jaDsLohriwoIjiigSO+EpoI06R2SkCAhBBhSSZnz++OmZyYFZjKT5Hye5z6TuXPn3jdDuO+ce859j5BSoiiKoiim2Fk7AEVRFMW2qUShKIqiFEolCkVRFKVQKlEoiqIohVKJQlEURSmUShSKoihKoRysHYAl1KlTR3p4eFg7DEVRbFRGRgYA9vb2Vo7Edhw5cuSWlLKusdfKZaLw8PDg8OHD1g5DURQbtXTpUgAmTJhg1ThsiRAiwtRr5TJRKIqiFKZnz57WDqFMUYlCUZQKx9PT09ohlCmqM1tRlArnzp073Llzx9phlBkVpkWRlpZGVFQUKSkp1g5FqcAqV65MkyZNcHR0tHYoFdratWsB1UdRXOUqUQghhgHDWrRoUeC1qKgoqlevjoeHB0KI0g9OqfCklMTFxREVFUWzZs2sHU6F1rt3b2uHYFa6kzpm7ZxFpD4SNxc3QgJDCPIOMtv+y9WlJynleillsIuLS4HXUlJSqF27tkoSitUIIahdu7Zq1doADw8PyssQet1JHcFrniVCH4FEEqGPIHjNs+hO6sx2jHKVKIqikoRibepv0DbcunWLW7duWTsMs5i17jWSZGqedUkylVnrXjPbMSpUorCm8PBw2rVr99D7WbduHfPmzTNDRMVz9+5dPvvss+zn4eHhfP/996V2fEWxhA0bNrBhwwZrh2EWkWlxJVr/IFSiMEWnAw8PsLPTHnXma8Y9jOHDhzNjxoxSO545EkV6erq5w1KUhxIYGEhgYKC1wzALN33J1j8IlSiM0ekgOBgiIkBK7TE4+KGTRXp6OkFBQXh5efH444+TlJQEwHvvvUfHjh1p164dwcHBZM06uGjRIh555BF8fHwYO3YsoN1R+vLLLwMQExPDyJEj8fX1xdfXl99++y3P8TIyMpgwYQLt2rXD29ubBQsWAHDp0iX69euHr68v/v7+XL58mYSEBAIDA/H398fb2zt7VMiMGTO4fPkyfn5+TJ06lRkzZrBv3z78/PxYsGABGRkZTJ06lY4dO+Lj48OXX34JwO7du+nRowfDhw/nkUceeajPTVHMrWnTpjRt2tTaYZhFyJ+1sTfkXeecqq03GylluVs6dOgg8ztz5kzOk9dek7JXL9OLk5OUWorIuzg5mX7Pa68VOGZuV69elYDcv3+/lFLKZ555Rs6fP19KKWVcXFz2duPHj5fr1q2TUkrZsGFDmZKSIqWU8s6dO1JKKZcsWSJfeuklKaWUTzzxhFywYIGUUsr09HR59+7dPMc8fPiw7NevX/bzrH106tRJ/vzzz1JKKZOTk2ViYqJMS0uTer1eSillbGysbN68uTQYDPLq1auybdu22fsICwuTQ4YMyX7+5Zdfyn/9619SSilTUlJkhw4d5JUrV2RYWJh0dnaWV65cKfRzqYjy/C0qVhETEyNjYmKsHYZZ/PrZW5I5yJrTkWI20v115HcdHKX87rsS7Qc4LE2cU1WLwpj790u2vpiaNm1Kt27dABg/fjz79+8HICwsjM6dO+Pt7c2uXbs4ffo0AD4+PgQFBfHdd9/h4FBwJPOuXbuYOHEioBU3yz/ay9PTkytXrvDKK6+wZcsWatSoQXx8PNHR0YwcORLQxvU7OzsjpWTmzJn4+PjQr18/oqOjiYmJKfJ32rZtG8uWLcPPz4/OnTsTFxfHxYsXAejUqZMaBqrYpE2bNrFp0yZrh/HQpJRMv/UDDeMhSlcPw3uC8DXuBE1eAkHmGx5bYe6jyGPhwsJf9/DQLjfl5+4Ou3c/YHQFR7wIIUhJSWHSpEkcPnyYpk2bMmfOnOzhkxs3bmTv3r2sX7+ekJAQTp48WaLjubq6cvz4cbZu3coXX3zBypUr+fjjj41uq9PpiI2N5ciRIzg6OuLh4VGsYZxSSj755BMGDhyYZ/3u3bupWrVqieJVlNLSv39/a4dgFhtO/cR+w1W+iPGi6rUzFjtOuWpRyELuoyiRkBBwds67ztlZW/8QIiMj+f333wH4/vvv6d69e/bJuE6dOiQkJLB69WoADAYD165do0+fPnz44Yfo9XoSEhLy7C8wMJDPP/8c0Poj9Pq8vVe3bt3CYDAwevRo3n//fY4ePUr16tVp0qQJv/zyCwD3798nKSkJvV5PvXr1cHR0JCwsjIjMRFm9enXi4+Oz95n/+cCBA/n8889JS0sD4MKFCyQmJj7U56Qolta4cWMaN25s7TAeSoYhgxlrX6HVLXj2uf9Z9FjlKlGYTVAQhIZqLQghtMfQ0IduyrVu3ZpPP/0ULy8v7ty5w8SJE6lZsyYvvPAC7dq1Y+DAgXTs2BHQTvzjx4/H29ub9u3b8+qrr1KzZs08+/v4448JCwvD29ubDh06cOZM3m8U0dHR9O7dGz8/P8aPH8/cuXMBWL58OYsWLcLHx4euXbty48YNgoKCOHz4MN7e3ixbtow2bdoAULt2bbp160a7du2YOnUqPj4+2Nvb4+vry4IFC3j++ed55JFH8Pf3p127drz44otqlJNi827cuMGNGzesHcZDWXZ0MWcybvDBdS8ce/e16LGEzBxhU54EBATI/PNRnD17Fi8vLytFpCg51N+i9ZX1+SiS05Jp9WFjGkXc4cDjWxD5Lv0+CCHEESllgLHXylUfhaIoSnEMGjTI2iE8lE8PfkJUxh2WX2uNGDDA4sdTiUJRlAqnQYMG1g7hgd1JvsMHYe/x2EXoPfFD7fK4hak+CkVRKpzo6Giio6OtHcYD+XD/PO5mJDI3ogUMG1Yqx1SJQlGUCmf79u1s377d2mGUWPS9aD7+fQHjT4Dvy+9rJYZKQbm69FTs+ygURanQBg8ebO0QHsic3bMxpKfzXngzePzxUjtuuWpRmO0+CkVRyrV69epRr149a4dRImdjz7L42BIm/SHxeG022NuX2rHLVaJQcvTu3Zv8Q4QLs3v3boYOHWqRWHbv3p2nYOEvv/xS4J4PRSlN165d49q1a9YOo0Rm7pxJ1XSYFd4UnnqqVI+tEoUJNlplvEwyR6JQN/Ep5rRz50527txp7TCK7bdrv/HL+V+YvsdAncmzoJTnXFeJwghLVBlPTExkyJAh+Pr60q5dO3788UfAdInx3r17M3nyZAICAvDy8uLQoUOMGjWKli1b8vbbbwPa3BBt2rQxWro8t23bttGlSxf8/f0ZM2ZMdimQLVu20KZNG/z9/fn555+Nxn369Gk6deqEn58fPj4+2QX/li1bho+PD76+vjz99NMArF+/ns6dO9O+fXv69etHTEwM4eHhfPHFFyxYsAA/Pz/27NnDunXrmDp1Kn5+fly+fJnLly8zaNAgOnToQI8ePTh37hyg3Qz1z3/+k86dOzNt2rQH//AVJZ+hQ4darAVtblJKZuyYQYP7lXg9ogFY4yZBU2Vly/JSVJlxK1QZl6tXr5bPP/989vOskuCmSoz36tVLTps2TUop5cKFC2XDhg3l9evXZUpKimzcuLG8detWoaXLe/XqJQ8dOiRjY2Nljx49ZEJCgpRSynnz5sl3331XJicnyyZNmsgLFy5Ig8Egx4wZk6d8eJaXX35ZfpdZrvj+/fsyKSlJnjp1SrZs2VLGxsbm+R1u374tDQaDlFLKr776Sk6ZMkVKKeXs2bOz45JSyn/84x9y1apV2c/79u0rL1y4IKWU8sCBA7JPnz7Z2w0ZMkSmp6cX/uGWMarMuFIS68+vl8xBfh6AlAsXWuw4qDLjJWOJKuPe3t5s376d6dOns2/fvuyS4KZKjIM2m13We9u2bUvDhg1xcnLC09Mz+/qqqdLlWQ4cOMCZM2fo1q0bfn5+fPvtt0RERHDu3DmaNWtGy5YtEUIwfvx4o3F36dKFDz74gA8//JCIiAiqVKnCrl27GDNmDHXq1AGgVq1aAERFRTFw4EC8vb2ZP39+nt/FlISEBH777TfGjBmDn58fL774In/99Vf262PGjMG+FDvtlIohPDyc8PBwa4dRpAxDBjN2zKBlsjPPXasDL7xglTjK1fDY4rJGlfFWrVpx9OhRNm3axNtvv01gYCDTpk0zWWIcwMnJCQA7O7vsn7OeZ12zN1a6PDcpJf3792fFihV51v/555/Fivupp56ic+fObNy4kcGDB2fPYGfMK6+8wpQpUxg+fDi7d+9mzpw5Re7fYDBQs2ZNk/GoUuWKJezO/I9s67Welp9YzunY06xaD46T3ylY1bqUqBaFEZaoMn79+nWcnZ0ZP348U6dO5ejRoyZLjJeEsdLluT366KP8+uuvXLp0CdD6Si5cuECbNm0IDw/n8uXLAAUSSZYrV67g6enJq6++yogRIzhx4gR9+/Zl1apVxMVpk7ffvn0bAL1en126+dtvv83eR2GlymvUqEGzZs1YtWoVoCW248ePl/hzUJSSGDFiBCNGjLB2GIVKSU/hnbB36JToyui/akLmJGXWoBKFEZaoMn7y5MnsTuF3332Xt99+22SJ8ZIwVro8t7p167J06VLGjRuHj48PXbp04dy5c1SuXJnQ0FCGDBmCv7+/yTHlK1eupF27dvj5+XHq1Cn+/ve/07ZtW2bNmkWvXr3w9fVlypQpAMyZM4cxY8bQoUOH7MtSAMOGDWPNmjX4+fmxb98+xo4dy/z582nfvj2XL19Gp9PxzTff4OvrS9u2bbPn61YUS3F1dcXV1dXaYRTq0z8+5dq9a8xbdQfx6mtQo4bVYlFlxsuw8PBwhg4dyqlTp6wdilIC5fFvsay5cuUKoE0XbIvuptzF82NPOt+qzOYv4rVr4Zl9gZZSYcqMqxIeiqIUx969ewHbTRQf7v+Quyl3mfedhJemWzxJFKVcJQop5XpgfUBAgHWGBpQyDw8P1ZpQlAcwcuRIa4dgUvS9aBYeXEhQQjN89X9B5qVdaypXiUJRFKU4bLke3Lt73sVgMPCvxeEQ/ArYQE0q1ZmtKEqFc+nSpeyRgLbk3K1zfHPsGybGt8YjwQHefNPaIQGqRaEoSgWUdWOqrfVnztw5k6oOzsz66hw88yw0aWLtkACVKBRFqYAeL8W5HIrr92u/s+bcGv6V0pW68Qdh+nRrh5RNXXoqJeHh4bRr184s+8pfjbW0/PLLL7z33nuAdkersRsEDx8+zKuvvmqW43Xt2rXE7/nzzz8RQrBly5Y866tVqwZo/w7ff/99kfu5fv26yZNJbGwsgwYNKnFsiu2oVq1a9t+ELZBSMn3HdOpXqcvkz47C+PHQrJm1w8qmEoUJupM6PBZ6YPeuHR4LPdCdtJ0649ZKFB999BGTJk0qdJuAgAAWLVpkluM9yO+4YsUKunfvbvJO8+ImikaNGhlNhOnp6dStW5eGDRvy66+/ljg+xTacP3+e8+fPWzuMbJsubmJf5D5m3/Onavx9eOsta4eUh0oURuhO6gheH0yEPgKJJEIfQfD64IdOFhkZGbzwwgu0bduWAQMGkJycDGCyzHZxynbv27ePCRMmMHHiRB599FE8PT3ZvXs3zz77LF5eXnlq2UycOJGAgADatm3L7Nmzs9d7eHgwbdo0vL296dSpk9FOvgsXLuDk5JTnjusdO3YQEBBAq1at2LBhA5B3AqQ5c+bw7LPP0rt3bzw9PY0mkC+++IKpU6dmP1+6dCkvv/wykNMKSEhIIDAwEH9/f7y9vU3euS2lZNWqVSxdupTt27fnqZuVZcaMGezbtw8/Pz8WLFhAeHg4PXr0wN/fH39//+zklLsFuHTpUoYPH07fvn0JDAwE4G9/+xs6NUlJmfX7779nl76xtgxDBjN2zqCFiyfP/+9XeOIJaN3a2mHlZaqsbFleiiwzvvk12WtJL5OL07+cJHMosDj9y8nke17bXHid8atXr0p7e3t57NgxKaWUY8aMkcuXL5dSmi6zXZKy3U8++aQ0GAzyl19+kdWrV5cnTpyQGRkZ0t/fP/uYWeXA09PTZa9eveTx48ellFK6u7vL999/X0op5bfffmu03PjixYuzj591zIEDB8qMjAx54cIF2bhxY5mcnCzDwsKy3z979mzZpUsXmZKSImNjY2WtWrVkampqnv3evHlTNm/ePPv5oEGD5L59+6SUUlatWlVKKWVaWprU6/VSSiljY2Nl8+bNsz+X3Pbv3y/79u0rpZRy3LhxcvXq1dmvZe0rd3xSSpmYmCiTk5OllFJeuHBBZv3tXL16VbZt21ZKKeWSJUtk48aN85SEj4qKku3atSsQQ3GoMuPWl5iYKBMTE60aw3cnvpPuC9yzzy+vzOmszWeQ+f+ytFFImXHVmW3E/Qzj9cRNrS+uZs2a4efnB0CHDh0IDw/PU2Y7+ziZ9cyjoqJ48skn+euvv0hNTaVZIdcshw0bhhACb29v6tevj7e3NwBt27YlPDwcPz8/Vq5cSWhoKOnp6fz111+cOXMGHx8fAMaNG5f9OHny5AL7/+uvv6hbt26edU888QR2dna0bNkST0/P7JZQbkOGDMHJyQknJyfq1atHTEwMTXKN5Khbty6enp4cOHCAli1bcu7cueyy6VmklMycOZO9e/diZ2dHdHQ0MTExNGjQIM92K1asYOzYsQCMHTuWZcuWMXr0aJOfGUBaWhovv/wyf/75J/b29ly4cMHodv37988upw7anMvXr18vdN+K7XK2UhXWLFlXLZLSciYa+ybtIJ3/4U9Q5v9JW1IhE8XCQYXXGfdY6EGEvmCdcXcXd3ZP2P3Ax81dKtze3p7k5ORCy2yXpGx3USXJr169yr///W8OHTqEq6srEyZMyHNpJnd58vylygGqVKmCXq/Ps66oEufGfmdjU5qOHTuWlStX0qZNG0aOHFlgPzqdjtjYWI4cOYKjoyMeHh4FLitlZGTw008/sXbtWkJCQpBSEhcXR3x8PNWrVy9wzCwLFiygfv36HD9+HIPBQOXKlY1ul7/ceUpKClWqVDG5X8W2nT17FsBqNbdm7ZyVJ0kAJDnCLK/rPETtUYspV30UQohhQojQ/Ce0kgoJDMHZMe83DmdHZ0ICH6LOuAmFldkubtnu4rh37x5Vq1bFxcWFmJgYNm/enOf1rKlZf/zxR7p06VLg/V5eXgX6LlatWoXBYODy5ctcuXKF1g94XXXkyJGsXbs2T4sgN71eT7169XB0dCQsLIwII5OF7Ny5Ex8fH65du0Z4eDgRERGMHj2aNWvW5Nku/2en1+tp2LAhdnZ2LF++nIyMjGLFfOHCBbONYlNK38GDBzl48KDVjh+pjzS+PiWmlCMpnnKVKKSU66WUwQ97e36QdxChw0Jxd3FHIHB3cSd0WChB3pbJ9abKbBe3bHdx+Pr60r59e9q0acNTTz1V4PLOnTt38PHx4eOPP2bBggUF3t+zZ0+OHTuGzFVt2M3NjU6dOvHYY4/xxRdfmPw2XhRXV1e8vLyIiIigU6dOBV4PCgri8OHDeHt7s2zZMtq0aVNgmxUrVhSo3zN69OgCo598fHywt7fH19eXBQsWMGnSJL799lt8fX05d+5csSdKCgsLY8iQISX4LRVbMnbsWKNfSkqLm4tbidZbmyozruDh4cHhw4fzJCNjXnvtNYYNG0a/fv1KKTLb1bNnT9auXftAcxqov0Vl/ifjmBb3A+S6yuqcBqGNJxI08TOrxFRYmfFy1aJQLGvmzJkkJSUVvWE5Fxsby5QpU2x+4hvFtFOnTlm18vKe42upnAZN9CAkuN+F0HUQ9OEmq8VUmArZma3kVdxJ5uvXr8/w4cMtG0wZULduXf72t79ZOwzlIWRdcbBGP9P2y9vZ2DSZj7bB1Pz3lArjfRfWphKFoigVTtDDzGv8EDIMGbyx7Q2axTvw6sGCIwBxs80+CnXpSVGUCsfR0RFHR8dSP+6SP5dw8uZJPqo+Cqf8A+ycnSHE/CMrzUElCkVRKpwTJ05w4sSJUj1m/P143t71Nt2adGX0hstQowY0bQpCgLs7hIaClVo6RVGXnhRFqXCOHj0KkF2ZoDTM2z+PmMQY1ld+FnF4Luh08NRTpXb8h6FaFKVElRkvuZKWGffw8MDb2xsfHx8GDBjAjRs3HjqG3EUKS0KVIrdtTz/9NE8//XSpHS/ibgT/+f0/jG81ho6zv4RevSCzbE5ZoBKFKTrAA+0T8sh8biNUmXHTwsLCOHHiBAEBAXzwwQdmieNBqFLkts3e3h57e/tSO97MXTMRQvDBXgfQ6+HTT7VLTmWEShTG6IBgIAKQmY/BPHSyUGXGLVtmPLeePXty6dIl/vjjD7p06UL79u3p2rVr9hwES5cuZdSoUQwaNIiWLVsybdq07PcuWbKEVq1a0alTpzwnemP/HgB79uzBz88PPz8/2rdvn10iRJUit11//vmn0fpqlnAw6iDfn/yeN93H0fTLH+D116Ft21I5ttmYKitblpeiyozL16SUvQpZnEzs2amQ9xReZVyVGS+FMuPu7u4yNjZWSinlSy+9JKdNmyb1er1MS0uTUkq5fft2OWrUKCmlVjq8WbNm8u7duzI5OVm6ubnJyMhIef36ddm0aVN58+ZNef/+fdm1a1f50ksvFfrvMXToULl//34ppZTx8fHZxzNVilyVGbe+JUuWyCVLllj8OAaDQXb9pqts8O8GMr6Tn5SNGkl5757Fj/sgUGXGS8hUNfGHqzKuyoxbuMw4QJ8+fbC3t8fHx4f3338fvV7PP/7xDy5evIgQgrS0tOxtAwMDyaoL9sgjjxAREcGtW7fo3bt39u/65JNPZpceN/Xv0a1bN6ZMmUJQUBCjRo3K/v1UKXLblbulbUmrzqzit2u/8XWN8VT74ztYsQIKqWZsqypmoii8yrjWJ1GwQCm4A7sf/LCqzLjlyoxnCQsLy3N57PXXX6dPnz6sWbOG8PBwevfuXaLYcjP17zFjxgyGDBnCpk2b6NatG1u3bqVNmzaqFHkFl5KewvQd0/Gt3ZYJszdAnz7w5JPWDuuBlKs+CnOVGScEyD+viXPmejNTZcbNU2bclNyf4dKlS4vcvnPnzuzZs4e4uDjS0tKy/13y7yv3v8fly5fx9vZm+vTpdOzYMbtlpUqR264jR45w5MgRix5j0cFFhN8N5z9n3bC/lwD/+1+Z6sDOrVwlCmmmMuMEAaFoLQiR+Riaud4CVJnxhy8zbsq0adN46623aN++fZEtBoCGDRsyZ84cunTpQrdu3fJUeTX177Fw4ULatWuHj48Pjo6OPPbYY4AqRW7LTp8+zenTpy22/5uJNwnZF8Kwut0J/GwzTJ4MjzxiseNZmiozrqgy4xZiqhS5+lss/yZumMjXx77m1PaWtL5yD86etfm+CVVmXDELVWa8+FQp8orr9M3ThB4NZZJTd1rvOwv//a/NJ4miVMzObCUPVWbc/FQpctt26NAhADp27Gj2fb+5/U1qOFbnnQVHITAQco1oLKtUi0JRlArnwoUL2cOezWnLpS1subSFd260pnZccpnuwM6tQrUopJRGh3AqSmkpj32CZZEl5qNIN6TzxrY3aFGlCS99+ge8OR1KMPDCllWYFkXlypWJi4tT/1EVq5FSEhcX98CjwxTb9vXRrzkTe4aPdjtQqWETePtta4dkNhWmRdGkSROioqKIjY21dihKBVa5cuU8d6Yr1nHgwAEAHn30UbPsT5+i552wd+jl0IK/bb4Eq1ZBZq2y8qDCJApHR8dCS2AoilJxXL16FTBfopi7fy63km7xX10yon9/GD3aLPu1FRUmUSiKomQZZ8a5IK7eucqCAwv4e7wn/uGRsP6TctGBnVuF6aNQFEWxhBk7Z+Ag7QgJvQxvvgkPWMrGlqlEoShKhfPbb7+ZZfKv3679xsrTK5l2yoXGNZvCrFlmiM72qEtPiqJUOFFRUQ+9D4M0MHnrZBoJF95cEwM//ARVq5ohOtujEoWiKBXOE0888dD7+PHUj/wR/QdLt1Smat+BMHKkGSKzTSpRKIqilFByWjLTd0zH/34tnj5yD04tKncd2LmpPgpFUSqc/fv3s3///hK/T3dSh8dCD5w/cObavWs89vtt7KZOg1atLBCl7VAtCkVRKpwbN26U+D26kzqC1weTlJZTQXlBN4HXiOaWmqrGZlSY+SgURVEehsdCDyL0BWdXdHdxJ/z18NIPyMwqzHwUZpsKVVEUJZ9II0misPXlSaGJQgjRRAjxphBirRDikBBirxDiMyHEECGEzSUZs02FqihKubZnzx727NlTovc0TbA3ut7NxPryxOTJXgixBFgMpAIfAuOAScAOYBCwXwjRszSCVBRFMae4uDji4uJK9J7hpzMKrHNOhZCtBdeXN4V1Zv9HSnnKyPpTwM9CiEqAm2XCUhRFsZxRo0aVaPuktCTWtrXH/U4GUsA1F3DTQ8hOCLrnbqEobYfJRGEsSQghXIGmUsoTUspU4JIlg1MURbEF83+dz7VqGexdDD0ic73g7AyhIVaLq7QU2c8ghNgthKghhKgFHAW+EkIssHxoiqIolhEWFkZYWFixto3UR/Lh/nk8eVrQw6MnuLtrN9e5u0NoKFhgtjxbU5z7KFyklPeEEM8Dy6SUs4UQJywdmKIoiqXcu3ev2NtO3z4NmXqfjw7VhMM/Q+3aFozMNhUnUTgIIRoCTwDlszSioigVyogRI4q13b6Iffxw+kdm7wO39z6ukEkCincfxXvAVuCSlPKQEMITuGjZsBRFUawrw5DBa+sn0SReMM2xN4wfb+2QrKbIFoWUchWwKtfzK0D5mudPUZQKZceOHQD069fP5DZL/1zKsbhTfL/LAecfQ8t10b+iFHYfxduZHdimXu8rhBhqmbAURVEsJzk5meTkZJOv37t/j5mb36RbJIwdNRtatizF6GxPYS2Kk8B6IUQK2minWKAy0BLwQ7vx7gOLR6goimJmw4YNK/T193fOJjbtLpvON0N8Pq2UorJdhd1HsRZYK4RoCXQDGgL3gO+AYH9aXKsAACAASURBVCml6XSsKIpSRl2Mu8jCPxbxzDHoMG8ZVKpk7ZCsrjh9FBdRndeKopQj27ZtA2DAgAEFXntj9fNUTjUQ0jAIuncv7dBskpqPQlGUCictLc3o+q0XNrH+xl4+OlKVBj98UspR2S6VKBRFqXCGDBlSYF1aRhqTf3yWFnHw6t8/A1dXK0Rmm1SiUBRFAT7fMZezhhjW3fTD6amnrR2OTSk0UQghKgNDgR5AIyAZrXrsRinlacuHpyiKYn5btmwBYNCgQQDcSrrF7P3vMyDSjqEhqyv0PRPGFHYfxbvAr0AX4CDwJbASSAfmCSG2CyF8SiVKRVEUC3pn8dPE26WxoPWriObNTW+oAzzQzpwemc8flK3uy4jCWhR/SClnm3jtv0KIeqj5KBRFKYOyWhIAJ678zpexW3jpci0eWfKR6TfpgGAgKfN5ROZzgJIWkLXVfZkgpJTF21AIZyllUtFbWl9AQIA8fPiwtcNQFMXGSSkJ/D83jqdFcXHIFmr1HGhiQ6Ax8JeR1+yAekAlwDHXo2Mh6zaRc2LPrTowARAmFjsj6z5Fu8MtP3cg3PTvnp8Q4oiUMsDYa0V2ZgshugJfA9UANyGEL/CilHJS8UMoA3RotXEj0dpJIZgtGyuKYls2btwIwH15hjDHKD5N7lEwSWQAB4BfgDUYTxIABmA42qTRaSYek/KtM/WVOx5YjpaYTC2GfM/TTewr0sT6B1CcUU8LgIHAOgAp5fFyN1d2KTTdFEWxHY6OjqSnp/LGnrdpl+JA8JyftRfuAzvRksM6IAatFRAI3AFuG9mZO1oPbkl4oJ1njO0r3Ez7MmPHQHHKjCOlvJZvVfmaTXwWBTN8Eg8++4aFO5YemK3GpSilbMCAAfx54nPCq6bySes5OGyrA08CdYAhwAqgV+ZjLLAZWAQ459uRM9rVh5IKsdF9mVCcFsW1zMtPUgjhCLwGnDVfCDbAVBMtAuiAVuWqUeZj7p8bAfXJ+ynaauvEVuNSyg9bvXxrJK4bbse4sacJR87uxP96H+1yUD1gHPA3tBaEU779ZP0u5vgdbXVfJhTZmS2EqAN8DPRD6zrZBrwmpYwzXxjmVeLObA+MN92qon2ruI52ffIm2jXB3ARQl5zksRdINLKvB2lSmpM7xhOiteOqKGz1JGou+b+IgPatNhTb+oIEYCdZN2Q9AsGgY/1wfLKKlhy6APZWidImPFRntpTyFuXrT7qgEIz/kX9J3t88DS1ZZCWOrMfcPxtLEqAlovcB/8ylgfnCL8AAXACO5FoKazVNyRVXa0r/P4s5T6K2uC9bbs09yO+YAdwArmW+7xrwLsYv305E+yJSH+0be/1cSxUzxGVA6zf4K9dyI9fPa9H6HfK8R2B/356T7XcxbO0w7cueUqjitCiaAa+gfe/OTixSyuEWjewBCCGGAcNatGjxwsWLJSx4a66TggfGWycO5B2d0BDtspZ/rqUJBf9oi4org4JJ4RiQkPl6ZbTZQ07lWpdbJbTEkFU03jlz+6yYOgBeaB16JYmruMz5TdQa+5JACtpnm4A2aiUh3/I6Wkdofg3QZnqpR8mSs6U/+/8CndASQO5kkPXzdUyPtCmJauQkjdxJJAKtbyA117aV0GpE1CFvMohB+wJnbN8NMVn32oCBxAQ91auqek5ZCmtRFCdRHAe+QZvIyJC1Xkq5x5xBmpNV76Mo7AQzDPgT7eSQtZwl51OtQ97EEQW8nW9fldHGWTuRkxSyWjFV0E7yHXItXmhJqrC4ngTO5Yop/36dAB9yElsMMNfEvsYCerQTY9YokdyP+X/+FeP/0e0Bz8zft3JmDLkfjf38Weax86sJTEdLqsVddBhvHToCzcibCAxGtisJO7Sk0SjX0jDf80Zofx8rKDqBSbRv0Xq08fVZj/l//gjj4+/zcwSa5lvc8v3si+lLm+fQWuIxmUvun/M/j6Pg5d3c6qJ9Ng3I6TPM/7wBWqIAk1/cEurcpVpszaJ+8wrlYRPFQSllZ4tEZiFWv+GuJN/4koAT5Jygj6J9+y/qG1vupBCQ+diGwi8mliQuA9q3sayYshZjJ+IsWa2hwv6kqgCumUstYF8h245FO+GlZC7Gfs69riTfcu3QkpGpJaaIuKqVYOmNlvTzqwvMQfuGnrVkXca8ZWR7B7TP1tiYw6yTeVYiMF5Fu/hWk5MM6lH0+EhztebS0VoPxv6GBCVPyjpIf/Y+Dqk5PdNJDols+3A7orlgxIgRJdxh+fWwieIptOlPt5Hrap+U8qg5gzQnqyeKh3UfLVkY/SdD+w+TSunX/pXAFbS/BlN/Nu+QNxHk/7lyvu09MN94clMd9k2B8+Qkgay7Wwtjzrge5CR6H+3ySv4EMreQ44wHamQuLsX4uRXm+x3B8pdvHyAu3eeT2LH1LrN3f4Cb3o1Il0hm95lJh66N8Q4YTJ8+fR4gwPLpYRPFXOBp4DI5+VxKKfuaNUozKvOJIosH5v2PbC4eWPckWtb2lbU/GzuJlqmRSg8Yl8dUByKqFWyCuSfYEz7fHB0t5UdhiaI4N9yNATyllL2klH0yF5tNEuVKKdxI80DMGVcQ2gnAHe1bvjsPfqKy1X1l7S8c7atW+EPsx1Y/e3MyY1yRVY3fG2xqvWJccVoUvwDBUsqbpRPSwys3LQqw3fH3thpXRaA++2Iz1aJ4Om00f/N/ilGjRlkhKtv0UPdRoI0ZOSeEOETePgqbGx5bLgVhmycBW42rIlCffbGNSHJjUbWredY5p0HHms2oXbu2laIqe4qTKEzNSaEoimKzzu74gcUuV2me5ESaIZ1rVTNwS7QnxDOYoInzrR1emVKcO7Nt9n4JRVEUY+Lv3GD0pn9QpZIdu189RpPGXtYOqUwzmSiEEPullN2FEPHkHQwp0EY91bB4dIqiKCUkpeS5+T04Xz2V7b7/NpokVq9eDcDjjz9e2uGVSSYThZSye+Zj9dILR1EU5eEsXDaRVU6X+DC5O31HvWF0mwYNLFlsrfwpzgx3y6WUTxe1TlEUxdr2ntrI1CtfMjK6GlMXbTW5Xffu3UsxqrKvOJ3ZbXM/EUI4oBWMUBRFsRnX46/zxI+P01wPS59bj3DOf8OJ8qBM3nAnhHgrs3/CRwhxL3OJR6uCs7bUIlQURSlCWkYaT3wRSLwhhZ9rTaRGl96Fbr9y5UpWrlxZOsGVA4X1UcwF5goh5kop3yrFmBRFUUpk6i+T+DXpHCtONqPtTx8XuX2TJk1KIaryo7BRTx5SynBTSUIIIYDGUkpjdTEVRVFKxYqT3/Pxqa957ZA9Y+dvBMf8k6cU1LVr11KIrPworI9ivhDCDu0y0xG0KcYrAy2APmizys7GeAFlRVEUizt98zTPr3mGbpEwv+888FL3S1hCYZeexgghHkErFvAs2pQgyWhT7WwEQqSUKaUSpaIoSj737t9jlG4YNeLTWHXtURy/mlLs965YsQKAcePGWSq8cqXQUU9SyjNo5ccURVFshpSSCWv+weW7VwnbUIWGm1eAXXGKYWuaNWtmwejKn+LcR2GsvKIeOFmWKsoqilJ+zP9tPmvO/8J/t0GPaZ+Ch0eJ3v/oo49aJrByqjj3UTwHdAHCMp/3RuuzaCaEeE9KudxCsSmKohSw6+ou3trxFk+cseP1uoNhwgRrh1TuFSdROABeUsoYACFEfWAZ0BnYC6hEoShKqYi6F8XY1WNpHV+Jb/ZVRRz7GkRR89oWpNPpAAgKUvXai6M4iaJpVpLIdDNz3W0hxMNO4a4oilIsqRmpjFk1huREPT9/m0q1L76D+vUfaF+tWrUyc3TlW3ESxW4hxAZgVebzxzPXVQXuWiwyRVGUXKZsncKBqAOsXm1Hm8eehtGjH3hfHTt2NGNk5V9xEsVLwCggq4rWt8BPUptDtY+lAlMURcmy/PhyPj30KW+ercVovTMsWmTtkCqUIseTZSaE/cAuYCewVxY10baiKIqZnIg5wYsbXqR3WhPmrroNixdDzZoPtc9ly5axbNkyM0VofTqdNvDLzk57zOyCMZsiE4UQ4gngD7RLTk8AB4UQarYPRVEsRndSh8dCD+zetaNDaAecpB0/LIzCYdLL0L9/yfZl5CTatm1b2rZtW9RbywSdDoKDISICpNQeg4PNmyxEUY0DIcRxoH/WPRNCiLrADimlr/nCMK+AgAB5+PBha4ehKMoD0J3UEbw+mKS0pOx1TunwzcEGBP1yGUpQPjzrJJqUsyucnSE0FMr6gKfkZDh2DIYOhTt3Cr7u7g7h4cXfnxDiiJQywNhrxbmV0S7fjXVxxXyfoihKic3aOStPkgC47wCzAil2kkhKgt274aWX8iaJrNdefBHmzYOffoKTJ7WTbnFY+hKPKQYDnDsH334LkyZBQADUqAHduhlPEgCRkeY7fnE6s7cIIbYCKzKfPwlsMl8IiqIoOSL1xs9wkSkxRtcDxMTAr7/C/v3a49GjkJ5u+hhjxizl/Hl4660J2euaNoVWraBly7yPzZppBWnzt06yLvHAg7VOdDqYNUs7obu5QUhIzn5iYuDgQfjjD+3x0CHQ67XXqleHjh1h6lTo3FlLhtHRBffv5lbymEwpMlFIKacKIUYD3TJXhUop15gvBEVRlBy17apxyxBfYL2bQy1Auw5//nxOUti/Hy5d0rZxcoJOnbSTaPfuWsshykh962vX/Hj/fXjlFbh4ES5cyHn88ce839Lt7bVkERUFKfnKoCYlwRtvgKenlkwcHLTHrCX389w/r1xZMOk884w2mCsmRnuedWwfHxg7VksKnTtDmzZ5y1olJBi/vBYSUtJP3rTitCiQUv4E/GS+wyqKohS0/fJ24tLjATuwM+S8kFqFhuv+zog/tOQQF6etrlNHu/zy4ovao7+/liyyzJtn/CT6zDN+ZJV78vcvGEdcXN7kceFCTjLKLyYGzDG9RVoaHDkCo0ZpCaxzZy22oq62ZbVCTLVOzMFkZ3bmtKfGXhRoo2ZrmC8M81Kd2YpS9hyKPkSfb/uQeq0paQenQK8QcIkEvRvsDIGTQbRsqbUUunXTHlu1KrqCh7FLPGPHZgBgb29f7Pg8PHK+6edWr57Wd5CWpi3p6Tk/53+e9fP//Z/xYwih9UdYQ2Gd2UWOeiqLVKJQlLLl3K1zdF/cnRpONbj69j5IaFxgG4EBgzTPOJqlS5cCMKEEBQXNOYLKVNIp6Uglc3rYUU+KoigWE3UvigHLB2BvZ8+2htNokGC8ieBWO8no+gfh7++Pv7FrToUICtKSgru79s3f3f3Bh9mGhBS8pGTufgVzKlYfhaIoiiXEJcUxYPkA9Pf17O78OXLwPBLFeISUSHIShnOldEI+rma24/r4+DzQ+4KCzHPtvzT6FcxJtSgURbGKxNREhq4YypU7V1gb+DX1x/2bAWkbcXJ1Zv6/Rd5v7osdzHoSTUtLIy3NusWvg4K0y0wGg/Zoq0kCVItCURQrSM1IZfTK0fwR/Qc/DfsO379/Qs/Y5dyq3Ijd2+zo0EEbdmopWfNRlKSPoiJTiUJRlFJlkAaeWfsMWy9v5eshoQyY9RP9T83lgoMXm9drScLSAgKM9tkqJqhEoShKqZFSMnnLZL4/+T1zA+fy9+XnGbH5WQ6ILqz8wY6+fUsnjnbt2pXOgcoJlSgURSk1H+z7gEV/LGLyo5OZ+mcN/rGoCZsZTOiXDzUPUYmlZN5iXbly5dI7aBlm853ZQghPIcQ3QojV1o5FUZQH9+XhL3k77G2e9nma+Yb+vPFqGjrGE/IvAy+8ULqx/PDDD/zwww+le9AyzKKJQgixWAhxUwhxKt/6QUKI80KIS0KIGYXtQ0p5RUr5nCXjVBTFslafWc3EjRMZ3HIw3zSfzLyRh/lYvsbrk1J5a1bpf1/t3LkznTt3LvXjllWWvvS0FPgfkD2VlBDCHvgU6A9EAYeEEOsAe2Buvvc/m6/EuaIoZcyuq7sI+jmILk27sKrn/1js+xVv3/+A8SMT+c8nVYsswWEJXl5epX/QMsyiiUJKuVcI4ZFvdSfgkpTyCoAQ4gdghJRyLjDUkvEoilK6jlw/wogfRtCqdis2jFzFxk7/Y+Lt9xnS/S6Lf6yZpwpqaUrKrMPhXIJJkCoya/wzNQau5XoelbnOKCFEbSHEF0B7IcRbhWwXLIQ4LIQ4HBsba75oFUV5IBfiLvCY7jFqV6nNlnGbOPK3bwi6NIeube6wcmtNHB2tF9vKlStZuXKl9QIoY2x+1JOUMg74ZzG2CwVCQSsKaOm4FEUxLfpeNAOWDwBg29PbuD5lA3/bO5k2DfSs/61uSWYztYguXbpYN4AyxhqJIhpomut5k8x1iqKUYbqTOmbtnEWkPhIHOwfshB2/PvsrhtDTPLZkDPWqJ7P1SB1cXa0dKbRu3draIZQp1rj0dAhoKYRoJoSoBIwF1lkhDkVRzER3Ukfw+mAi9BFIJGkGrY7Srxs3MGBmBxwq2bHtYE0aNrJCz7URCQkJJCQkWDuMMsPSw2NXAL8DrYUQUUKI56SU6cDLwFbgLLBSSnnaknEoimJZs3bOIiktbxnw+xn3eeNMKHo7V7Zsd6CFlxU7JfJZvXo1q1erW7OKy9KjnsaZWL8J2GTJYyuKUnoi9ZFG16e7/MW67+Lx69molCMqXPfu3a0dQpli853ZiqLYtgxDBlUcqxRoUQDUFQ3oNc62kgRAixYtrB1CmWLzJTxKQggxTAgRqtfrrR2KolQIBmnghfUvaEkiI9+lpVRnHtc/b53AiqDX61HnieIrV4lCSrleShns4uJi7VAUpdyTUvLq5ldZ8ucSXPa+Dr8sgbvuIIX2uD6UTYuCrR2mUWvWrGHNmjXWDqPMUJeeFEUpMSkl03dM59NDn/Jmlzf595x5gD2czDtNWyQG6wRYhJ49e1o7hDKlXLUoFEUpHe/teY/5v81nku/zvLHCjkqkG93Ozf56KUdWPJ6ennh6elo7jDJDtSgURSmRj379iDl75jCh7gBefukSXa9/gxQCJ5nCfXLmd3AmkZDgcLR7am3LnTt3AHC1hbv/ygDVolAUpdj+98f/mL5jOk8mefLcy3p63PiZhJpN+PVgJb6ZeBh3+ygEBtztowideIygz2xzGOratWtZu3attcMoM1SLQlGUYll8bDGvbH6FEeGVGbO8Hf3tV9PE3Z4tW+1o3hw6duxO0GdZWzfBFlsSWXr37m3tEMqUcpUohBDDgGFqjLSimNeKA1/x/JZgBl6GvmHTeELOoWOAYP16qFvX2tGVnIeHh7VDKFPK1aUnNTxWUcxvzbczeHpzMD0joF34Vl6LfpchQwS7dpXNJAFw69Ytbt26Ze0wyoxylSgURTGj2Fi2PNeLJy9/SMCdqjSMC+c/+wfw4ovw889YvVT4w9iwYQMbNmywdhhlRrm69KQoihlICStXEjY3mJFD7+ElGlH5/El+2FaL99+HmTOxyvSl5hQYGGjtEMoU1aJQlIpMpwMPD7Cz0x4/+wxGj+a3qWMZNiwBN5fmZGw+zq+7arF0KcyaVfaTBEDTpk1p2rRp0RsqgGpRKErFpdNBcDBkzh9NRAS89BJHGtvx2AtO1KnqRuLXe9BH12HjRhgwwLrhmtPNmzcBqFevnpUjKRtUi0JRKqpZs3KSRKZT9WDA0xLnyg248/FOMvQN2bu3fCUJgE2bNrFpk5rpoLhUi0JRKqrISHTeMCsQIl2gYTwkVAKHVCduL9iFp2tTNm/WrkiVN/3797d2CGWKShSKUhGlp6MLcCK4fwpJlbRV12sAEtjzLt1aeLJuHdSqZc0gLadx48bWDqFMKVeXntR8FIpSDNevQ2Ags7rlJIlsAqr0WMT27eU3SQDcuHGDGzduWDuMMqNcJQp1w52iFGH7dvDzg8OHiXAxPnwp2fk6VaqUclylbMuWLWzZssXaYZQZ5SpRKIpiQkYGvPMODByIrFuH1T/NBWlvdFP7BLdSDq70DRo0iEGDBlk7jDJDJQpFKe9u3ID+/Un91zw+Gz6ZxsPqM+bgaxBfH9Kd8m6b6kzG1hDrxFmKGjRoQIMGDawdRpmhEoWilGMpW3az3msqTxweTfWRT/OS3wJucJKONz+lji4c1n5TYPpS93tBRe63rIuOjiY6OtraYZQZatSTopQzSUmweWMGP/3rDOvOtCOxsy/0momolMTw+q/y5VOzaeDiiq4rBAcHkZRr+lJnZwgJtWLwpWT79u0ATJgwwbqBlBEqUShKGaPTaffKRUaCmxuEhMDw4bBxI/z0E2zaKElKtqNG66PYvz4Tql/nseaD+e+g/9CmTpvs/QRl5of8+woq/w0KBg8ebO0QyhQhpbR2DGYXEBAgDx8+bO0wFMXs8lfdALDP7JPOyIAGte7Tu9pHXOizkKPNbuNVx4v/Dvwvg1qojlulcEKII1LKAGOvqRaFopQRaWnwxhsFqm6QkQHVq0u+D/qUDVGv8pW/pKaTC5/0+4QXO7yIo72jdQK2YdeuXQNQhQGLSSUKRbFRGRlw7Bjs2gVhYbBvHyQmAt46CJwFLpGgd4Nd7xJf9Rbja75JQn3By/7/ZHb/EGpVKcd3zD2knTt3AqqPorhUolCUUqA7qWPWzllE6iNxc3EjJDCEIO+8nQEGA5w8qSWFsDDYsweyigw88gg88wwsPaIjoU8wVMpsVtSMgJHPgJB0qfQI/31uFV71Hinl367sGTp0qLVDKFPKVaJQc2Yrtkh3Useza4JJldrJPUIfwbNrgkGCv2MQYWFaq2H3boiL097TogU8+ST07J1O+y56qrjcQ39fz7LPXgH7fNeehKRGugubZ58u3V+sDKtTp461QyhTVGe2olhYnRAP4tIjCr6Q4gLHngUnPVVc9bg2uEflmnpEZT1JGVpiSEpLKvg+I4QEw5zy93/ZUsLDwwHwKI+lcR+Q6sxWFCuKS4sEY2WVKutx6voVNSvXoFZVF1wqu+Di5EoNJ3dcnLTnNZxq5Px86RoTD77DzWoFd+Wm6mCWyO7duwHVR1FcKlEoioVIKfnvlp/AYAf2GQU3uOtGygIjLY389u2DmbMhLIxkbwgeRp6qr86pEPJnbfMFXgGMGDHC2iGUKaqEh6KYkn8+aZ2u2G/d+udJGr0VyJt/jIH4RkZrKtX+84PCd/Lbb9C/P/TsCWfOwIIFBE1eTOhWR9zvapeb3O9C6FZHgp7/uMS/XkXm6uqKq6urtcMoM1SLQlGMMTafdHCw9nMhty5fir7N45+9w3GHz4Ga9E/9jJFtXuC1r34krUfOkFbHfSF8PNnEfg4cgNmzYds2qFsX/vMf+Oc/tfoaQFClSgRVxNupzejKlSsAeHp6WjmSMkJKWe6WDh06SEV5KG5uUkLBxd3d6Ob34tPliPc/k2J6Lck7drLNlJfkiYtx2a9/9532ViG0x+++M7KTP/6Q8rHHtOPUqSPlRx9JmZBgid+uwluyZIlcsmSJtcOwKcBhaeKcqkY9KeWLsUJIpr5tSwkxMXDpkrZcvJjz89Gjpo/x5ZfQsSO0a0e6cGRm6B4WnHuV9NonqH2vD6GjPmZUN+/ix3zkCMyZAxs2aNPKTZ0KL78M1Yz0WitmkTULpprkLIca9aRUDKYuF92+Dd7eOUkg95KYmPN+e3to1ky7iaF6dYiPL3gMOzt48UUk8E3tQbzR3457bTZRyakp79X7jLffDkbYG5kQyFgCe+QRLUGsWweurtq6V17Rjq1YlEoQJaNaFDauOHf0Kpnc3bUTcWEqVQJPTy0Z5F/c3MAxsy6Ssep7zs4QGspO+848szqUa20+QQBP/N6SxXtP4pyOdpLv0AECArRWR8eOWqe0sUp+GRlQsyZMmQKvvgrq5FVqLl26BIC6OTeHalEUgy2ekHUndQSvD86+6SpCH0Hweq1D1dqx2YT0dO2yza5d2lJYktixQ0sGTZrklFstTFAQul/dmRXqQWRGI9zsrzNp2A1Wbb/KYddA8I4koPKT/Pj8R3i+2xjOnYNDh3KWRYsgNVXbl52dVp8jt4wMLTFcvaolC6VU7d+/H1CJorhUi4KCJ2QAZ0dnQoeFWuWELKUkJjEGvy/8iEmMKfC6u4s74a+Hl3pcVpdVDCkrMezZk3N5yNsbwsPRecQzKxAiXbSb0EJ2QtA9d8i8E7e4dDp4ZoEuZ6RSQgNIrgn1ztIAX5Y8+TGD2vQyvYPUVC3WQ4dg4kTj2whRMIEopSIhIQGAaqofKFthLYpylShy1Xp64eLFi8V+n8dCDyL0BW98ql+1Pr8/9zsNqzekskPlYu+vuK2TdEM64XfDORt7lnO3znH21lnO3tJ+vptyt/BjjNIxsPlAajuXgxutTHVASwnnz+ckhtzFkFq1gr59taV3b6hbF93nkwiO/pykXFW1ndMgtPFEnvrnp2TIDNIN6WQYtMesJWt97tcefWYt9/zeBceUnJ1JqHL+GeJ1X2FvV4xWSRYPD62/JD/3kicwRbGUCpMospS0RWH3rh2Swj+H2lVq07hGYxpXb0yj6o1oXL1x3uc1GlPHuQ4rTq3IUwAOoJKowju9Z9HMtVl2Qjh36xwX4i6QmpGavV2Dag1oU6cNXnW8aFOnDSH7QriZeLNgvMIOgzQgEHRu0pnBLQYzuOVg2jdsj50wfQ9lSQYElRpjfQGVKmnX+K9ehb/+0ta5ueUkhj59tEtIuSSlJdFsYTNuJhX8vMzqrjtyQXjJ3lNIf4f1/wEqpvPnzwPQunVrK0diO1SiKIKpFkU953rM7TeX6HvRXI+/TnR8tLbci+Zm4s0CycXRzpEMgwEDRso1ZLITdjR3bZ4nIXjV9aJ17da4Vsl7p6ipS2JfDPmC1nVas+niJjZf2syh6ENIJPWq1uOxFo8xuOVg+nv2z7M/mztX3b6tDUcdMgRd3ABm8QGRuOFGJCHMJMjuR618alZyaNZMu1STySANHP3rKDuu7GD7le3sj9yfJ+nmN7vXbOyFPQ52DtmLvZ32/O4dmWwrJwAAD8RJREFUB44ecuDg7/ZERTogcECOGqfd+pyfFMg5D3C5yCazdMW1dOlSQNV6yk0liiLoPp/Es1GhpFbKOcFXSrVncZNggiZ+ZvQ9aRlp3Ei4QXR8NBG3ozl3/TqXb0az/MqHxgvAScGpSSdpUasFTg5ORjYwHdusK6FEVs3ALdGeEM+CMd1MvMnWS1vZfGkzWy5t4U7KHeyFPV2admFwi8H0dXuM4Z19uVnv+7wT3uwMwU0fZPSqiDniIiFBG4J64YKWFHI/Zl5C0jGOYL4iiarZb3MmkVCCCZJ5S2aE3w1n++XtbL+ynZ1Xd3I7+TYAPvV96O/Zn+XHlxttURjr07l5E1atgu+/1wYlAXTtCuPGwZgx0PZr4xVfazu4c2tWeIH1StmSlPmNyTnzbndFJYoi6eq8yjON/EgLfC+nxMLOd/jm2p/0O7OI69cpsERH5/wcG5trZ697aJPJ5HfXnberhdOjBzz6KNSoUZzASt4MyDBksO/qHyzeu4kdEZv4S2TeOJZUE5zi8xanS6sMOz6gV4ORdOsq6NbNjraPCBwd7LATdggEdiLzZ5Hz86pvpvDK9W9Izt0XkAqhsY8ShHdOQrh+PW9wjRtrfQutWiFbtCTS1ZeAYD9utd1aIIHVOT2INQftiXIIY2+0lhwu3daGNDaq3oj+nv3p79mffp79qF+tvvZxFTEo4d49+OUXWLECtm/XBh55e2vJYexYrdGS/dHnm0MCoJJwZvFI6wxwUBRLU4miCB4inAg8jLwiyd88EEJSv76gUSOMLkHzdOh75pqBDCDVGbuNoXAyCINBGy3p6ws9ekD37trSsKGRw5u6L6BJE7h8WbuWD6SkaOWBdu/WlgMH4P597TjeXW7QsMcWtti/BI7Fm9vgQTmmQ7cbjtR0rE5NZ1dcXRpQs3ZjajZohqzWgps36hN10ZXLp2ty5mhN7lx3hTa/wLB8n1eGI9x1A9erYGdApFaj1r3etHLoT7eG/ejWyotWrQTNm4NTvsbZpM91hF6ZRUbVSOwT3XjOPYRBjYNYsQLWr9c+K3d3eOopLUF4F3IDtS0OmVbM4+zZswB4eXlZORLboRJFEeyEAWm0kK7ks3af0yjidxrFn6MR16lfLQmHzh20ZkGXLtC5M+SaLUung2f+vZy03v+X0zrZ/S+WvPk0w4drJ/H9+7XlwIGcxoJnw2R6eFyje40TdDfspXXMXsSJ4+gYV+D6/Wh+5iCd2e3Qj92iL7+nB3BfOmFHBu1rhtO7ySV6N79G9za3qNmgMri4ICKeNXFJDJboe3P7VhrnYl05c68h59LciaM2CAPV0NNSnKeluEALu0vUqp7Cm13iTe6rh3sPbiXcJTb+DvfS7pJKQuEffsFcrEmvxKj603G905+US525crFS7itWgNZl4e4OLVtqi14Pq1drSTK/unW1Lo+nntL+6YSxYyoVhuqjKEgliiJ41EkgIq7geGr32gmE36qmDdO8fFk7s//+u/Z4/Lh27QK0s1RW4rh9G927l5iVNjvn5O74LkHzvLWSDZcvZ5ePSLsUwbHLNdif1on9dGc/3YmlHgB1KulxT7vECelNGjmTD9iRgSCDDCohMOBfJ5LetU7Su+ohutv/Ts3EaO2MqdfnKU/h8TpEGLmvy/0uhOvqQoMGUL++9tigAVcdWxEW246wqx7sOlmH6ze160xNm8LNxxty3+VGgX053m1I/dXXiYrSngsBXm3T8e54l9a+d/+/vbOPkasq4/Dz20JZVgo1lC9BdmHLp6VWQEShpAZETVohUEUpEj6sIAFjAoiGGEvQoCEGJQaxQC3YDVDKh6V8GCAiLRZpWcp2K7RFLIoIBWwLhbbr0tc/ztns3d2ZO3O3u3Nndt4nudmZc849572/mT3vnHPuPS8th29krwM3sGX7RjZu3ciGrRu46vGrinwqwn48cNF4w4Ywq9Vz9MxyrV3bG1+6P3vvHaYKd/LHS53I1q3htufGxvJvex/puKMoQVsbfPuCbj7o6u1JmkZ3M3vOTsVvTHn//fBUcI/jWLo0bDBXDk1N4Snh1tbe7SNaW7HW8az54ACWLB3FkiUw747tdG8fONIZ09hF2/zRTJ5c4qHe7m54913YtIm20w4uGPBm9oMwoyP9O2AWOuSexxkWrJ4H0y4aML2mB3/L2RPP4dhjw92tkyaV3teu2B1nWR8qNAsPXBf6OvtzbY5TGncUZbDDdy+ahYeqkiui/Vm8ODiHffcta+6joWEIO76WFtp2f3VInlpuaACb0DZgAVqdMzLbNZRPxftzbU65dHZ2AjBhwoScLake0hxF7rEjhuPINR5Fc3OmOAYVqioEQGhq6ltRU1ORwAgVtMvM5nXMs+Ybmk2zZM03NNu8juw2mQ3pJTojHI9HMRBS4lHk3qkPx5GroxjC3mrIO76youfkYNcQMkSX6Ixwurq6rKurK28zqgp3FJVmCHurau34qtUux3EGR5qj8DUKx3Hqjo6ODgAmTpyYsyXVQ9oaRfEd5GoQSdMkzd5U7D5Jx3EcoL29nfa0cLdOH3xE4ThO3fFhfAZqVDlBrOoEj3DnOI6TwB1ENkbU1JPjOE45rFixghUrVuRtRs3gjsJxnLrDHUU2RuQahaS3gJ5ndPcA+q9uJ9P6548D3h4m0wrZMlTnpJUrlldKm2Jpyfeul+vlemUrV616NZvZXgVzit03O1IOYHZaWv98Uu4lHg5bhuqctHLF8kppk6JRUj/Xy/VyvUa4XvUw9fRgibRC+cPFYNoq95y0csXySmlTLK1Smrle2XC9suF6lcmInHraESQtt2IbYzkDcL2y4Xplw/XKxnDpVQ8jiqzMztuAGsP1yobrlQ3XKxvDopePKBzHcZxUfEThOI7jpOKOwnEcx0nFHYXjOI6TijuKEkg6WNJtkhbkbUstIOl0SbdIulvSqXnbU+1IOkLSzZIWSPpO3vbUApI+Imm5pKl521LtSJoiaXH8jk0ZbD116SgkzZG0XlJnv/QvSVot6WVJPwAws1fM7MJ8LK0OMur1gJnNBC4GzsrD3rzJqNeLZnYx8DXghDzszZssekWuAuZX1srqIaNeBmwGGoHXBt3ocD31WM0HcBJwNNCZSBsF/B04GBgNvAAcmchfkLfdNabXL4Cj87a9FvQCvgI8Apydt+3VrhfwBeDrwHnA1LxtrwG9GmL+PkDbYNusyxGFmT0F/Ldf8nHAyxZGEF3AXcBpFTeuCsmilwI/Bx4xs7qMDJP1+2VmC83sy8CMylpaHWTUawpwPHA2MFNS3fVhWfQys+0xfwOwy2Db9HgUvewP/Cvx/jXgM5L2BH4KfErSD83sulysqz4K6gVcBpwC7CFpvJndnIdxVUix79cU4AzCP/HDOdhVrRTUy8wuBZB0HvB2oiOsd4p9v84AvgiMBX492MrdUZTAzN4hzLc7ZWBmNwI35m1HrWBmTwJP5mxGzWFmc/O2oRYws/uA+3a0nrobtqXwb+DjifcHxDSnMK5XNlyvbLhe2RhWvdxR9LIMOETSQZJGExbMFuZsUzXjemXD9cqG65WNYdWrLh2FpDuBpcBhkl6TdKGZdQOXAn8EXgTmm9mqPO2sFlyvbLhe2XC9spGHXr4poOM4jpNKXY4oHMdxnPJxR+E4juOk4o7CcRzHScUdheM4jpOKOwrHcRwnFXcUjuM4TiruKJyKIGnzENb1S0knDVV9RdqYJemK4WwjtjNZ0ipJKyTtuiP2xFggRw6DjcdKSt2WRdJYSZeUUdfjkj46dNY5lcAdhVNTxE0aj487aFYlcQfdcv+3ZgDXmdkkM9uyg02fTthaekgxs+Vm9t0SxcYCJR0F8PsyyzlVhDsKp6LETvR6SZ2SVko6K6Y3SLpJ0kuSHpP0sKTpBao4E3g0Ud86SddIao/1HR7T+/wCj+21xOMlSXMlrZHUJukUSU9LWivpuERbn5S0NKbPTNR1paRlkjokXRPTWmLQmDuATvruu4OkkyU9H22cI2kXSd8iBCy6VlJbAa2ujjYuAQ5LpM+M7b8g6V5JTZI+R4hrcX0cnbQWKhfPn6sQ8Wx5rH9qTG+U9Lto4/OSPh/Tp0halNB1jqQnJb0iqceB/AxojW1fL2k/SU/F952SJsdyC4FvFP52OFVL3kE4/KiPA9gc/54JPEYItLIP8E9gP2A6YZvtBmBfwv750wvUczswLfF+HXBZfH0JcGt8PQu4IlGuE2iJRzdwVGzrOWAOIEK8gwcS578A7AqMI2zh/DHgVGB2LN8ALCIEkmkBthNGO/1tboznHxrf3wF8L76eW+Q6jwFWAk3A7sDLPdcD7Jko95PE9fepq0S5R6P9hxC2pG4ELgfmxDKHx8+mkRADYlFCl78QtkUfB7wD7ByvPxlI53Lg6vh6FDAmkbc2aZsf1X/4iMKpNCcCd5rZh2b2JvBn4NMx/R4z225mbwB/KnL+fsBb/dJ6tlF+jtBhleIfZrbSQiyDVcATFnqwlf3O/4OZbTGzt6M9xxEcxanA80A7oUM9JJZ/1cyeKdDeYbHNNfH97QTnksZk4H4z+8DM3qXvBm8TFOIgryRMXX2iSB1p5eZHrdcCr8TrOBGYB2BmLwGvAocWqPchM9sWdVlPcPj9WQacL2kWcJSZvZfIW09wuk6N4I7CqTW2EH7lJtkW/35Ib4yVbvp+vxsLlIcwCtiWeJ2M0dJ/IzQjjCR61hQmmdl4M7st5r9f9lXsGHOBS83sKOAaBupRTrlC11YuSf2SmvdWFtaQTiJsdT1X0rmJ7EbC5+jUCO4onEqzGDhL0ihJexE6k2eBp4Ez41rFPoTpjkK8CIwvo511hLjCSDoaOGgQtp4W5+33jPYsI+zOeYGk3WLd+0vau0Q9q4EWST12f5MwkkrjKeB0SbtKGgNMS+SNAf4jaWf6hk99L+aVKgfw1ah1KyHO8mrCZzMjXtehwIExvRz6tC2pGXjTzG4BbqX3sxBhanFdmfU6VYBHuHMqzf3AZwnz/wZ838zekHQvcDLwN8J8fjuwqcD5DwEXETqfNO4FzpW0CvgrsKZE+UJ0EKacxgHXmtnrwOuSjgCWhj6PzcA5hF/WBTGzrZLOB+6RtBPB4aSGiDWzdkl3E3RaH8/p4Ufxmt6Kf3s66LuAW+IC8/SUchDWH54lrH9cHG28CfhNnKrqBs4zs23xOlMxs3fiDQGdwCOENaErJf2PoFHPiOIY4BkL22I7NYJvM+5UDZJ2M7PN8Rf8s8AJcb2if7klwFQz21hxI0cAkuYSFqcX5ND2r4CFZvZEpdt2Bo+PKJxqYpGkscBowi/4AU4icjlhWsQdRe3R6U6i9vARheM4jpOKL2Y7juM4qbijcBzHcVJxR+E4juOk4o7CcRzHScUdheM4jpOKOwrHcRwnlf8DwoitM8bkXUwAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loglog_total(df,\"basic scatter\",\"red\")\n", - "plot_loglog_total(df3,\"sampled scatter\",\"blue\")\n", - "plot_loglog_total(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "plot_loglog_total(df4,\"heatmap (bin via Pandas)\",\"magenta\")\n", - "plt.axvline(x= 20000,linestyle=':',color=\"grey\")\n", - "plt.legend()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 43, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "df6 = pd.read_csv(\"sampled_scatter_20000.csv\")\n", - "plot_loglog_total(df,\"basic scatter\",\"red\")\n", - "plot_loglog_total(df3,\"sampled scatter\",\"blue\")\n", - "plot_loglog_total(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "plot_loglog_total(df4,\"heatmap (bin via Pandas)\",\"magenta\")\n", - "plot_loglog_total(df6,\"sampled scatter 20000\",\"cyan\")\n", - "plt.axvline(x= 20000,linestyle=':',color=\"grey\")\n", - "plt.legend()\n" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [], - "source": [ - "# plot_logx(df,\"basic scatter\",\"red\")\n", - "# plot_logx(df3,\"sampled scatter\",\"blue\")\n", - "# plot_logx(df2,\"heatmap (bin via Altair)\",\"green\")\n", - "# plot_logx(df4,\"heatmap (bin via Pandas)\",\"orange\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Preliminary insights: \n", - "\n", - "- Cost of drawing a heatmap in Altair cost about 1.03x (3.8ms) more than how much it takes to draw a scatterplot. This makes sense, because with a grid size of 50x50 (around 2500), it would actually be cheaper to draw the scatterplot with fewer number of points, than the full grid of values (minus zeroes). \n", - "- Up to about 3000 datapoints, it is cheaper to draw scatterplots than it is to draw heatmaps.\n", - "- Even though we can sample down to lower the cost of drawing scatterplot. The problem of occlusion kicks in also, which can actually mean that the binned heatmap can actually be a better representation of the data than scatterplots.\n", - "- The cost of all Altair plotting scales linearly as a function of the number of input data tuples (both heatmap and scatterplot cost the same to render). This explains why the cost of drawing heatmap is relatively constant due to the fixed grid size. The scatterplots scale with the number of samples (Blue v.s. cyan). \n", - "- The cost of plotting about 20000 samples scatter is about the same as 50x50 grid.\n", - "\n", - "--> The scatterplot plotting strategy we should use is to plot scatterplots for data size < 5000 and binned heatmap > 5000. (we can suppress the color bar for scatterplots)\n", - "\n", - "--> For colored scatterplot, we can use opacity to signal data size instead of color." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Analysis of Lux display performance (heatmap v.s. scatterplot)" - ] - }, - { - "cell_type": "code", - "execution_count": 84, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(\"execute_lux_heatmap.csv\")\n", - "df2 = pd.read_csv(\"execute_lux_scatter.csv\")\n", - "df3 = pd.read_csv(\"execute_lux_sampled_heatmap.csv\")\n", - "df4 = pd.read_csv(\"execute_lux_sampled_scatter.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 87, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_loglog(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('log (number of datapoints)')\n", - " plt.ylabel('log(time) (s)')\n", - " plt.plot(48895*df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)\n", - " plt.yscale('log')" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Altair Rendering Cost')" - ] - }, - "execution_count": 88, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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tnuiukeIBhrqqv9/qrplrFN2MnfV119/Xa+//vrC8X379unRo0e1ffv2umjRIlVV3b9/v+bk5JSZFt031fqLL76oN998c+F4oFTnL774op500kmF6dx9HT16VFu1alU4PnXq1MLU7rm5uXrgwAFVLTsV/LPPPquqqrfddpumpKTogQMHdNeuXdqyZcvCctetW1c3btyoubm5es455+icOXMK1//xxx91zZo1esEFF+ixY8dUVXXChAk6a9Ys3bZtm5588sm6a9cuPXr0qJ5++unFjvmRRx7RqVOnlvPpBxbVdO7AfBF5F5jjjV/qTWsI7At7RDPGRFygpO2VSeaekpLC7bffzl133cUFF1zAwIED+frrr2ndujV9+/YFXGJFcGcrgdKilyVQqnOAYcOGcdxxx5VaZ/fu3TRtWvRQ1b59+zJu3DhycnK46KKLCtPPl5UKfuTIkYXHmJWVRVJSEklJSdStW5d9+1w1mJ6eTocOHQCXMv6LL74olrLk448/ZunSpYWfRXZ2Ni1btmThwoUMHjy4MJX86NGji30eLVu2LJXyPVYEE0BuBi4GzvTGZwFveFFsSKQKZowJXTnJ3EnGNVuV1A6YH+I+O3fuzLJly5g3bx73338/Z599Nr/4xS/8Ljtt2rSAadHLogFSnS9cuDBgYsP69esXS+s+aNAgPvvsM9577z3Gjh3LpEmTGDhwYJmp4MtLJQ/BpWm/9tpreeyxx4pNnzt3bpnHHI007cEqtw/ECxRfAP8BPgY+86YZY+LUFKDkE5wbeNNDtW3bNho0aMBVV13FHXfcwbJlyzj11FPZvn07ixcvBuDgwYPk5uYGTIteMo17yfFAqc7L0qxZM/Ly8goDwubNm2nVqhU33HAD119/PcuWLSs3FXwwFi1axKZNm8jPz2f27NmceeaZxeafffbZvP766+zatQuAn376ic2bN9OvXz8+/fRT9uzZQ05OTmHa+wLr1q2je/fuFS5PVQjmMt7LgEW4pqvLgIUiEt5UksaYKjUGmI474xDvdbo3PVRff/11YQfxQw89xP3330+dOnWYPXs2t956K6mpqQwbNowjR44ETIveo0cPEhMTSU1NZdq0aQwZMoQ1a9YUdqIHSnVenuHDh/PFF18ArsO7IPX77NmzmThxYrmp4IPRt29fbrnlFrp06UL79u1LnX117dqVRx55hOHD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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loglog(df,\"heatmap\")\n", - "plot_loglog(df2,\"scatter\",color=\"blue\")\n", - "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", - "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", - "plt.legend()\n", - "plt.title(\"Altair Rendering Cost\")" - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_linear(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('log (number of datapoints)')\n", - " plt.ylabel('log(time) (s)')\n", - " plt.plot(48895*df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)" - ] - }, - { - "cell_type": "code", - "execution_count": 82, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Altair Rendering Cost')" - ] - }, - "execution_count": 82, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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buC1116LdhimhNu2DW64AS67DGrVgtmzYdAgOOKIaEdW+pSPRLE2FWb1hr3rAHXPs3oXOVlkZmZyyy23EB8fT+fOndm3bx8Aq1ev5oILLqBly5acc845LF/uOvb77LPPaN26Nc2bN+e8885j48aNpKWlMWLECIYPH05SUhLff/89PXv2pE+fPpxxxhk0bNiQ6dOn06tXL5o0aULPnj1z1t+nTx+Sk5OJj4/nscceyxkfFxfHfffdR0JCAikpKaxateqw2FesWEGlSpWoUaMGABMmTKBp06YkJibStm1bwB01nXPOObRo0YIWLVrkJLPp06fTrl07LrvsMho2bMgDDzxAamoqKSkpJCQksHr1agB69uzJbbfdRnJyMo0bN86plOtrz5499OrVi5SUFJo3b84nn7juSfbt28e1115LkyZNuOKKK3I+W4BLL72U999/v9Dfmyn7PvvM3Qcxdiw8+qhLEklJ0Y6qFAtHrfJIP/Ltj2JOf9Wp7QI/3q+kmsrhj/crBZ5nTv+gdd7Xrl2rsbGxOn/+fFVV7dKli77zzjuqqtqhQwddsWKFqqr+/PPP2r59e1VV3bZtm2ZlZamq6ptvvqkDBgxQVdXHHntMn3vuuZxl9+jRQ7t27apZWVk6ceJErVq1qi5atEgzMzO1RYsWOevcunWrqqpmZGRou3btdOHChaqqWr9+fR08eLCqqo4ZM0Yvuuiiw+IfNWpUzvpVVZs2barr169XVdW//vpLVVX37Nmj+/btU1XVFStWaPb3MG3aND322GN1w4YNun//fj3hhBP00UcfVVXVF198Ufv375+zHeeff75mZmbqihUrtG7durpv3z6dNm1aTkwPPvhgzuf2119/aaNGjXT37t36/PPP60033aSqqgsXLtTY2FidPXt2TrynnHKKbtmy5bDtsv4oyrdt21RvvNH1F5GQoDpvXrQjii5Ken8UJUpWgHrigcaHqEGDBiR5/6a0bNmStLQ0du/ezYwZM+jSpUvOdAe8eubr16+na9eupKen8/fff9OgQYOAy77kkksQERISEqhduzYJ3gXe8fHxpKWlkZSUxPjx4xk5ciQZGRmkp6ezdOlSmnmXcHTr1i3n+a677jps+enp6dSsWTNn+KyzzqJnz55cc801XHnllQAcPHgwYIn0Vq1aUadOHQBOPvlkOnfuDLjy69OmTcuZ7ppr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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_linear(df,\"heatmap\")\n", - "# plot_linear(df2,\"scatter\",color=\"blue\")\n", - "plot_linear(df3,\"heatmap (sampled)\",color=\"orange\")\n", - "plot_linear(df4,\"scatter (sampled)\",color=\"cyan\")\n", - "plt.legend()\n", - "plt.title(\"Altair Rendering Cost\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### New set of experiments" - ] - }, - { - "cell_type": "code", - "execution_count": 113, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(\"airbnb_heatmap_unsampled.csv\")\n", - "df2 = pd.read_csv(\"airbnb_scatter_unsampled.csv\")\n", - "df3 = pd.read_csv(\"airbnb_heatmap_sampled.csv\")\n", - "df4 = pd.read_csv(\"airbnb_scatter_sampled.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 117, - "metadata": {}, - "outputs": [], - "source": [ - "def plot_loglog(df,label=\"\",color=\"red\"):\n", - " plt.xlabel('log (number of datapoints)')\n", - " plt.ylabel('log(time) (s)')\n", - " plt.loglog(df[\"nCopies\"], df[\"time\"],'-o',label=label,color=color)" - ] - }, - { - "cell_type": "code", - "execution_count": 124, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Total Lux Display Cost (Airbnb)')" - ] - }, - "execution_count": 124, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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yODLPPzTwzz8U37KUuedn376iZ9++innEw0e4ejRvLXnB2MUwsMhKAj8/PRruLPSudZjjIIB4O2ub/N217ctkdW1a1e6du1qiSxD3qlaNev2OnVcJ8MnjYJSqo9SanpsbAHrdadN0B05AiL6dfRolxiGlJQUHnroIRo3bkyPHj2Ij4/n4MGD9OzZkxYtWnDrrbeyd68ulrVkyRLatGlDWFgY3bp149SpU0RGRjJt2jSmTp1KaGgov//+OyNHjmTMmDHcfPPN1KtXj4iICEaNGkWjRo0yrBYZM2YMLVu2pHHjxrz++uvp7UFBQTz//PM0bdqU1q1b888//xT4cxrcT7va7WhXu50lsmrXrk3t2rVzPtFgOVFREB8PjrOhgYHa2ewyRMRntxYtWogje/bsubbz5JMiHTs630qUENHmIONWooTza558MpNMRw4fPiz+/v7y559/iojIwIED5auvvpIuXbrI/v37RURkw4YN0rlzZxEROXfunKSmpoqIyIwZM+SZZ54REZHXX39d3n///fT7jhgxQgYPHiypqamyaNEiKVu2rOzcuVNSUlKkefPm6fJiYmJERCQ5OVk6duwoO3bsEBGRunXrysSJE0VEZM6cOdKrV68cP0thIcPvwsf469Rf8tepvyyRderUKTl16pQlsgy558oVkZYtRcqUEXn3XZG6dUWU0q9z5+b9fsAWcdKv+uSSVJeRmJi39jwQHBxMaGgoAC1atCAyMpJ169YxcOBAOzFaTlRUFIMHDyY6OpqrV69mu3SyT58+KKVo2rQp1apVo2nTpgA0btyYyMhIQkNDmT9/PtOnTyc5OZno6Gj27NlDs2bNABgyZEj669NPP13gz2lwP48tewywJk5h2bJlgIlT8CZE4JFHYMsWWLQI+vWD591YgLRwG4UPP8z+eFCQnjJypG5diIgokOgSJUqkv/f39+fUqVNUqFCB7du3Zzr38ccf55lnnqFv375EREQwYcKEHO/r5+eXQYafnx/JyckcPnyYKVOmsHnzZipWrMjIkSMzBPLZr8Tx9VU5RYX3u79vmazu3btbJsuQOz76CL78Et54QxsEd+OTPgWXMWmSnpCzx+UTdJpy5coRHBzMggULAD1tt2PHDgBiY2OpWbMmAHPmzEm/pmzZsly8eDFPcuLi4ihdujTly5fn1KlT/PzzzxmOz5s3L/21bdu2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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loglog(df,\"heatmap\")\n", - "plot_loglog(df2,\"scatter\",color=\"blue\")\n", - "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", - "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", - "plt.legend()\n", - "plt.axvline(x= 10000,linestyle=':',color=\"grey\")\n", - "plt.axvline(x= 4e3,linestyle=':',color=\"green\")\n", - "plt.title(\"Total Lux Display Cost (Airbnb)\")" - ] - }, - { - "cell_type": "code", - "execution_count": 151, - "metadata": {}, - "outputs": [], - "source": [ - "df = pd.read_csv(\"realestate_heatmap_unsampled.csv\")\n", - "df2 = pd.read_csv(\"realestate_scatter_unsampled.csv\")\n", - "df3 = pd.read_csv(\"realestate_heatmap_sampled.csv\")\n", - "df4 = pd.read_csv(\"realestate_scatter_sampled.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 155, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Total Lux Display Cost (Real Estate)')" - ] - }, - "execution_count": 155, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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Lo6IiAgWLlzIjBkzyMjIICEhgV27dtGiRQsA7r333pz1U089dYX8hIQErrrqqpztm2++meHDhzNo0CDuuusuANLT052GKY+KiqJu3boAXHvttfTq1QvQIdDXrFmTc96gQYPw8/Pj+uuvp1GjRjmtqWychTRft24dTzzxBKBjVmWXK5tatWpx9OhRatSo4fQ7LIsEWzjQv2awdbklSoL339fdS//+t25BGFzHtw1EZAHxvheH2rqX8hDcEHrEFPm2gYGBOZ/9/f1JTU0lKyuLqlWrss1BBqOxY8fy9NNP079/f2JiYpg8eXKBsv38/HLdx8/Pj4yMDA4cOMC0adPYvHkz1apVY/jw4aSlpeWcp5Ry+DmbChUqcO7cuZztjz/+mI0bN7J8+XIiIyPZunUr77//vtMw5Xl1stfXPg1q3nvn3RYnIc0LIi0tjQoVKhTqmrLA7t27ASyJR/X17q8BuKvJXW7LKm527NDRWfv1g9GjPa1N6aNs+yDCXwf/PG9W/sF6v8VUrlyZsLAwFi1aBOgKcPv27YDOOFevXj0A5syZk3NN3jDfrpCUlETFihWpUqUKx48fZ+XKlbmOL1iwIGfdvn37K65v0qRJLt/E/v37adu2La+++ipXXXUVhw8fdhqmvDAsWrSIrKws9u/fz19//XWFIXAW0rxz5845+bp/++03duzYkXONiHDs2DFLkuL4Ghs3bmTjxo2WyHpv43u8t9F7063Z55mPjISgIPjsM3DwPmQogLJtIMKGQpsZusWA0us2M/T+YiA6OprPPvuM8PBwmjZtmuN4nTx5MgMHDiQyMjJXash+/frxzTff5DipXSE8PJyWLVty4403ct9993HzzTfnOp6YmEiLFi149913mT59+hXXd+7cmV9//TWnYn722Wdp3rw5zZo1o0OHDoSHhzNmzBjmzJlDeHg4f/zxR5GSFDVo0IA2bdpw22238fHHH1+RLOmll14iPT2dFi1a0LRpU1566SVAO+CTk5Np0qQJL7/8MpGRkTnXbN26lXbt2lGunG83jIvCkCFDGDJkiCWylgxZwpIhSyyRZTXR0Tor3MGDOpxGRobOEPndd57WrHRiwn2XIUJDQ9myZUuB+YnHjRtHv379cvJcW83w4cPp27evpZO3QOvdv39/brnlliuOmeeibJBflkhb1lUDrof7LtstCINDJk6cyIUL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\n", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - }, - "output_type": "display_data" - } - ], - "source": [ - "plot_loglog(df,\"heatmap\")\n", - "plot_loglog(df2,\"scatter\",color=\"blue\")\n", - "plot_loglog(df3,\"heatmap (sampled)\",color=\"orange\")\n", - "plot_loglog(df4,\"scatter (sampled)\",color=\"cyan\")\n", - "plt.legend()\n", - "plt.axvline(x= 1e4,linestyle=':',color=\"grey\")\n", - "plt.axvline(x= 2e4,linestyle=':',color=\"green\")\n", - "plt.title(\"Total Lux Display Cost (Real Estate)\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Somewhere between 5000~20000 is the right point to switch from a sampled scatterplot to a heatmap" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - }, - "papermill": { - "duration": 1.512982, - "end_time": "2020-08-27T10:52:26.342965", - "environment_variables": {}, - "exception": null, - "input_path": "single_scatter.ipynb", - "output_path": "single_scatter_output.ipynb", - "parameters": {}, - "start_time": "2020-08-27T10:52:24.829983", - "version": "2.1.3" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "state": { - "4b235f47744442a1a0324dea3f4824c1": { - "model_module": "@jupyter-widgets/base", - "model_module_version": "1.2.0", - "model_name": "LayoutModel", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "e3a5d105e12a4fdcbd53cf0f0ed8bcbf": { - "model_module": "luxWidget", - "model_module_version": "^0.0.1", - "model_name": "ExampleModel", - "state": { - "_dom_classes": [], - "_exportedVisIdxs": {}, - "_model_module": "luxWidget", - "_model_module_version": "^0.0.1", - "_model_name": "ExampleModel", - "_view_count": null, - "_view_module": "luxWidget", - "_view_module_version": "^0.0.1", - "_view_name": "JupyterWidgetView", - "current_vis": { - "$schema": "https://vega.github.io/schema/vega-lite/v4.8.1.json", - "config": { - "axis": { - "labelColor": "#505050", - "labelFont": "Helvetica Neue", - "labelFontSize": 9, - "labelFontWeight": 400, - "titleFont": "Helvetica Neue", - "titleFontSize": 11, - "titleFontWeight": 500 - }, - "legend": { - "labelFont": "Helvetica Neue", - "labelFontSize": 9, - "labelFontWeight": 400, - "titleFont": "Helvetica Neue", - "titleFontSize": 10, - "titleFontWeight": 500 - }, - "mark": { - "tooltip": { - "content": "encoding" - } - }, - "title": { - "font": "Helvetica Neue", - "fontSize": 13, - "fontWeight": 500 - }, - "view": { - "continuousHeight": 300, - "continuousWidth": 400 - } - }, - "data": { - "name": "data-c378346e1f6b80d3c758310fddcd2636" - }, - "datasets": { - "data-c378346e1f6b80d3c758310fddcd2636": [ - { - "Acceleration": 12, - "Horsepower": 130 - }, - { - "Acceleration": 11.5, - "Horsepower": 165 - }, - { - "Acceleration": 11, - "Horsepower": 150 - }, - { - "Acceleration": 12, - "Horsepower": 150 - }, - { - "Acceleration": 10.5, - "Horsepower": 140 - }, - { - "Acceleration": 10, - "Horsepower": 198 - }, - { - "Acceleration": 9, - "Horsepower": 220 - }, - { - "Acceleration": 8.5, - "Horsepower": 215 - }, - { - "Acceleration": 10, - "Horsepower": 225 - }, - { - "Acceleration": 8.5, - "Horsepower": 190 - }, - { - "Acceleration": 10, - "Horsepower": 170 - }, - { - "Acceleration": 8, - "Horsepower": 160 - }, - { - "Acceleration": 9.5, - "Horsepower": 150 - }, - { - "Acceleration": 10, - "Horsepower": 225 - }, - { - "Acceleration": 15, - "Horsepower": 95 - }, - { - "Acceleration": 15.5, - "Horsepower": 95 - }, - { - "Acceleration": 15.5, - "Horsepower": 97 - }, - { - "Acceleration": 16, - "Horsepower": 85 - }, - { - "Acceleration": 14.5, - "Horsepower": 88 - }, - { - "Acceleration": 20.5, - "Horsepower": 46 - }, - { - "Acceleration": 17.5, - "Horsepower": 87 - }, - { - "Acceleration": 14.5, - "Horsepower": 90 - }, - { - "Acceleration": 17.5, - "Horsepower": 95 - }, - { - "Acceleration": 12.5, - "Horsepower": 113 - }, - { - "Acceleration": 15, - "Horsepower": 90 - }, - { - "Acceleration": 14, - "Horsepower": 215 - }, - { - "Acceleration": 15, - "Horsepower": 200 - }, - { - "Acceleration": 13.5, - "Horsepower": 210 - }, - { - "Acceleration": 18.5, - "Horsepower": 193 - }, - { - "Acceleration": 14.5, - "Horsepower": 88 - }, - { - "Acceleration": 15.5, - "Horsepower": 90 - }, - { - "Acceleration": 14, - "Horsepower": 95 - }, - { - "Acceleration": 13, - "Horsepower": 100 - }, - { - "Acceleration": 15.5, - "Horsepower": 105 - }, - { - "Acceleration": 15.5, - "Horsepower": 100 - }, - { - "Acceleration": 15.5, - "Horsepower": 88 - }, - { - "Acceleration": 15.5, - "Horsepower": 100 - }, - { - "Acceleration": 12, - "Horsepower": 165 - }, - { - "Acceleration": 11.5, - "Horsepower": 175 - }, - { - "Acceleration": 13.5, - "Horsepower": 153 - }, - { - "Acceleration": 13, - "Horsepower": 150 - }, - { - "Acceleration": 11.5, - "Horsepower": 180 - }, - { - "Acceleration": 12, - "Horsepower": 170 - }, - { - "Acceleration": 12, - "Horsepower": 175 - }, - { - "Acceleration": 13.5, - "Horsepower": 110 - }, - { - "Acceleration": 19, - "Horsepower": 72 - }, - { - "Acceleration": 15, - "Horsepower": 100 - }, - { - "Acceleration": 14.5, - "Horsepower": 88 - }, - { - "Acceleration": 14, - "Horsepower": 86 - }, - { - "Acceleration": 14, - "Horsepower": 90 - }, - { - "Acceleration": 19.5, - "Horsepower": 70 - }, - { - "Acceleration": 14.5, - "Horsepower": 76 - }, - { - "Acceleration": 19, - "Horsepower": 65 - }, - { - "Acceleration": 18, - "Horsepower": 69 - }, - { - "Acceleration": 19, - "Horsepower": 60 - }, - { - "Acceleration": 20.5, - "Horsepower": 70 - }, - { - "Acceleration": 15.5, - "Horsepower": 95 - }, - { - "Acceleration": 17, - "Horsepower": 80 - }, - { - "Acceleration": 23.5, - "Horsepower": 54 - }, - { - "Acceleration": 19.5, - "Horsepower": 90 - }, - { - "Acceleration": 16.5, - "Horsepower": 86 - }, - { - "Acceleration": 12, - "Horsepower": 165 - }, - { - "Acceleration": 12, - "Horsepower": 175 - }, - { - "Acceleration": 13.5, - "Horsepower": 150 - }, - { - "Acceleration": 13, - "Horsepower": 153 - }, - { - "Acceleration": 11.5, - "Horsepower": 150 - }, - { - "Acceleration": 11, - "Horsepower": 208 - }, - { - "Acceleration": 13.5, - "Horsepower": 155 - }, - { - "Acceleration": 13.5, - "Horsepower": 160 - }, - { - "Acceleration": 12.5, - "Horsepower": 190 - }, - { - "Acceleration": 13.5, - "Horsepower": 97 - }, - { - "Acceleration": 12.5, - "Horsepower": 150 - }, - { - "Acceleration": 14, - "Horsepower": 130 - }, - { - "Acceleration": 16, - "Horsepower": 140 - }, - { - "Acceleration": 14, - "Horsepower": 150 - }, - { - "Acceleration": 14.5, - "Horsepower": 112 - }, - { - "Acceleration": 18, - "Horsepower": 76 - }, - { - "Acceleration": 19.5, - "Horsepower": 87 - }, - { - "Acceleration": 18, - "Horsepower": 69 - }, - { - "Acceleration": 16, - "Horsepower": 86 - }, - { - "Acceleration": 17, - "Horsepower": 92 - }, - { - "Acceleration": 14.5, - "Horsepower": 97 - }, - { - "Acceleration": 15, - "Horsepower": 80 - }, - { - "Acceleration": 16.5, - "Horsepower": 88 - }, - { - "Acceleration": 13, - "Horsepower": 175 - }, - { - "Acceleration": 11.5, - "Horsepower": 150 - }, - { - "Acceleration": 13, - "Horsepower": 145 - }, - { - "Acceleration": 14.5, - "Horsepower": 137 - }, - { - "Acceleration": 12.5, - "Horsepower": 150 - }, - { - "Acceleration": 11.5, - "Horsepower": 198 - }, - { - "Acceleration": 12, - "Horsepower": 150 - }, - { - "Acceleration": 13, - "Horsepower": 158 - }, - { - "Acceleration": 14.5, - "Horsepower": 150 - }, - { - "Acceleration": 11, - "Horsepower": 215 - }, - { - "Acceleration": 11, - "Horsepower": 225 - }, - { - "Acceleration": 11, - "Horsepower": 175 - }, - { - "Acceleration": 16.5, - "Horsepower": 105 - }, - { - "Acceleration": 18, - "Horsepower": 100 - }, - { - "Acceleration": 16, - "Horsepower": 100 - }, - { - "Acceleration": 16.5, - "Horsepower": 88 - }, - { - "Acceleration": 16, - "Horsepower": 95 - }, - { - "Acceleration": 21, - "Horsepower": 46 - }, - { - "Acceleration": 14, - "Horsepower": 150 - }, - { - "Acceleration": 12.5, - "Horsepower": 167 - }, - { - "Acceleration": 13, - "Horsepower": 170 - }, - { - "Acceleration": 12.5, - "Horsepower": 180 - }, - { - "Acceleration": 15, - "Horsepower": 100 - }, - { - "Acceleration": 19, - "Horsepower": 88 - }, - { - "Acceleration": 19.5, - "Horsepower": 72 - }, - { - "Acceleration": 16.5, - "Horsepower": 94 - }, - { - "Acceleration": 13.5, - "Horsepower": 90 - }, - { - "Acceleration": 18.5, - "Horsepower": 85 - }, - { - "Acceleration": 14, - "Horsepower": 107 - }, - { - "Acceleration": 15.5, - "Horsepower": 90 - }, - { - "Acceleration": 13, - "Horsepower": 145 - }, - { - "Acceleration": 9.5, - "Horsepower": 230 - }, - { - "Acceleration": 19.5, - "Horsepower": 49 - }, - { - "Acceleration": 15.5, - "Horsepower": 75 - }, - { - "Acceleration": 14, - "Horsepower": 91 - }, - { - "Acceleration": 15.5, - "Horsepower": 112 - }, - { - "Acceleration": 11, - "Horsepower": 150 - }, - { - "Acceleration": 14, - "Horsepower": 110 - }, - { - "Acceleration": 13.5, - "Horsepower": 122 - }, - { - "Acceleration": 11, - "Horsepower": 180 - }, - { - "Acceleration": 16.5, - "Horsepower": 95 - }, - { - "Acceleration": 16, - "Horsepower": 100 - }, - { - "Acceleration": 17, - "Horsepower": 100 - }, - { - "Acceleration": 19, - "Horsepower": 67 - }, - { - "Acceleration": 16.5, - "Horsepower": 80 - }, - { - "Acceleration": 21, - "Horsepower": 65 - }, - { - "Acceleration": 17, - "Horsepower": 75 - }, - { - "Acceleration": 17, - "Horsepower": 100 - }, - { - "Acceleration": 18, - "Horsepower": 110 - }, - { - "Acceleration": 16.5, - "Horsepower": 105 - }, - { - "Acceleration": 14, - "Horsepower": 140 - }, - { - "Acceleration": 14.5, - "Horsepower": 150 - }, - { - "Acceleration": 13.5, - "Horsepower": 150 - }, - { - "Acceleration": 16, - "Horsepower": 140 - }, - { - "Acceleration": 15.5, - "Horsepower": 150 - }, - { - "Acceleration": 16.5, - "Horsepower": 83 - }, - { - "Acceleration": 15.5, - "Horsepower": 67 - }, - { - "Acceleration": 14.5, - "Horsepower": 78 - }, - { - "Acceleration": 16.5, - "Horsepower": 52 - }, - { - "Acceleration": 19, - "Horsepower": 61 - }, - { - "Acceleration": 14.5, - "Horsepower": 75 - }, - { - "Acceleration": 15.5, - "Horsepower": 75 - }, - { - "Acceleration": 14, - "Horsepower": 75 - }, - { - "Acceleration": 15, - "Horsepower": 97 - }, - { - "Acceleration": 15.5, - "Horsepower": 93 - }, - { - "Acceleration": 16, - "Horsepower": 67 - }, - { - "Acceleration": 16, - "Horsepower": 95 - }, - { - "Acceleration": 16, - "Horsepower": 105 - }, - { - "Acceleration": 21, - "Horsepower": 72 - }, - { - "Acceleration": 19.5, - "Horsepower": 72 - }, - { - "Acceleration": 11.5, - "Horsepower": 170 - }, - { - "Acceleration": 14, - "Horsepower": 145 - }, - { - "Acceleration": 14.5, - "Horsepower": 150 - }, - { - "Acceleration": 13.5, - "Horsepower": 148 - }, - { - "Acceleration": 21, - "Horsepower": 110 - }, - { - "Acceleration": 18.5, - "Horsepower": 105 - }, - { - "Acceleration": 19, - "Horsepower": 110 - }, - { - "Acceleration": 19, - "Horsepower": 95 - }, - { - "Acceleration": 15, - "Horsepower": 110 - }, - { - "Acceleration": 13.5, - "Horsepower": 110 - }, - { - "Acceleration": 12, - "Horsepower": 129 - }, - { - "Acceleration": 16, - "Horsepower": 75 - }, - { - "Acceleration": 17, - "Horsepower": 83 - }, - { - "Acceleration": 16, - "Horsepower": 100 - }, - { - "Acceleration": 18.5, - "Horsepower": 78 - }, - { - "Acceleration": 13.5, - "Horsepower": 96 - }, - { - "Acceleration": 16.5, - "Horsepower": 71 - }, - { - "Acceleration": 17, - "Horsepower": 97 - }, - { - "Acceleration": 14.5, - "Horsepower": 97 - }, - { - "Acceleration": 14, - "Horsepower": 70 - }, - { - "Acceleration": 17, - "Horsepower": 90 - }, - { - "Acceleration": 15, - "Horsepower": 95 - }, - { - "Acceleration": 17, - "Horsepower": 88 - }, - { - "Acceleration": 14.5, - "Horsepower": 98 - }, - { - "Acceleration": 13.5, - "Horsepower": 115 - }, - { - "Acceleration": 17.5, - "Horsepower": 53 - }, - { - "Acceleration": 15.5, - "Horsepower": 86 - }, - { - "Acceleration": 16.9, - "Horsepower": 81 - }, - { - "Acceleration": 14.9, - "Horsepower": 92 - }, - { - "Acceleration": 17.7, - "Horsepower": 79 - }, - { - "Acceleration": 15.3, - "Horsepower": 83 - }, - { - "Acceleration": 13, - "Horsepower": 140 - }, - { - "Acceleration": 13, - "Horsepower": 150 - }, - { - "Acceleration": 13.9, - "Horsepower": 120 - }, - { - "Acceleration": 12.8, - "Horsepower": 152 - }, - { - "Acceleration": 15.4, - "Horsepower": 100 - }, - { - "Acceleration": 14.5, - "Horsepower": 105 - }, - { - "Acceleration": 17.6, - "Horsepower": 81 - }, - { - "Acceleration": 17.6, - "Horsepower": 90 - }, - { - "Acceleration": 22.2, - "Horsepower": 52 - }, - { - "Acceleration": 22.1, - "Horsepower": 60 - }, - { - "Acceleration": 14.2, - "Horsepower": 70 - }, - { - "Acceleration": 17.4, - "Horsepower": 53 - }, - { - "Acceleration": 17.7, - "Horsepower": 100 - }, - { - "Acceleration": 21, - "Horsepower": 78 - }, - { - "Acceleration": 16.2, - "Horsepower": 110 - }, - { - "Acceleration": 17.8, - "Horsepower": 95 - }, - { - "Acceleration": 12.2, - "Horsepower": 71 - }, - { - "Acceleration": 17, - "Horsepower": 70 - }, - { - "Acceleration": 16.4, - "Horsepower": 75 - }, - { - "Acceleration": 13.6, - "Horsepower": 72 - }, - { - "Acceleration": 15.7, - "Horsepower": 102 - }, - { - "Acceleration": 13.2, - "Horsepower": 150 - }, - { - "Acceleration": 21.9, - "Horsepower": 88 - }, - { - "Acceleration": 15.5, - "Horsepower": 108 - }, - { - "Acceleration": 16.7, - "Horsepower": 120 - }, - { - "Acceleration": 12.1, - "Horsepower": 180 - }, - { - "Acceleration": 12, - "Horsepower": 145 - }, - { - "Acceleration": 15, - "Horsepower": 130 - }, - { - "Acceleration": 14, - "Horsepower": 150 - }, - { - "Acceleration": 18.5, - "Horsepower": 68 - }, - { - "Acceleration": 14.8, - "Horsepower": 80 - }, - { - "Acceleration": 18.6, - "Horsepower": 58 - }, - { - "Acceleration": 15.5, - "Horsepower": 96 - }, - { - "Acceleration": 16.8, - "Horsepower": 70 - }, - { - "Acceleration": 12.5, - "Horsepower": 145 - }, - { - "Acceleration": 19, - "Horsepower": 110 - }, - { - "Acceleration": 13.7, - "Horsepower": 145 - }, - { - "Acceleration": 14.9, - "Horsepower": 130 - }, - { - "Acceleration": 16.4, - "Horsepower": 110 - }, - { - "Acceleration": 16.9, - "Horsepower": 105 - }, - { - "Acceleration": 17.7, - "Horsepower": 100 - }, - { - "Acceleration": 19, - "Horsepower": 98 - }, - { - "Acceleration": 11.1, - "Horsepower": 180 - }, - { - "Acceleration": 11.4, - "Horsepower": 170 - }, - { - "Acceleration": 12.2, - "Horsepower": 190 - }, - { - "Acceleration": 14.5, - "Horsepower": 149 - }, - { - "Acceleration": 14.5, - "Horsepower": 78 - }, - { - "Acceleration": 16, - "Horsepower": 88 - }, - { - "Acceleration": 18.2, - "Horsepower": 75 - }, - { - "Acceleration": 15.8, - "Horsepower": 89 - }, - { - "Acceleration": 17, - "Horsepower": 63 - }, - { - "Acceleration": 15.9, - "Horsepower": 83 - }, - { - "Acceleration": 16.4, - "Horsepower": 67 - }, - { - "Acceleration": 14.1, - "Horsepower": 78 - }, - { - "Acceleration": 14.5, - "Horsepower": 97 - }, - { - "Acceleration": 12.8, - "Horsepower": 110 - }, - { - "Acceleration": 13.5, - "Horsepower": 110 - }, - { - "Acceleration": 21.5, - "Horsepower": 48 - }, - { - "Acceleration": 14.4, - "Horsepower": 66 - }, - { - "Acceleration": 19.4, - "Horsepower": 52 - }, - { - "Acceleration": 18.6, - "Horsepower": 70 - }, - { - "Acceleration": 16.4, - "Horsepower": 60 - }, - { - "Acceleration": 15.5, - "Horsepower": 110 - }, - { - "Acceleration": 13.2, - "Horsepower": 140 - }, - { - "Acceleration": 12.8, - "Horsepower": 139 - }, - { - "Acceleration": 19.2, - "Horsepower": 105 - }, - { - "Acceleration": 18.2, - "Horsepower": 95 - }, - { - "Acceleration": 15.8, - "Horsepower": 85 - }, - { - "Acceleration": 15.4, - "Horsepower": 88 - }, - { - "Acceleration": 17.2, - "Horsepower": 100 - }, - { - "Acceleration": 17.2, - "Horsepower": 90 - }, - { - "Acceleration": 15.8, - "Horsepower": 105 - }, - { - "Acceleration": 16.7, - "Horsepower": 85 - }, - { - "Acceleration": 18.7, - "Horsepower": 110 - }, - { - "Acceleration": 15.1, - "Horsepower": 120 - }, - { - "Acceleration": 13.2, - "Horsepower": 145 - }, - { - "Acceleration": 13.4, - "Horsepower": 165 - }, - { - "Acceleration": 11.2, - "Horsepower": 139 - }, - { - "Acceleration": 13.7, - "Horsepower": 140 - }, - { - "Acceleration": 16.5, - "Horsepower": 68 - }, - { - "Acceleration": 14.2, - "Horsepower": 95 - }, - { - "Acceleration": 14.7, - "Horsepower": 97 - }, - { - "Acceleration": 14.5, - "Horsepower": 75 - }, - { - "Acceleration": 14.8, - "Horsepower": 95 - }, - { - "Acceleration": 16.7, - "Horsepower": 105 - }, - { - "Acceleration": 17.6, - "Horsepower": 85 - }, - { - "Acceleration": 14.9, - "Horsepower": 97 - }, - { - "Acceleration": 15.9, - "Horsepower": 103 - }, - { - "Acceleration": 13.6, - "Horsepower": 125 - }, - { - "Acceleration": 15.7, - "Horsepower": 115 - }, - { - "Acceleration": 15.8, - "Horsepower": 133 - }, - { - "Acceleration": 14.9, - "Horsepower": 71 - }, - { - "Acceleration": 16.6, - "Horsepower": 68 - }, - { - "Acceleration": 15.4, - "Horsepower": 115 - }, - { - "Acceleration": 18.2, - "Horsepower": 85 - }, - { - "Acceleration": 17.3, - "Horsepower": 88 - }, - { - "Acceleration": 18.2, - "Horsepower": 90 - }, - { - "Acceleration": 16.6, - "Horsepower": 110 - }, - { - "Acceleration": 15.4, - "Horsepower": 130 - }, - { - "Acceleration": 13.4, - "Horsepower": 129 - }, - { - "Acceleration": 13.2, - "Horsepower": 138 - }, - { - "Acceleration": 15.2, - "Horsepower": 135 - }, - { - "Acceleration": 14.9, - "Horsepower": 155 - }, - { - "Acceleration": 14.3, - "Horsepower": 142 - }, - { - "Acceleration": 15, - "Horsepower": 125 - }, - { - "Acceleration": 13, - "Horsepower": 150 - }, - { - "Acceleration": 14, - "Horsepower": 71 - }, - { - "Acceleration": 15.2, - "Horsepower": 65 - }, - { - "Acceleration": 14.4, - "Horsepower": 80 - }, - { - "Acceleration": 15, - "Horsepower": 80 - }, - { - "Acceleration": 20.1, - "Horsepower": 77 - }, - { - "Acceleration": 17.4, - "Horsepower": 125 - }, - { - "Acceleration": 24.8, - "Horsepower": 71 - }, - { - "Acceleration": 22.2, - "Horsepower": 90 - }, - { - "Acceleration": 13.2, - "Horsepower": 70 - }, - { - "Acceleration": 14.9, - "Horsepower": 70 - }, - { - "Acceleration": 19.2, - "Horsepower": 65 - }, - { - "Acceleration": 14.7, - "Horsepower": 69 - }, - { - "Acceleration": 16, - "Horsepower": 90 - }, - { - "Acceleration": 11.3, - "Horsepower": 115 - }, - { - "Acceleration": 12.9, - "Horsepower": 115 - }, - { - "Acceleration": 13.2, - "Horsepower": 90 - }, - { - "Acceleration": 14.7, - "Horsepower": 76 - }, - { - "Acceleration": 18.8, - "Horsepower": 60 - }, - { - "Acceleration": 15.5, - "Horsepower": 70 - }, - { - "Acceleration": 16.4, - "Horsepower": 65 - }, - { - "Acceleration": 16.5, - "Horsepower": 90 - }, - { - "Acceleration": 18.1, - "Horsepower": 88 - }, - { - "Acceleration": 20.1, - "Horsepower": 90 - }, - { - "Acceleration": 18.7, - "Horsepower": 90 - }, - { - "Acceleration": 15.8, - "Horsepower": 78 - }, - { - "Acceleration": 15.5, - "Horsepower": 90 - }, - { - "Acceleration": 17.5, - "Horsepower": 75 - }, - { - "Acceleration": 15, - "Horsepower": 92 - }, - { - "Acceleration": 15.2, - "Horsepower": 75 - }, - { - "Acceleration": 17.9, - "Horsepower": 65 - }, - { - "Acceleration": 14.4, - "Horsepower": 105 - }, - { - "Acceleration": 19.2, - "Horsepower": 65 - }, - { - "Acceleration": 21.7, - "Horsepower": 48 - }, - { - "Acceleration": 23.7, - "Horsepower": 48 - }, - { - "Acceleration": 19.9, - "Horsepower": 67 - }, - { - "Acceleration": 21.8, - "Horsepower": 67 - }, - { - "Acceleration": 13.8, - "Horsepower": 67 - }, - { - "Acceleration": 18, - "Horsepower": 67 - }, - { - "Acceleration": 15.3, - "Horsepower": 62 - }, - { - "Acceleration": 11.4, - "Horsepower": 132 - }, - { - "Acceleration": 12.5, - "Horsepower": 100 - }, - { - "Acceleration": 15.1, - "Horsepower": 88 - }, - { - "Acceleration": 17, - "Horsepower": 72 - }, - { - "Acceleration": 15.7, - "Horsepower": 84 - }, - { - "Acceleration": 16.4, - "Horsepower": 84 - }, - { - "Acceleration": 14.4, - "Horsepower": 92 - }, - { - "Acceleration": 12.6, - "Horsepower": 110 - }, - { - "Acceleration": 12.9, - "Horsepower": 84 - }, - { - "Acceleration": 16.9, - "Horsepower": 58 - }, - { - "Acceleration": 16.4, - "Horsepower": 64 - }, - { - "Acceleration": 16.1, - "Horsepower": 60 - }, - { - "Acceleration": 17.8, - "Horsepower": 67 - }, - { - "Acceleration": 19.4, - "Horsepower": 65 - }, - { - "Acceleration": 17.3, - "Horsepower": 62 - }, - { - "Acceleration": 16, - "Horsepower": 68 - }, - { - "Acceleration": 14.9, - "Horsepower": 63 - }, - { - "Acceleration": 16.2, - "Horsepower": 65 - }, - { - "Acceleration": 20.7, - "Horsepower": 65 - }, - { - "Acceleration": 14.2, - "Horsepower": 74 - }, - { - "Acceleration": 14.4, - "Horsepower": 75 - }, - { - "Acceleration": 16.8, - "Horsepower": 75 - }, - { - "Acceleration": 14.8, - "Horsepower": 100 - }, - { - "Acceleration": 18.3, - "Horsepower": 74 - }, - { - "Acceleration": 20.4, - "Horsepower": 80 - }, - { - "Acceleration": 19.6, - "Horsepower": 76 - }, - { - "Acceleration": 12.6, - "Horsepower": 116 - }, - { - "Acceleration": 13.8, - "Horsepower": 120 - }, - { - "Acceleration": 15.8, - "Horsepower": 110 - }, - { - "Acceleration": 19, - "Horsepower": 105 - }, - { - "Acceleration": 17.1, - "Horsepower": 88 - }, - { - "Acceleration": 16.6, - "Horsepower": 85 - }, - { - "Acceleration": 19.6, - "Horsepower": 88 - }, - { - "Acceleration": 18.6, - "Horsepower": 88 - }, - { - "Acceleration": 18, - "Horsepower": 88 - }, - { - "Acceleration": 16.2, - "Horsepower": 85 - }, - { - "Acceleration": 16, - "Horsepower": 84 - }, - { - "Acceleration": 18, - "Horsepower": 90 - }, - { - "Acceleration": 16.4, - "Horsepower": 92 - }, - { - "Acceleration": 15.3, - "Horsepower": 74 - }, - { - "Acceleration": 18.2, - "Horsepower": 68 - }, - { - "Acceleration": 17.6, - "Horsepower": 68 - }, - { - "Acceleration": 14.7, - "Horsepower": 63 - }, - { - "Acceleration": 17.3, - "Horsepower": 70 - }, - { - "Acceleration": 14.5, - "Horsepower": 88 - }, - { - "Acceleration": 14.5, - "Horsepower": 75 - }, - { - "Acceleration": 16.9, - "Horsepower": 70 - }, - { - "Acceleration": 15, - "Horsepower": 67 - }, - { - "Acceleration": 15.7, - "Horsepower": 67 - }, - { - "Acceleration": 16.2, - "Horsepower": 67 - }, - { - "Acceleration": 16.4, - "Horsepower": 110 - }, - { - "Acceleration": 17, - "Horsepower": 85 - }, - { - "Acceleration": 14.5, - "Horsepower": 92 - }, - { - "Acceleration": 14.7, - "Horsepower": 112 - }, - { - "Acceleration": 13.9, - "Horsepower": 96 - }, - { - "Acceleration": 13, - "Horsepower": 84 - }, - { - "Acceleration": 17.3, - "Horsepower": 90 - }, - { - "Acceleration": 15.6, - "Horsepower": 86 - }, - { - "Acceleration": 24.6, - "Horsepower": 52 - }, - { - "Acceleration": 11.6, - "Horsepower": 84 - }, - { - "Acceleration": 18.6, - "Horsepower": 79 - }, - { - "Acceleration": 19.4, - "Horsepower": 82 - } - ] - }, - "encoding": { - "x": { - "field": "Horsepower", - "scale": { - "domain": [ - 46, - 230 - ] - }, - "type": "quantitative" - }, - "y": { - "field": "Acceleration", - "scale": { - "domain": [ - 8, - 24.8 - ] - }, - "type": "quantitative" - } - }, - "height": 150, - "mark": "circle", - "selection": { - "selector001": { - "bind": "scales", - "encodings": [ - "x", - "y" - ], - "type": "interval" - } - }, - "width": 160 - }, - "data": [], - "intent": "", - "layout": "IPY_MODEL_4b235f47744442a1a0324dea3f4824c1", - "recommendations": [] - } - } - }, - "version_major": 2, - "version_minor": 0 - } - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/scatter_benchmark.py b/experiments/scatter_benchmark.py deleted file mode 100644 index 51527f56..00000000 --- a/experiments/scatter_benchmark.py +++ /dev/null @@ -1,41 +0,0 @@ -import papermill as pm -import pandas as pd -import numpy as np -import json - -# experiment_name = "sampled_scatter" -# ["sampled_scatter","basic_scatter","heatmap","manual_heatmap","manual_heatmap_2x_coarse"] -for experiment_name in ["sampled_scatter_20000"]: -# for experiment_name in ["manual_binned_scatter"]: - # trial_range = np.geomspace(10, 1e5, num=9) - # trial_range = np.geomspace(10, 1e5, num=9) - trial_range = np.geomspace(10, 1e5, num=17) - trial = [] #[cell count, duration] - for nPts in trial_range: - # output_filename = f"uncolored_single_scatter_output_{nPts}.ipynb" - output_filename = "output.ipynb" - # papermill basic_scatter.ipynb output.ipynb -p numPoints 1000000 --execute-timeout 1000 - pm.execute_notebook( - f'{experiment_name}.ipynb', - output_filename, - parameters = dict(numPoints=nPts) - ) - count = 0 - with open(output_filename) as json_file: - data = json.load(json_file) - for cell in data['cells']: - # For testing out Lux Performance - # if "outputs" in cell and len(cell["outputs"]) > 0: - # if cell["outputs"][0]["output_type"] == "display_data": - # count += 1 - # For testing Pandas Performance - if cell["execution_count"]==5: - duration1 = cell["metadata"]["papermill"]["duration"] - # For testing Altair Output Performance - if cell["execution_count"]==6: - duration2 = cell["metadata"]["papermill"]["duration"] - trial.append([nPts,duration1,duration2]) - print (nPts,duration1,duration2) - - trial_df = pd.DataFrame(trial,columns=["nPts","pandas cost","altair cost"]) - trial_df.to_csv(f"{experiment_name}.csv",index=None) diff --git a/experiments/uncolored_single_scatter.ipynb b/experiments/uncolored_single_scatter.ipynb deleted file mode 100644 index fe0365c7..00000000 --- a/experiments/uncolored_single_scatter.ipynb +++ /dev/null @@ -1,101 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [ - "parameters" - ] - }, - "outputs": [], - "source": [ - "numPoints=100" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print (numPoints)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import lux\n", - "from utils import generate_scatter_data" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df = generate_scatter_data(numPoints)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "df.maintain_metadata()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from lux.vis.Vis import Vis" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Vis([\"x\",\"y\"],df)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "celltoolbar": "Tags", - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.7.7" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/experiments/utils.py b/experiments/utils.py deleted file mode 100644 index fa72f077..00000000 --- a/experiments/utils.py +++ /dev/null @@ -1,40 +0,0 @@ -import pandas as pd -import numpy as np -def generate_scatter_data(numPoints): - # Example from https://datashader.org/user_guide/Points.html - from collections import OrderedDict as odict - numPoints = int(numPoints/5) - np.random.seed(1) - - dists = {cat: pd.DataFrame(odict([('x',np.random.normal(x,s,numPoints)), - ('y',np.random.normal(y,s,numPoints)), - ('val',val), - ('cat',cat)])) - for x, y, s, val, cat in - [( 2, 2, 0.03, 10, "d1"), - ( 2, -2, 0.10, 20, "d2"), - ( -2, -2, 0.50, 30, "d3"), - ( -2, 2, 1.00, 40, "d4"), - ( 0, 0, 3.00, 50, "d5")] } - - df = pd.concat(dists,ignore_index=True) - return df - -def generate_airbnb_copies(ncopies): - df = pd.read_csv("https://github.com/lux-org/lux-datasets/blob/master/data/airbnb_nyc.csv?raw=True") - df = df[['id', 'name', 'host_id', 'host_name', 'neighbourhood_group', - 'neighbourhood', 'latitude', 'longitude', 'room_type', 'price', - 'minimum_nights', 'number_of_reviews']] - df_copies = pd.concat([df for _x in range(ncopies)]) - return df_copies -def downsample_airbnb(numPoints): - df = pd.read_csv("experiments/airbnb_10x.csv") - df = df[['id', 'name', 'host_id', 'host_name', 'neighbourhood_group', - 'neighbourhood', 'latitude', 'longitude', 'room_type', 'price', - 'minimum_nights', 'number_of_reviews']] - df_sampled = df.sample(n=int(numPoints)) - return df_sampled -def downsample_realestate(numPoints): - df = pd.read_csv("experiments/real_estate_3x.csv") - df_sampled = df.sample(n=int(numPoints)) - return df_sampled \ No newline at end of file From 3de5bb757ccafb945c4f12941ca119dfd70d7c99 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 25 Sep 2020 18:34:40 +0800 Subject: [PATCH 11/18] modified performance param --- tests/test_performance.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_performance.py b/tests/test_performance.py index 8e992ac4..4754a3b7 100644 --- a/tests/test_performance.py +++ b/tests/test_performance.py @@ -17,5 +17,5 @@ def test_q1_performance_census(): delta2 = toc2 - toc print(f"1st display Performance: {delta:0.4f} seconds") print(f"2nd display Performance: {delta2:0.4f} seconds") - assert delta < 4.0, "The recommendations on Census dataset took a total of {delta:0.4f} seconds, longer than expected." + assert delta < 4.3, "The recommendations on Census dataset took a total of {delta:0.4f} seconds, longer than expected." assert delta2 < 0.1 Date: Fri, 16 Oct 2020 22:10:04 +0800 Subject: [PATCH 12/18] enforce lux-widget minimum version --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 4d36a7f1..376796fa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ pytest-cov>=2.8.1 scikit-learn>=0.22 Sphinx>=3.0.2 sphinx-rtd-theme>=0.4.3 -lux-widget +lux-widget>=1.0.0 # Install only to use SQLExecutor # psycopg2>=2.8.5 # psycopg2-binary>=2.8.5 From 33bc23ae5fdd1ec273fad1b8c725f32d6e43471a Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 16 Oct 2020 22:13:45 +0800 Subject: [PATCH 13/18] update requirement.txt --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 376796fa..90eb78f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,7 +8,7 @@ pytest-cov>=2.8.1 scikit-learn>=0.22 Sphinx>=3.0.2 sphinx-rtd-theme>=0.4.3 -lux-widget>=1.0.0 +lux-widget>=0.1.0 # Install only to use SQLExecutor # psycopg2>=2.8.5 # psycopg2-binary>=2.8.5 From 593e03ebade9c737e91e24e0794b0d73ed6363ef Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Sun, 25 Oct 2020 16:12:57 +0800 Subject: [PATCH 14/18] testing out modin (Recursion error) --- lux/executor/PandasExecutor.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 6924886d..10aaadd0 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -12,7 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pandas as pd +# import pandas as pd +import modin.pandas as pd from lux.vis.VisList import VisList from lux.vis.Vis import Vis from lux.core.frame import LuxDataFrame @@ -319,15 +320,15 @@ def compute_dataset_metadata(self, ldf:LuxDataFrame): def compute_data_type(self, ldf:LuxDataFrame): for attr in list(ldf.columns): temporal_var_list = ["month", "year","day","date","time"] - if (isinstance(attr,pd._libs.tslibs.timestamps.Timestamp)): + if 'datetime' in str(ldf.dtypes[attr]): # If timestamp, make the dictionary keys the _repr_ (e.g., TimeStamp('2020-04-05 00.000')--> '2020-04-05') ldf.data_type_lookup[attr] = "temporal" # elif any(var in str(attr).lower() for var in temporal_var_list): elif str(attr).lower() in temporal_var_list: ldf.data_type_lookup[attr] = "temporal" - elif pd.api.types.is_float_dtype(ldf.dtypes[attr]): + elif 'float' in str(ldf.dtypes[attr]): ldf.data_type_lookup[attr] = "quantitative" - elif pd.api.types.is_integer_dtype(ldf.dtypes[attr]): + elif 'int' in str(ldf.dtypes[attr]): # See if integer value is quantitative or nominal by checking if the ratio of cardinality/data size is less than 0.4 and if there are less than 10 unique values if (ldf.pre_aggregated): if (ldf.cardinality[attr]==len(ldf)): @@ -339,7 +340,7 @@ def compute_data_type(self, ldf:LuxDataFrame): if check_if_id_like(ldf,attr): ldf.data_type_lookup[attr] = "id" # Eliminate this clause because a single NaN value can cause the dtype to be object - elif pd.api.types.is_string_dtype(ldf.dtypes[attr]): + elif 'object' in str(ldf.dtypes[attr]): if check_if_id_like(ldf,attr): ldf.data_type_lookup[attr] = "id" else: @@ -391,7 +392,8 @@ def compute_stats(self, ldf:LuxDataFrame): for attribute in ldf.columns: - if (isinstance(attribute,pd._libs.tslibs.timestamps.Timestamp)): + # if (pd.core.dtypes.common.is_datetime_or_timedelta_dtype(attribute)): + if 'datetime' in str(ldf.dtypes[attribute]): # If timestamp, make the dictionary keys the _repr_ (e.g., TimeStamp('2020-04-05 00.000')--> '2020-04-05') attribute_repr = str(attribute._date_repr) else: From 3ec1193ec52589b7af9474a5ea696afe8ebb50d4 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Fri, 6 Nov 2020 11:10:55 +0800 Subject: [PATCH 15/18] create modin executor, all else in sync with master changes --- lux/executor/PandasExecutor.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index f330ae92..64fa2e54 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -12,8 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# import pandas as pd -import modin.pandas as pd +import pandas as pd from lux.vis.VisList import VisList from lux.vis.Vis import Vis from lux.core.frame import LuxDataFrame @@ -402,7 +401,7 @@ def compute_data_type(self, ldf: LuxDataFrame): # elif any(var in str(attr).lower() for var in temporal_var_list): elif str(attr).lower() in temporal_var_list: ldf.data_type_lookup[attr] = "temporal" - elif 'float' in str(ldf.dtypes[attr]): + elif pd.api.types.is_float_dtype(ldf.dtypes[attr]): ldf.data_type_lookup[attr] = "quantitative" elif pd.api.types.is_integer_dtype(ldf.dtypes[attr]): # See if integer value is quantitative or nominal by checking if the ratio of cardinality/data size is less than 0.4 and if there are less than 10 unique values From b6a7dd687c248e3c5779a5861d05ea1843f334dd Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Wed, 11 Nov 2020 14:21:58 +0800 Subject: [PATCH 16/18] rewrote .loc with column reference, speed up by 100x --- lux/executor/PandasExecutor.py | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 64fa2e54..768bbe02 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -332,15 +332,11 @@ def apply_filter( def execute_2D_binning(vis: Vis): pd.reset_option("mode.chained_assignment") with pd.option_context("mode.chained_assignment", None): - x_attr = vis.get_attr_by_channel("x")[0] - y_attr = vis.get_attr_by_channel("y")[0] + x_attr = vis.get_attr_by_channel("x")[0].attribute + y_attr = vis.get_attr_by_channel("y")[0].attribute - vis._vis_data.loc[:, "xBin"] = pd.cut( - vis._vis_data[x_attr.attribute], bins=40 - ) - vis._vis_data.loc[:, "yBin"] = pd.cut( - vis._vis_data[y_attr.attribute], bins=40 - ) + vis._vis_data["xBin"] = pd.cut(vis._vis_data[x_attr], bins=40) + vis._vis_data["yBin"] = pd.cut(vis._vis_data[y_attr], bins=40) color_attr = vis.get_attr_by_channel("color") if len(color_attr) > 0: @@ -361,23 +357,19 @@ def execute_2D_binning(vis: Vis): ).reset_index() result = result.dropna() else: - groups = vis._vis_data.groupby(["xBin", "yBin"])[x_attr.attribute] + groups = vis._vis_data.groupby(["xBin", "yBin"])[x_attr] result = groups.agg("count").reset_index( - name=x_attr.attribute + name=x_attr ) # .agg in this line throws SettingWithCopyWarning - result = result.rename(columns={x_attr.attribute: "count"}) + result = result.rename(columns={x_attr: "count"}) result = result[result["count"] != 0] # convert type to facilitate weighted correlation interestingess calculation - result.loc[:, "xBinStart"] = ( - result["xBin"].apply(lambda x: x.left).astype("float") - ) - result.loc[:, "xBinEnd"] = result["xBin"].apply(lambda x: x.right) + result["xBinStart"] = result["xBin"].apply(lambda x: x.left).astype("float") + result["xBinEnd"] = result["xBin"].apply(lambda x: x.right) - result.loc[:, "yBinStart"] = ( - result["yBin"].apply(lambda x: x.left).astype("float") - ) - result.loc[:, "yBinEnd"] = result["yBin"].apply(lambda x: x.right) + result["yBinStart"] = result["yBin"].apply(lambda x: x.left).astype("float") + result["yBinEnd"] = result["yBin"].apply(lambda x: x.right) vis._vis_data = result.drop(columns=["xBin", "yBin"]) From 08d167ea15cf1f027a8b94366f099330dfcfe454 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Wed, 11 Nov 2020 14:32:52 +0800 Subject: [PATCH 17/18] replace agg("count") with .count() --> ~0.1ms speedup --- lux/executor/PandasExecutor.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 768bbe02..30af5e0f 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -358,9 +358,7 @@ def execute_2D_binning(vis: Vis): result = result.dropna() else: groups = vis._vis_data.groupby(["xBin", "yBin"])[x_attr] - result = groups.agg("count").reset_index( - name=x_attr - ) # .agg in this line throws SettingWithCopyWarning + result = groups.count().reset_index(name=x_attr) result = result.rename(columns={x_attr: "count"}) result = result[result["count"] != 0] From 665be022074c54dbb250f559aa5d3ab354c82d83 Mon Sep 17 00:00:00 2001 From: Doris Lee Date: Wed, 11 Nov 2020 14:38:11 +0800 Subject: [PATCH 18/18] run black --- lux/executor/PandasExecutor.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lux/executor/PandasExecutor.py b/lux/executor/PandasExecutor.py index 30af5e0f..f396c86b 100644 --- a/lux/executor/PandasExecutor.py +++ b/lux/executor/PandasExecutor.py @@ -358,7 +358,7 @@ def execute_2D_binning(vis: Vis): result = result.dropna() else: groups = vis._vis_data.groupby(["xBin", "yBin"])[x_attr] - result = groups.count().reset_index(name=x_attr) + result = groups.count().reset_index(name=x_attr) result = result.rename(columns={x_attr: "count"}) result = result[result["count"] != 0]