From 4910d103f2485d6bc3981155390ddd5e048e2224 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:56:51 +1100 Subject: [PATCH 1/7] Update .gitignore for images in notebook directory --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5f368cf..f1de8c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # Jupyter NB Checkpoints .ipynb_checkpoints/ +/notebooks/*.png + # exclude data from source control by default /data/ From 174ddce102ae560f13b189251bc207dd3f5aed56 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:58:39 +1100 Subject: [PATCH 2/7] Update Makefile --- Makefile | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index b6f17fd..74643fe 100644 --- a/Makefile +++ b/Makefile @@ -11,20 +11,25 @@ CURRENT_DIR = $(shell pwd) ############################### # Create python virtual environment -. PHONY: venv_init - +.PHONY: venv-init venv-init: ##@environment Setup virtual environment - conda env create -f environment.yml --prefix=.venv python=3.7 + conda env create -f environment.yml --prefix=.venv python=3.6 +.PHONY: venv-activate venv-activate: ##@environment Activates the virtual environment activate $(CURRENT_DIR)/.venv +.PHONY: venv-update venv-update: ##@environment Updates to latest packages conda update ipykernel && conda update --prefix .venv --all +.PHONY: venv-requirements-install venv-requirements-install: ##@environment Ensures environment.yml packages are installed conda env update +# The environment.yml file should really be created by hand, but +# this provides a good starting point. +.PHONY: venv-requirements-export venv-requirements-export: ##@environment Exports current environment to environment.yml conda env export --file environment.yml @@ -125,6 +130,17 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --slope "mean" \ --output-file "./data/interim/twl_mean_slope_sto06.csv" +./data/interim/twl_poststorm_mean_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features.csv + activate ./.venv && python ./src/cli.py create-twl-forecast \ + --waves-csv "./data/interim/waves.csv" \ + --tides-csv "./data/interim/tides.csv" \ + --profiles-csv "./data/interim/profiles.csv" \ + --profile-features-csv "./data/interim/profile_features.csv" \ + --runup-function "sto06" \ + --slope "mean" \ + --profile-type "poststorm" \ + --output-file "./data/interim/twl_poststorm_mean_slope_sto06.csv" + ./data/interim/impacts_observed.csv: ./data/interim/profiles.csv ./data/interim/profile_features.csv activate ./.venv && python ./src/cli.py create-observed-impacts \ --profiles-csv "./data/interim/profiles.csv" \ @@ -143,6 +159,12 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --forecasted-twl-csv "./data/interim/twl_foreshore_slope_sto06.csv" \ --output-file "./data/interim/impacts_forecasted_foreshore_slope_sto06.csv" +./data/interim/impacts_forecasted_poststorm_mean_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_foreshore_slope_sto06.csv + activate ./.venv && python ./src/cli.py create-forecasted-impacts \ + --profile-features-csv "./data/interim/profile_features.csv" \ + --forecasted-twl-csv "./data/interim/twl_poststorm_mean_slope_sto06.csv" \ + --output-file "./data/interim/impacts_forecasted_poststorm_mean_slope_sto06.csv" + ############################### # Misc commands From 494c8d9052a9c6cc791c4e6e00d54dafc237d01e Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:58:52 +1100 Subject: [PATCH 3/7] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b1ee642..3676c71 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,7 @@ been corrected for systematic errors, so actual elevations should be taken from - [ ] Estimate max TWL from elevation where pre storm and post storm profiles are the same. Need to think more about this as runup impacting dune toe will move the dune face back, incorrectly raising the observed twl. Perhaps this estimation of max TWL is only useful for the swash regime. - [ ] Implement [bayesian change detection algorithm](https://github.com/hildensia/bayesian_changepoint_detection) to help detect dune crests and toes from profiles. Probably low priority at the moment since we are doing manual detection. - [ ] Implement dune impact calculations as per Palmsten & Holman. Calculation should be done in a new dataframe. -- [ ] Implement data/interim/*.csv file checking using py.test. Check for correct columns, number of nans etc. Testing of code is probably a lower priority than just checking the interim data files at the moment. +- [ ] Implement data/interim/*.csv file checking using py.test. Check for correct columns, number of nans etc. Testing of code is probably a lower priority than just checking the interim data files at the moment. Some functions which should be tested are the slope functions in `forecast_twl.py`, as these can be tricky with different profiles. - [ ] Investigate using [modin](https://github.com/modin-project/modin) to help speed up analysis. -- [ ] Need to think about how relative imports are handled, see [here](https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html). Maybe the click CLI interface should be moved to the `./src/` folder and it can import all the other packages? -- [ ] Simplify runup_models in Stockdon06 - we should really only have one function for each runup model. Need to make it work with individual values or entire dataframe. Use [np.maskedarray](https://docs.scipy.org/doc/numpy-1.15.0/reference/maskedarray.generic.html) \ No newline at end of file +- [X] Need to think about how relative imports are handled, see [here](https://chrisyeh96.github.io/2017/08/08/definitive-guide-python-imports.html). Maybe the click CLI interface should be moved to the `./src/` folder and it can import all the other packages? +- [ ] Simplify runup_models in Stockdon06 - we should really only have one function for each runup model. Need to make it work with individual values or entire dataframe. Use [np.maskedarray](https://docs.scipy.org/doc/numpy-1.15.0/reference/maskedarray.generic.html) From dcadf0bf12a94efefc6f0ce9d430259dee641fc7 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:59:09 +1100 Subject: [PATCH 4/7] Add jupyter packages to environment.yml --- environment.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/environment.yml b/environment.yml index 0c8db70..340d23e 100644 --- a/environment.yml +++ b/environment.yml @@ -1,5 +1,6 @@ name: C:\Users\z5189959\Desktop\nsw-2016-storm-impact\.venv channels: + - plotly - defaults - conda-forge dependencies: @@ -49,6 +50,7 @@ dependencies: - ipykernel=5.1.0=py36h39e3cac_0 - ipython=7.2.0=py36h39e3cac_0 - ipython_genutils=0.2.0=py36h3c5d0ee_0 + - ipywidgets=7.4.2=py36_0 - jedi=0.13.1=py36_0 - jinja2=2.10=py36_0 - jpeg=9b=hb83a4c4_2 @@ -103,6 +105,7 @@ dependencies: - proj4=4.9.3=hcf24537_7 - prometheus_client=0.4.2=py36_0 - prompt_toolkit=2.0.7=py36_0 + - psutil=5.4.8=py36he774522_0 - py-boost=1.67.0=py36h8300f20_4 - pycodestyle=2.4.0=py36_0 - pycparser=2.19=py36_0 @@ -121,6 +124,7 @@ dependencies: - qt=5.9.6=vc14h1e9a669_2 - requests=2.20.1=py36_0 - retrying=1.3.3=py36_2 + - scikit-learn=0.20.1=py36hb854c30_0 - scipy=1.1.0=py36h4f6bf74_1 - send2trash=1.5.0=py36_0 - setuptools=40.6.2=py36_0 @@ -140,14 +144,18 @@ dependencies: - wcwidth=0.1.7=py36h3d5aa90_0 - webencodings=0.5.1=py36_1 - wheel=0.32.3=py36_0 + - widgetsnbextension=3.4.2=py36_0 - win_inet_pton=1.0.1=py36_1 - wincertstore=0.2=py36h7fe50ca_0 - winpty=0.4.3=4 - xerces-c=3.2.2=ha925a31_0 - xz=5.2.4=h2fa13f4_4 - yaml=0.1.7=hc54c509_2 + - yapf=0.25.0=py36_0 - zeromq=4.2.5=he025d50_1 - zlib=1.2.11=h62dcd97_3 + - plotly-orca=1.1.1=1 - pip: + - blackcellmagic==0.0.1 - mat4py==0.4.1 prefix: C:\Users\z5189959\Desktop\nsw-2016-storm-impact\.venv From e3b782abbd1723a7cb774a6ffa849cef7539ed23 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:59:21 +1100 Subject: [PATCH 5/7] Update notebooks --- notebooks/01_exploration.ipynb | 741 ++++------------ .../02_collision_protection_volume.ipynb | 798 ++++-------------- notebooks/03_dune_to_vs_runup.ipynb | 762 +++++++++++------ notebooks/04_profile_picker.ipynb | 743 ++++++++++++++++ 4 files changed, 1584 insertions(+), 1460 deletions(-) create mode 100644 notebooks/04_profile_picker.ipynb diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 1e5fc2e..07a9649 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -13,8 +13,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:14:51.434299Z", - "start_time": "2018-12-03T02:14:51.048281Z" + "end_time": "2018-12-03T23:02:22.927101Z", + "start_time": "2018-12-03T23:02:22.612233Z" } }, "outputs": [], @@ -32,8 +32,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:14:56.153167Z", - "start_time": "2018-12-03T02:14:51.435303Z" + "end_time": "2018-12-03T23:02:24.527369Z", + "start_time": "2018-12-03T23:02:22.929088Z" }, "scrolled": true }, @@ -60,9 +60,7 @@ "from ipywidgets import widgets, Output\n", "from IPython.display import display, clear_output, Image, HTML\n", "\n", - "from sklearn.metrics import confusion_matrix\n", - "\n", - "import ruptures as rpt" + "from sklearn.metrics import confusion_matrix" ] }, { @@ -77,8 +75,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:15:19.403132Z", - "start_time": "2018-12-03T02:14:56.154127Z" + "end_time": "2018-12-03T23:02:39.868010Z", + "start_time": "2018-12-03T23:02:24.529339Z" }, "pixiedust": { "displayParams": {} @@ -99,7 +97,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", + "C:\\Users\\z5189959\\Desktop\\nsw-2016-storm-impact\\.venv\\lib\\site-packages\\numpy\\lib\\arraysetops.py:522: FutureWarning:\n", "\n", "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", "\n" @@ -173,11 +171,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:42:30.072305Z", - "start_time": "2018-12-03T02:42:26.548191Z" + "end_time": "2018-12-05T03:57:14.533063Z", + "start_time": "2018-12-05T03:57:13.745017Z" }, "code_folding": [ 408 @@ -189,218 +187,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4db27acde589487c8982ac9319257ae0", + "model_id": "eae0e9440a5f45599b2c9b43352d3d13", "version_major": 2, "version_minor": 0 }, - "text/html": [ - "

Failed to display Jupyter Widget of type VBox.

\n", - "

\n", - " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", - " that the widgets JavaScript is still loading. If this message persists, it\n", - " likely means that the widgets JavaScript library is either not installed or\n", - " not enabled. See the Jupyter\n", - " Widgets Documentation for setup instructions.\n", - "

\n", - "

\n", - " If you're reading this message in another frontend (for example, a static\n", - " rendering on GitHub or NBViewer),\n", - " it may mean that your frontend doesn't currently support widgets.\n", - "

\n" - ], "text/plain": [ - "VBox(children=(VBox(children=(HTML(value='Filter by observed and predicted impacts:'), HBox(children=(VBox(children=(HTML(value='Observed Impacts'), SelectMultiple(index=(0, 1), options=('swash', 'collision'), value=('swash', 'collision')))), VBox(children=(HTML(value='Forecasted: foreshore_slope_sto06'), SelectMultiple(index=(0, 1, 2, 3), options=('swash', 'collision', 'overwash', 'inundation'), value=('swash', 'collision', 'overwash', 'inundation')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2, 3), options=('swash', 'collision', 'overwash', 'inundation'), value=('swash', 'collision', 'overwash', 'inundation')))))))), HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=943, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', 'AVOCAs0001', 'AVOCAs0002', 'AVOCAs0003', 'AVOCAs0004', 'AVOCAs0005', 'AVOCAs0006', 'AVOCAs0007', 'AVOCAs0008', 'BILG0001', 'BILG0002', 'BILG0003', 'BILG0004', 'BILG0005', 'BLUEYS0001', 'BLUEYS0002', 'BLUEYS0003', 'BLUEYS0004', 'BLUEYS0005', 'BLUEYS0006', 'BOAT0001', 'BOAT0002', 'BOAT0003', 'BOAT0004', 'BOAT0005', 'BOOM0001', 'BOOM0002', 'BOOM0003', 'BOOM0004', 'BOOM0005', 'BOOM0006', 'BOOM0007', 'BOOM0008', 'BOOM0009', 'BOOM0010', 'BOOM0011', 'BOOM0012', 'BOOM0013', 'BOOM0014', 'CATHIE0001', 'CATHIE0002', 'CATHIE0003', 'CATHIE0004', 'CATHIE0005', 'CATHIE0006', 'CATHIE0007', 'CATHIE0008', 'CATHIE0009', 'CATHIE0010', 'CATHIE0011', 'CATHIE0012', 'CATHIE0013', 'CATHIE0014', 'CATHIE0015', 'CATHIE0016', 'CATHIE0017', 'CATHIE0018', 'CATHIE0019', 'CATHIE0020', 'CATHIE0021', 'CATHIE0022', 'CATHIE0023', 'CATHIE0024', 'CATHIE0025', 'CATHIE0026', 'CATHIE0027', 'CATHIE0028', 'CATHIE0029', 'CRESn0001', 'CRESn0002', 'CRESn0003', 'CRESn0004', 'CRESn0005', 'CRESn0006', 'CRESn0007', 'CRESn0008', 'CRESn0009', 'CRESn0010', 'CRESn0011', 'CRESn0012', 'CRESn0013', 'CRESn0014', 'CRESn0015', 'CRESn0016', 'CRESn0017', 'CRESn0018', 'CRESn0019', 'CRESn0020', 'CRESn0021', 'CRESn0022', 'CRESn0023', 'CRESn0024', 'CRESn0025', 'CRESn0026', 'CRESn0027', 'CRESn0028', 'CRESn0029', 'CRESn0030', 'CRESn0031', 'CRESn0032', 'CRESn0033', 'CRESn0034', 'CRESn0035', 'CRESn0036', 'CRESn0037', 'CRESn0038', 'CRESn0039', 'CRESn0040', 'CRESn0041', 'CRESn0042', 'CRESn0043', 'CRESn0044', 'CRESn0045', 'CRESn0046', 'CRESn0047', 'CRESn0048', 'CRESn0049', 'CRESn0050', 'CRESn0051', 'CRESn0052', 'CRESn0053', 'CRESn0054', 'CRESn0055', 'CRESn0056', 'CRESn0057', 'CRESn0058', 'CRESn0059', 'CRESn0060', 'CRESn0061', 'CRESn0062', 'CRESn0063', 'CRESn0064', 'CRESn0065', 'CRESn0066', 'CRESn0067', 'CRESn0068', 'CRESn0069', 'CRESn0070', 'CRESn0071', 'CRESn0072', 'CRESn0073', 'CRESn0074', 'CRESn0075', 'CRESn0076', 'CRESn0077', 'CRESn0078', 'CRESn0079', 'CRESn0080', 'CRESn0081', 'CRESn0082', 'CRESn0083', 'CRESn0084', 'CRESn0085', 'CRESn0086', 'CRESn0087', 'CRESn0088', 'CRESn0089', 'CRESn0090', 'CRESn0091', 'CRESn0092', 'CRESn0093', 'CRESn0094', 'CRESn0095', 'CRESn0096', 'CRESn0097', 'CRESn0098', 'CRESn0099', 'CRESn0100', 'CRESn0101', 'CRESn0102', 'CRESn0103', 'CRESn0104', 'CRESn0105', 'CRESn0106', 'CRESn0107', 'CRESn0108', 'CRESn0109', 'CRESn0110', 'CRESn0111', 'CRESn0112', 'CRESn0113', 'CRESn0114', 'CRESn0115', 'CRESn0116', 'CRESn0117', 'CRESn0118', 'CRESn0119', 'CRESn0120', 'CRESn0121', 'CRESn0122', 'CRESn0123', 'CRESn0124', 'CRESn0125', 'CRESs0001', 'CRESs0002', 'CRESs0003', 'CRESs0004', 'CRESs0005', 'CRESs0006', 'CRESs0007', 'CRESs0008', 'CRESs0009', 'CRESs0010', 'CRESs0011', 'CRESs0012', 'CRESs0013', 'CRESs0014', 'DEEWHYn0001', 'DEEWHYn0002', 'DEEWHYn0003', 'DEEWHYn0004', 'DEEWHYn0005', 'DEEWHYn0006', 'DEEWHYn0007', 'DEEWHYn0008', 'DEEWHYn0009', 'DEEWHYn0010', 'DEEWHYn0011', 'DEEWHYn0012', 'DEEWHYs0001', 'DEEWHYs0002', 'DEEWHYs0003', 'DEEWHYs0004', 'DEEWHYs0005', 'DEEWHYs0006', 'DEEWHYs0007', 'DEEWHYs0008', 'DIAMONDn0001', 'DIAMONDn0002', 'DIAMONDn0003', 'DIAMONDn0004', 'DIAMONDn0005', 'DIAMONDn0006', 'DIAMONDn0007', 'DIAMONDn0008', 'DIAMONDn0009', 'DIAMONDn0010', 'DIAMONDn0011', 'DIAMONDn0012', 'DIAMONDn0013', 'DIAMONDn0014', 'DIAMONDn0015', 'DIAMONDn0016', 'DIAMONDn0017', 'DIAMONDn0018', 'DIAMONDn0019', 'DIAMONDn0020', 'DIAMONDn0021', 'DIAMONDn0022', 'DIAMONDn0023', 'DIAMONDn0024', 'DIAMONDn0025', 'DIAMONDn0026', 'DIAMONDn0027', 'DIAMONDn0028', 'DIAMONDn0029', 'DIAMONDn0030', 'DIAMONDn0031', 'DIAMONDn0032', 'DIAMONDn0033', 'DIAMONDn0034', 'DIAMONDn0035', 'DIAMONDn0036', 'DIAMONDn0037', 'DIAMONDn0038', 'DIAMONDn0039', 'DIAMONDn0040', 'DIAMONDn0041', 'DIAMONDs0001', 'DIAMONDs0002', 'DIAMONDs0003', 'DIAMONDs0004', 'DIAMONDs0005', 'DIAMONDs0006', 'DIAMONDs0007', 'DUNBn0001', 'DUNBn0002', 'DUNBn0003', 'DUNBn0004', 'DUNBn0005', 'DUNBn0006', 'DUNBn0007', 'DUNBn0008', 'DUNBn0009', 'DUNBn0010', 'DUNBn0011', 'DUNBn0012', 'DUNBn0013', 'DUNBn0014', 'DUNBn0015', 'DUNBn0016', 'DUNBn0017', 'DUNBn0018', 'DUNBn0019', 'DUNBn0020', 'DUNBn0021', 'DUNBn0022', 'DUNBn0023', 'DUNBn0024', 'DUNBn0025', 'DUNBn0026', 'DUNBn0027', 'DUNBn0028', 'DUNBn0029', 'DUNBn0030', 'DUNBn0031', 'DUNBn0032', 'DUNBn0033', 'DUNBn0034', 'DUNBn0035', 'DUNBn0036', 'DUNBn0037', 'DUNBn0038', 'DUNBn0039', 'DUNBn0040', 'DUNBn0041', 'DUNBn0042', 'DUNBn0043', 'DUNBn0044', 'DUNBn0045', 'DUNBn0046', 'DUNBn0047', 'DUNBn0048', 'DUNBn0049', 'DUNBn0050', 'DUNBn0051', 'DUNBn0052', 'DUNBn0053', 'DUNBn0054', 'DUNBn0055', 'DUNBn0056', 'DUNBn0057', 'DUNBn0058', 'DUNBn0059', 'DUNBn0060', 'DUNBn0061', 'DUNBn0062', 'DUNBn0063', 'DUNBn0064', 'DUNBn0065', 'DUNBn0066', 'DUNBn0067', 'DUNBn0068', 'DUNBn0069', 'DUNBn0070', 'DUNBn0071', 'DUNBn0072', 'DUNBn0073', 'DUNBn0074', 'DUNBs0001', 'DUNBs0002', 'DUNBs0003', 'DUNBs0004', 'DUNBs0005', 'DUNBs0006', 'DUNBs0007', 'DUNBs0008', 'DUNBs0009', 'DUNBs0010', 'DUNBs0011', 'ELIZA0001', 'ELIZA0002', 'ELIZA0003', 'ELIZA0004', 'ELIZA0005', 'ELIZA0006', 'ELIZA0007', 'ENTRA0001', 'ENTRA0002', 'ENTRA0003', 'ENTRA0004', 'ENTRA0005', 'ENTRA0006', 'ENTRA0007', 'ENTRA0008', 'ENTRA0009', 'ENTRA0010', 'ENTRA0011', 'ENTRA0012', 'ENTRA0013', 'ENTRA0014', 'ENTRA0015', 'ENTRA0016', 'ENTRA0017', 'ENTRA0018', 'ENTRA0019', 'ENTRA0020', 'ENTRA0021', 'ENTRA0022', 'ENTRA0023', 'ENTRA0024', 'ENTRA0025', 'ENTRA0026', 'ENTRA0027', 'ENTRA0028', 'ENTRA0029', 'ENTRA0030', 'ENTRA0031', 'ENTRA0032', 'ENTRA0033', 'ENTRA0034', 'ENTRA0035', 'ENTRA0036', 'ENTRA0037', 'ENTRA0038', 'ENTRA0039', 'ENTRA0040', 'ENTRA0041', 'ENTRA0042', 'ENTRA0043', 'ENTRA0044', 'ENTRA0045', 'ENTRA0046', 'ENTRA0047', 'ENTRA0048', 'ENTRA0049', 'ENTRA0050', 'ENTRA0051', 'ENTRA0052', 'ENTRA0053', 'ENTRA0054', 'ENTRA0055', 'ENTRA0056', 'ENTRA0057', 'ENTRA0058', 'ENTRA0059', 'ENTRA0060', 'ENTRA0061', 'ENTRA0062', 'ENTRA0063', 'ENTRA0064', 'ENTRA0065', 'ENTRA0066', 'ENTRA0067', 'ENTRA0068', 'ENTRA0069', 'ENTRA0070', 'ENTRA0071', 'ENTRA0072', 'ENTRA0073', 'ENTRA0074', 'ENTRA0075', 'ENTRA0076', 'ENTRA0077', 'ENTRA0078', 'ENTRA0079', 'FOST0001', 'FOST0002', 'FOST0003', 'FOST0004', 'FOST0005', 'FOST0006', 'GRANTSn0001', 'GRANTSn0002', 'GRANTSn0003', 'GRANTSn0004', 'GRANTSn0005', 'GRANTSn0006', 'GRANTSn0007', 'GRANTSn0008', 'GRANTSn0009', 'GRANTSn0010', 'GRANTSn0011', 'GRANTSn0012', 'GRANTSn0013', 'GRANTSn0014', 'GRANTSn0015', 'GRANTSn0016', 'GRANTSn0017', 'GRANTSn0018', 'GRANTSn0019', 'GRANTSn0020', 'GRANTSn0021', 'GRANTSn0022', 'GRANTSn0023', 'GRANTSn0024', 'GRANTSs0001', 'GRANTSs0002', 'GRANTSs0003', 'GRANTSs0004', 'GRANTSs0005', 'GRANTSs0006', 'GRANTSs0007', 'GRANTSs0008', 'GRANTSs0009', 'GRANTSs0010', 'GRANTSs0011', 'GRANTSs0012', 'GRANTSs0013', 'GRANTSs0014', 'HARGn0001', 'HARGn0002', 'HARGn0003', 'HARGn0004', 'HARGn0005', 'HARGn0006', 'HARGn0007', 'HARGs0001', 'HARGs0002', 'HARGs0003', 'HARGs0004', 'HARGs0005', 'HARGs0006', 'HARGs0007', 'HARR0001', 'HARR0002', 'HARR0003', 'HARR0004', 'HARR0005', 'HARR0006', 'HARR0007', 'HARR0008', 'HARR0009', 'HARR0010', 'HARR0011', 'HARR0012', 'HARR0013', 'HARR0014', 'HARR0015', 'HARR0016', 'HARR0017', 'HARR0018', 'HARR0019', 'HARR0020', 'HARR0021', 'HARR0022', 'HARR0023', 'HARR0024', 'HARR0025', 'HARR0026', 'HARR0027', 'HARR0028', 'HARR0029', 'HARR0030', 'HARR0031', 'HARR0032', 'HARR0033', 'HARR0034', 'HARR0035', 'HARR0036', 'HARR0037', 'HARR0038', 'HARR0039', 'HARR0040', 'HARR0041', 'HARR0042', 'HARR0043', 'HARR0044', 'HARR0045', 'HARR0046', 'HARR0047', 'HARR0048', 'HARR0049', 'HARR0050', 'HARR0051', 'HARR0052', 'HARR0053', 'HARR0054', 'HARR0055', 'HARR0056', 'LHOUSE0001', 'LHOUSE0002', 'LHOUSE0003', 'LHOUSE0004', 'LHOUSE0005', 'LHOUSE0006', 'LHOUSE0007', 'LHOUSE0008', 'LHOUSE0009', 'LHOUSE0010', 'LHOUSE0011', 'LHOUSE0012', 'LHOUSE0013', 'LHOUSEn0001', 'LHOUSEn0002', 'LHOUSEn0003', 'LHOUSEn0004', 'LHOUSEn0005', 'LHOUSEn0006', 'LHOUSEn0007', 'LHOUSEn0008', 'LHOUSEn0009', 'LHOUSEn0010', 'LHOUSEn0011', 'LHOUSEn0012', 'LHOUSEn0013', 'LHOUSEn0014', 'LHOUSEn0015', 'LHOUSEn0016', 'LHOUSEn0017', 'LHOUSEn0018', 'LHOUSEn0019', 'LHOUSEn0020', 'LHOUSEn0021', 'LHOUSEn0022', 'LHOUSEn0023', 'LHOUSEn0024', 'LHOUSEn0025', 'LHOUSEn0026', 'LHOUSEn0027', 'LHOUSEn0028', 'LHOUSEn0029', 'LHOUSEn0030', 'LHOUSEn0031', 'LHOUSEn0032', 'LHOUSEn0033', 'LHOUSEn0034', 'LHOUSEn0035', 'LHOUSEn0036', 'LHOUSEn0037', 'LHOUSEn0038', 'LHOUSEn0039', 'LHOUSEn0040', 'LHOUSEn0041', 'LHOUSEn0042', 'LHOUSEn0043', 'LHOUSEn0044', 'LHOUSEn0045', 'LHOUSEn0046', 'LHOUSEn0047', 'LHOUSEn0048', 'LHOUSEn0049', 'LHOUSEn0050', 'LHOUSEn0051', 'LHOUSEn0052', 'LHOUSEn0053', 'LHOUSEn0054', 'LHOUSEn0055', 'LHOUSEn0056', 'LHOUSEn0057', 'LHOUSEn0058', 'LHOUSEn0059', 'LHOUSEn0060', 'LHOUSEn0061', 'LHOUSEn0062', 'LHOUSEn0063', 'LHOUSEn0064', 'LHOUSEn0065', 'LHOUSEn0066', 'LHOUSEn0067', 'LHOUSEn0068', 'LHOUSEn0069', 'LHOUSEn0070', 'LHOUSEn0071', 'LHOUSEn0072', 'LHOUSEn0073', 'LHOUSEn0074', 'LHOUSEn0075', 'LHOUSEn0076', 'LHOUSEn0077', 'LHOUSEn0078', 'LHOUSEn0079', 'LHOUSEn0080', 'LHOUSEn0081', 'LHOUSEn0082', 'LHOUSEn0083', 'LHOUSEn0084', 'LHOUSEn0085', 'LHOUSEn0086', 'LHOUSEn0087', 'LHOUSEn0088', 'LHOUSEn0089', 'LHOUSEn0090', 'LHOUSEn0091', 'LHOUSEn0092', 'LHOUSEn0093', 'LHOUSEs0001', 'LHOUSEs0002', 'LHOUSEs0003', 'LHOUSEs0004', 'LHOUSEs0005', 'LHOUSEs0006', 'LHOUSEs0007', 'LHOUSEs0008', 'LHOUSEs0009', 'LHOUSEs0010', 'LHOUSEs0011', 'LHOUSEs0012', 'LHOUSEs0013', 'LHOUSEs0014', 'LHOUSEs0015', 'LHOUSEs0016', 'LHOUSEs0017', 'LHOUSEs0018', 'LHOUSEs0019', 'LHOUSEs0020', 'LHOUSEs0021', 'LHOUSEs0022', 'LHOUSEs0023', 'LHOUSEs0024', 'LHOUSEs0025', 'LHOUSEs0026', 'LHOUSEs0027', 'LHOUSEs0028', 'LHOUSEs0029', 'LHOUSEs0030', 'LHOUSEs0031', 'LHOUSEs0032', 'MACM0001', 'MACM0002', 'MACM0003', 'MACM0004', 'MACM0005', 'MACM0006', 'MACM0007', 'MACM0008', 'MACM0009', 'MACM0010', 'MACM0011', 'MACM0012', 'MACM0013', 'MACM0014', 'MACM0015', 'MACM0016', 'MANNING0001', 'MANNING0002', 'MANNING0003', 'MANNING0004', 'MANNING0005', 'MANNING0006', 'MANNING0007', 'MANNING0008', 'MANNING0009', 'MANNING0010', 'MANNING0011', 'MANNING0012', 'MANNING0013', 'MANNING0014', 'MANNING0015', 'MANNING0016', 'MANNING0017', 'MANNING0018', 'MANNING0019', 'MANNING0020', 'MANNING0021', 'MANNING0022', 'MANNING0023', 'MANNING0024', 'MANNING0025', 'MANNING0026', 'MANNING0027', 'MANNING0028', 'MANNING0029', 'MANNING0030', 'MANNING0031', 'MANNING0032', 'MANNING0033', 'MANNING0034', 'MANNING0035', 'MANNING0036', 'MANNING0037', 'MANNING0038', 'MANNING0039', 'MANNING0040', 'MANNING0041', 'MANNING0042', 'MANNING0043', 'MANNING0044', 'MANNING0045', 'MANNING0046', 'MANNING0047', 'MANNING0048', 'MANNING0049', 'MANNING0050', 'MANNING0051', 'MANNING0052', 'MANNING0053', 'MANNING0054', 'MANNING0055', 'MANNING0056', 'MANNING0057', 'MANNING0058', 'MANNING0059', 'MANNING0060', 'MANNING0061', 'MANNING0062', 'MANNING0063', 'MANNING0064', 'MANNING0065', 'MANNING0066', 'MANNING0067', 'MANNING0068', 'MANNING0069', 'MANNING0070', 'MANNING0071', 'MANNING0072', 'MANNING0073', 'MANNING0074', 'MANNING0075', 'MANNING0076', 'MANNING0077', 'MANNING0078', 'MANNING0079', 'MANNING0080', 'MANNING0081', 'MANNING0082', 'MANNING0083', 'MANNING0084', 'MANNING0085', 'MANNING0086', 'MANNING0087', 'MANNING0088', 'MANNING0089', 'MANNING0090', 'MANNING0091', 'MANNING0092', 'MANNING0093', 'MANNING0094', 'MANNING0095', 'MANNING0096', 'MANNING0097', 'MANNING0098', 'MANNING0099', 'MANNING0100', 'MANNING0101', 'MANNING0102', 'MANNING0103', 'MANNING0104', 'MANNING0105', 'MANNING0106', 'MANNING0107', 'MANNING0108', 'MANNING0109', 'MANNING0110', 'MANNING0111', 'MANNING0112', 'MANNING0113', 'MANNING0114', 'MANNING0115', 'MANNING0116', 'MANNING0117', 'MANNING0118', 'MANNING0119', 'MANNING0120', 'MANNING0121', 'MANNING0122', 'MANNING0123', 'MANNING0124', 'MANNING0125', 'MANNING0126', 'MANNING0127', 'MONA0001', 'MONA0002', 'MONA0003', 'MONA0004', 'MONA0005', 'MONA0006', 'MONA0007', 'MONA0008', 'MONA0009', 'MONA0010', 'MONA0011', 'MONA0012', 'MONA0013', 'MONA0014', 'MONA0015', 'MONA0016', 'MONA0017', 'MONA0018', 'MONA0019', 'MONA0020', 'MONA0021', 'NAMB0001', 'NAMB0002', 'NAMB0003', 'NAMB0004', 'NAMB0005', 'NAMB0006', 'NAMB0007', 'NAMB0008', 'NAMB0009', 'NAMB0010', 'NAMB0011', 'NAMB0012', 'NAMB0013', 'NAMB0014', 'NAMB0015', 'NAMB0016', 'NAMB0017', 'NAMB0018', 'NAMB0019', 'NAMB0020', 'NAMB0021', 'NAMB0022', 'NAMB0023', 'NAMB0024', 'NAMB0025', 'NAMB0026', 'NAMB0027', 'NAMB0028', 'NAMB0029', 'NAMB0030', 'NAMB0031', 'NAMB0032', 'NAMB0033', 'NAMB0034', 'NAMB0035', 'NAMB0036', 'NAMB0037', 'NAMB0038', 'NAMB0039', 'NAMB0040', 'NAMB0041', 'NAMB0042', 'NAMB0043', 'NAMB0044', 'NAMB0045', 'NAMB0046', 'NAMB0047', 'NAMB0048', 'NAMB0049', 'NAMB0050', 'NAMB0051', 'NAMB0052', 'NAMB0053', 'NAMB0054', 'NAMB0055', 'NAMB0056', 'NAMB0057', 'NAMB0058', 'NAMB0059', 'NAMB0060', 'NAMB0061', 'NAMB0062', 'NAMB0063', 'NAMB0064', 'NAMB0065', 'NAMB0066', 'NAMB0067', 'NAMB0068', 'NAMB0069', 'NAMB0070', 'NAMB0071', 'NAMB0072', 'NAMB0073', 'NARRA0001', 'NARRA0002', 'NARRA0003', 'NARRA0004', 'NARRA0005', 'NARRA0006', 'NARRA0007', 'NARRA0008', 'NARRA0009', 'NARRA0010', 'NARRA0011', 'NARRA0012', 'NARRA0013', 'NARRA0014', 'NARRA0015', 'NARRA0016', 'NARRA0017', 'NARRA0018', 'NARRA0019', 'NARRA0020', 'NARRA0021', 'NARRA0022', 'NARRA0023', 'NARRA0024', 'NARRA0025', 'NARRA0026', 'NARRA0027', 'NARRA0028', 'NARRA0029', 'NARRA0030', 'NARRA0031', 'NARRA0032', 'NARRA0033', 'NARRA0034', 'NARRA0035', 'NARRA0036', 'NINEMn0001', 'NINEMn0002', 'NINEMn0003', 'NINEMn0004', 'NINEMn0005', 'NINEMn0006', 'NINEMn0007', 'NINEMn0008', 'NINEMn0009', 'NINEMn0010', 'NINEMn0011', 'NINEMn0012', 'NINEMn0013', 'NINEMn0014', 'NINEMn0015', 'NINEMn0016', 'NINEMn0017', 'NINEMn0018', 'NINEMn0019', 'NINEMn0020', 'NINEMn0021', 'NINEMn0022', 'NINEMn0023', 'NINEMn0024', 'NINEMn0025', 'NINEMn0026', 'NINEMn0027', 'NINEMn0028', 'NINEMn0029', 'NINEMn0030', 'NINEMn0031', 'NINEMn0032', 'NINEMn0033', 'NINEMn0034', 'NINEMn0035', 'NINEMn0036', 'NINEMn0037', 'NINEMn0038', 'NINEMn0039', 'NINEMn0040', 'NINEMn0041', 'NINEMn0042', 'NINEMn0043', 'NINEMn0044', 'NINEMn0045', 'NINEMn0046', 'NINEMn0047', 'NINEMn0048', 'NINEMn0049', 'NINEMn0050', 'NINEMn0051', 'NINEMn0052', 'NINEMn0053', 'NINEMn0054', 'NINEMs0001', 'NINEMs0002', 'NINEMs0003', 'NINEMs0004', 'NINEMs0005', 'NINEMs0006', 'NINEMs0007', 'NINEMs0008', 'NINEMs0009', 'NINEMs0010', 'NINEMs0011', 'NINEMs0012', 'NINEMs0013', 'NINEMs0014', 'NINEMs0015', 'NINEMs0016', 'NINEMs0017', 'NINEMs0018', 'NINEMs0019', 'NINEMs0020', 'NINEMs0021', 'NINEMs0022', 'NINEMs0023', 'NINEMs0024', 'NINEMs0025', 'NINEMs0026', 'NINEMs0027', 'NINEMs0028', 'NINEMs0029', 'NINEMs0030', 'NINEMs0031', 'NINEMs0032', 'NINEMs0033', 'NINEMs0034', 'NINEMs0035', 'NINEMs0036', 'NINEMs0037', 'NINEMs0038', 'NINEMs0039', 'NINEMs0040', 'NINEMs0041', 'NINEMs0042', 'NINEMs0043', 'NINEMs0044', 'NINEMs0045', 'NINEMs0046', 'NINEMs0047', 'NINEMs0048', 'NINEMs0049', 'NINEMs0050', 'NINEMs0051', 'NINEMs0052', 'NINEMs0053', 'NINEMs0054', 'NINEMs0055', 'NINEMs0056', 'NINEMs0057', 'NINEMs0058', 'NINEMs0059', 'NINEMs0060', 'NSHORE_n0001', 'NSHORE_n0002', 'NSHORE_n0003', 'NSHORE_n0004', 'NSHORE_n0005', 'NSHORE_n0006', 'NSHORE_n0007', 'NSHORE_n0008', 'NSHORE_n0009', 'NSHORE_n0010', 'NSHORE_n0011', 'NSHORE_n0012', 'NSHORE_n0013', 'NSHORE_n0014', 'NSHORE_n0015', 'NSHORE_n0016', 'NSHORE_n0017', 'NSHORE_n0018', 'NSHORE_n0019', 'NSHORE_n0020', 'NSHORE_n0021', 'NSHORE_n0022', 'NSHORE_n0023', 'NSHORE_n0024', 'NSHORE_n0025', 'NSHORE_n0026', 'NSHORE_n0027', 'NSHORE_n0028', 'NSHORE_n0029', 'NSHORE_n0030', 'NSHORE_n0031', 'NSHORE_n0032', 'NSHORE_n0033', 'NSHORE_n0034', 'NSHORE_n0035', 'NSHORE_n0036', 'NSHORE_n0037', 'NSHORE_n0038', 'NSHORE_n0039', 'NSHORE_n0040', 'NSHORE_n0041', 'NSHORE_n0042', 'NSHORE_n0043', 'NSHORE_n0044', 'NSHORE_n0045', 'NSHORE_n0046', 'NSHORE_n0047', 'NSHORE_n0048', 'NSHORE_n0049', 'NSHORE_n0050', 'NSHORE_n0051', 'NSHORE_n0052', 'NSHORE_n0053', 'NSHORE_n0054', 'NSHORE_n0055', 'NSHORE_n0056', 'NSHORE_n0057', 'NSHORE_n0058', 'NSHORE_n0059', 'NSHORE_n0060', 'NSHORE_n0061', 'NSHORE_n0062', 'NSHORE_n0063', 'NSHORE_n0064', 'NSHORE_n0065', 'NSHORE_n0066', 'NSHORE_n0067', 'NSHORE_n0068', 'NSHORE_n0069', 'NSHORE_n0070', 'NSHORE_n0071', 'NSHORE_n0072', 'NSHORE_n0073', 'NSHORE_n0074', 'NSHORE_n0075', 'NSHORE_n0076', 'NSHORE_n0077', 'NSHORE_n0078', 'NSHORE_n0079', 'NSHORE_n0080', 'NSHORE_n0081', 'NSHORE_n0082', 'NSHORE_s0001', 'NSHORE_s0002', 'NSHORE_s0003', 'NSHORE_s0004', 'NSHORE_s0005', 'NSHORE_s0006', 'NSHORE_s0007', 'NSHORE_s0008', 'NSHORE_s0009', 'NSHORE_s0010', 'NSHORE_s0011', 'NSHORE_s0012', 'NSHORE_s0013', 'NSHORE_s0014', 'NSHORE_s0015', 'NSHORE_s0016', 'NSHORE_s0017', 'NSHORE_s0018', 'NSHORE_s0019', 'NSHORE_s0020', 'NSHORE_s0021', 'NSHORE_s0022', 'NSHORE_s0023', 'NSHORE_s0024', 'NSHORE_s0025', 'NSHORE_s0026', 'NSHORE_s0027', 'NSHORE_s0028', 'NSHORE_s0029', 'NSHORE_s0030', 'NSHORE_s0031', 'NSHORE_s0032', 'NSHORE_s0033', 'NSHORE_s0034', 'NSHORE_s0035', 'NSHORE_s0036', 'NSHORE_s0037', 'NSHORE_s0038', 'NSHORE_s0039', 'NSHORE_s0040', 'NSHORE_s0041', 'NSHORE_s0042', 'NSHORE_s0043', 'NSHORE_s0044', 'OLDBAR0001', 'OLDBAR0002', 'OLDBAR0003', 'OLDBAR0004', 'OLDBAR0005', 'OLDBAR0006', 'OLDBAR0007', 'OLDBAR0008', 'OLDBAR0009', 'OLDBAR0010', 'OLDBAR0011', 'OLDBAR0012', 'OLDBAR0013', 'OLDBAR0014', 'OLDBAR0015', 'OLDBAR0016', 'OLDBAR0017', 'OLDBAR0018', 'OLDBAR0019', 'OLDBAR0020', 'OLDBAR0021', 'OLDBAR0022', 'OLDBAR0023', 'OLDBAR0024', 'OLDBAR0025', 'OLDBAR0026', 'OLDBAR0027', 'OLDBAR0028', 'OLDBAR0029', 'OLDBAR0030', 'OLDBAR0031', 'OLDBAR0032', 'OLDBAR0033', 'OLDBAR0034', 'OLDBAR0035', 'OLDBAR0036', 'ONEMILE0001', 'ONEMILE0002', 'ONEMILE0003', 'ONEMILE0004', 'ONEMILE0005', 'ONEMILE0006', 'ONEMILE0007', 'ONEMILE0008', 'ONEMILE0009', 'ONEMILE0010', 'ONEMILE0011', 'ONEMILE0012', 'ONEMILE0013', 'PEARLn0001', 'PEARLn0002', 'PEARLn0003', 'PEARLn0004', 'PEARLn0005', 'PEARLs0001', 'PEARLs0002', 'PEARLs0003', 'PEARLs0004', 'PEARLs0005', 'SCOT0001', 'SCOT0002', 'SCOT0003', 'SCOT0004', 'SCOT0005', 'SCOT0006', 'SCOT0007', 'SCOT0008', 'SCOT0009', 'SCOT0010', 'SCOT0011', 'SCOT0012', 'STOCNn0001', 'STOCNn0002', 'STOCNn0003', 'STOCNn0004', 'STOCNn0005', 'STOCNn0006', 'STOCNn0007', 'STOCNn0008', 'STOCNn0009', 'STOCNn0010', 'STOCNn0011', 'STOCNn0012', 'STOCNn0013', 'STOCNn0014', 'STOCNn0015', 'STOCNn0016', 'STOCNn0017', 'STOCNn0018', 'STOCNn0019', 'STOCNn0020', 'STOCNn0021', 'STOCNn0022', 'STOCNn0023', 'STOCNn0024', 'STOCNn0025', 'STOCNn0026', 'STOCNn0027', 'STOCNn0028', 'STOCNn0029', 'STOCNn0030', 'STOCNn0031', 'STOCNn0032', 'STOCNn0033', 'STOCNn0034', 'STOCNn0035', 'STOCNn0036', 'STOCNn0037', 'STOCNn0038', 'STOCNn0039', 'STOCNn0040', 'STOCNn0041', 'STOCNn0042', 'STOCNn0043', 'STOCNn0044', 'STOCNn0045', 'STOCNn0046', 'STOCNn0047', 'STOCNn0048', 'STOCNn0049', 'STOCNn0050', 'STOCNn0051', 'STOCNn0052', 'STOCNn0053', 'STOCNn0054', 'STOCNn0055', 'STOCNn0056', 'STOCNn0057', 'STOCNn0058', 'STOCNn0059', 'STOCNn0060', 'STOCNn0061', 'STOCNn0062', 'STOCNn0063', 'STOCNn0064', 'STOCNn0065', 'STOCNs0001', 'STOCNs0002', 'STOCNs0003', 'STOCNs0004', 'STOCNs0005', 'STOCNs0006', 'STOCNs0007', 'STOCNs0008', 'STOCNs0009', 'STOCNs0010', 'STOCNs0011', 'STOCNs0012', 'STOCNs0013', 'STOCNs0014', 'STOCNs0015', 'STOCNs0016', 'STOCNs0017', 'STOCNs0018', 'STOCNs0019', 'STOCNs0020', 'STOCNs0021', 'STOCNs0022', 'STOCNs0023', 'STOCNs0024', 'STOCNs0025', 'STOCNs0026', 'STOCNs0027', 'STOCNs0028', 'STOCNs0029', 'STOCNs0030', 'STOCNs0031', 'STOCNs0032', 'STOCNs0033', 'STOCNs0034', 'STOCNs0035', 'STOCNs0036', 'STOCNs0037', 'STOCNs0038', 'STOCNs0039', 'STOCNs0040', 'STOCNs0041', 'STOCNs0042', 'STOCNs0043', 'STOCNs0044', 'STOCNs0045', 'STOCNs0046', 'STOCNs0047', 'STOCNs0048', 'STOCNs0049', 'STOCNs0050', 'STOCNs0051', 'STOCNs0052', 'STOCNs0053', 'STOCNs0054', 'STOCNs0055', 'STOCNs0056', 'STOCNs0057', 'STOCNs0058', 'STOCNs0059', 'STOCNs0060', 'STOCNs0061', 'STOCNs0062', 'STOCNs0063', 'STOCNs0064', 'STOCNs0065', 'STOCNs0066', 'STOCNs0067', 'STOCNs0068', 'STOCNs0069', 'STOCNs0070', 'STOCNs0071', 'STOCNs0072', 'STOCNs0073', 'STOCNs0074', 'STOCNs0075', 'STOCNs0076', 'STOCNs0077', 'STOCNs0078', 'STOCNs0079', 'STOCNs0080', 'STOCNs0081', 'STOCNs0082', 'STOCNs0083', 'STOCNs0084', 'STOCNs0085', 'STOCNs0086', 'STOCNs0087', 'STOCNs0088', 'STOCNs0089', 'STOCNs0090', 'STOCNs0091', 'STOCNs0092', 'STOCNs0093', 'STOCNs0094', 'STOCNs0095', 'STOCNs0096', 'STOCNs0097', 'STOCNs0098', 'STOCNs0099', 'STOCNs0100', 'STOCNs0101', 'STOCNs0102', 'STOCNs0103', 'STOCNs0104', 'STOCNs0105', 'STOCNs0106', 'STOCNs0107', 'STOCNs0108', 'STOCNs0109', 'STOCNs0110', 'STOCNs0111', 'STOCNs0112', 'STOCNs0113', 'STOCNs0114', 'STOCNs0115', 'STOCNs0116', 'STOCNs0117', 'STOCNs0118', 'STOCNs0119', 'STOCNs0120', 'STOCNs0121', 'STOCNs0122', 'STOCNs0123', 'STOCNs0124', 'STOCNs0125', 'STOCNs0126', 'STOCNs0127', 'STOCNs0128', 'STOCNs0129', 'STOCNs0130', 'STOCNs0131', 'STOCNs0132', 'STOCNs0133', 'STOCNs0134', 'STOCNs0135', 'STOCNs0136', 'STOCNs0137', 'STOCNs0138', 'STOCNs0139', 'STOCNs0140', 'STOCNs0141', 'STOCNs0142', 'STOCNs0143', 'STOCNs0144', 'STOCNs0145', 'STOCNs0146', 'STOCNs0147', 'STOCNs0148', 'STOCNs0149', 'STOCNs0150', 'STOCNs0151', 'STOCNs0152', 'STOCNs0153', 'STOCNs0154', 'STOCNs0155', 'STOCNs0156', 'STOCNs0157', 'STOCNs0158', 'STOCNs0159', 'STOCNs0160', 'STOCNs0161', 'STOCNs0162', 'STOCNs0163', 'STOCNs0164', 'STOCNs0165', 'STOCNs0166', 'STOCNs0167', 'STOCNs0168', 'STOCNs0169', 'STOCNs0170', 'STOCNs0171', 'STOCNs0172', 'STOCNs0173', 'STOCNs0174', 'STOCNs0175', 'STOCNs0176', 'STOCNs0177', 'STOCNs0178', 'STOCNs0179', 'STOCNs0180', 'STOCNs0181', 'STOCNs0182', 'STOCNs0183', 'STOCNs0184', 'STOCNs0185', 'STOCNs0186', 'STOCNs0187', 'STOCNs0188', 'STOCNs0189', 'STOCNs0190', 'STOCNs0191', 'STOCNs0192', 'STOCNs0193', 'STOCNs0194', 'STOCNs0195', 'STOCNs0196', 'STOCNs0197', 'STOCNs0198', 'STOCNs0199', 'STOCNs0200', 'STOCNs0201', 'STOCNs0202', 'STOCNs0203', 'STOCNs0204', 'STOCNs0205', 'STOCNs0206', 'STOCNs0207', 'STOCNs0208', 'STOCNs0209', 'STOCS0001', 'STOCS0002', 'STOCS0003', 'STOCS0004', 'STOCS0005', 'STOCS0006', 'STOCS0007', 'STOCS0008', 'STOCS0009', 'STOCS0010', 'STOCS0011', 'STOCS0012', 'STOCS0013', 'STOCS0014', 'STOCS0015', 'STOCS0016', 'STOCS0017', 'STOCS0018', 'STOCS0019', 'STOCS0020', 'STOCS0021', 'STOCS0022', 'STOCS0023', 'STOCS0024', 'STOCS0025', 'STOCS0026', 'STOCS0027', 'STOCS0028', 'STOCS0029', 'STOCS0030', 'STOCS0031', 'STOCS0032', 'STOCS0033', 'STOCS0034', 'STOCS0035', 'STOCS0036', 'STOCS0037', 'STOCS0038', 'STOCS0039', 'STOCS0040', 'STOCS0041', 'STOCS0042', 'STOCS0043', 'STOCS0044', 'STOCS0045', 'STOCS0046', 'STUART0001', 'STUART0002', 'STUART0003', 'STUART0004', 'STUART0005', 'STUART0006', 'STUART0007', 'STUART0008', 'STUART0009', 'STUART0010', 'STUART0011', 'STUART0012', 'STUART0013', 'STUART0014', 'STUART0015', 'STUART0016', 'STUART0017', 'STUART0018', 'STUART0019', 'STUART0020', 'STUART0021', 'STUART0022', 'STUART0023', 'STUART0024', 'STUART0025', 'STUART0026', 'STUART0027', 'STUART0028', 'STUART0029', 'STUART0030', 'STUART0031', 'STUART0032', 'STUART0033', 'STUART0034', 'STUART0035', 'STUART0036', 'STUART0037', 'STUART0038', 'STUART0039', 'STUART0040', 'STUART0041', 'STUART0042', 'STUART0043', 'STUART0044', 'STUART0045', 'STUART0046', 'STUART0047', 'STUART0048', 'STUART0049', 'STUART0050', 'STUART0051', 'STUART0052', 'STUART0053', 'STUART0054', 'STUART0055', 'STUART0056', 'STUART0057', 'STUART0058', 'STUART0059', 'STUART0060', 'STUART0061', 'STUART0062', 'STUART0063', 'STUART0064', 'STUART0065', 'STUART0066', 'STUART0067', 'STUART0068', 'STUART0069', 'STUART0070', 'STUART0071', 'STUART0072', 'STUART0073', 'STUART0074', 'STUART0075', 'STUART0076', 'STUART0077', 'STUART0078', 'STUART0079', 'STUART0080', 'STUART0081', 'STUART0082', 'STUART0083', 'STUART0084', 'STUART0085', 'STUART0086', 'STUART0087', 'STUART0088', 'STUART0089', 'SWRO0001', 'SWRO0002', 'SWRO0003', 'SWRO0004', 'SWRO0005', 'SWRO0006', 'SWRO0007', 'SWRO0008', 'SWRO0009', 'SWRO0010', 'SWRO0011', 'SWRO0012', 'SWRO0013', 'SWRO0014', 'SWRO0015', 'SWRO0016', 'SWRO0017', 'SWRO0018', 'SWRO0019', 'SWRO0020', 'SWRO0021', 'SWRO0022', 'SWRO0023', 'SWRO0024', 'SWRO0025', 'SWRO0026', 'TREACH0001', 'TREACH0002', 'TREACH0003', 'TREACH0004', 'TREACH0005', 'TREACH0006', 'TREACH0007', 'TREACH0008', 'TREACH0009', 'TREACH0010', 'TREACH0011', 'TREACH0012', 'TREACH0013', 'TREACH0014', 'TREACH0015', 'TREACH0016', 'WAMBE0001', 'WAMBE0002', 'WAMBE0003', 'WAMBE0004', 'WAMBE0005', 'WAMBE0006', 'WAMBE0007', 'WAMBE0008', 'WAMBE0009', 'WAMBE0010', 'WAMBE0011', 'WAMBE0012', 'WAMBE0013', 'WAMBE0014', 'WAMBE0015', 'WAMBE0016', 'WAMBE0017', 'WAMBE0018', 'WAMBE0019', 'WAMBE0020', 'WAMBE0021', 'WAMBE0022', 'WAMBE0023', 'WAMBE0024', 'WAMBE0025', 'WAMBE0026', 'WAMBE0027'), value='NARRA0001'),)))), HTML(value=''))), HBox(children=(FigureWidget({\n", - " 'data': [{'line': {'color': 'rgb(51,160,44)', 'width': 2},\n", - " 'name': 'Pre Storm Profile',\n", - " 'type': 'scatter',\n", - " 'uid': '9296f63a-b2b2-4788-a80a-16948615c245',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'line': {'color': 'rgb(255,127,0)', 'width': 2},\n", - " 'name': 'Post Storm Profile',\n", - " 'type': 'scatter',\n", - " 'uid': 'cb9c91ed-5504-48b9-b9f9-8207b1b69e0f',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgba(255,255,255,0)', 'line': {'color': 'rgba(106,61,154, 1)', 'width': 2}, 'size': 10},\n", - " 'mode': 'markers',\n", - " 'name': 'Pre-storm dune crest',\n", - " 'type': 'scatter',\n", - " 'uid': '8b3ceb5b-53ab-4fbf-ba0d-6bbd000bc45d',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgba(255,255,255,0)', 'line': {'color': 'rgba(202,178,214,1)', 'width': 2}, 'size': 10},\n", - " 'mode': 'markers',\n", - " 'name': 'Pre-storm dune toe',\n", - " 'type': 'scatter',\n", - " 'uid': 'ee3d137a-1000-432d-8897-b96519d6f472',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgba(255,255,255,0)',\n", - " 'line': {'color': 'rgba(106,61,154, 1)', 'width': 2},\n", - " 'size': 10,\n", - " 'symbol': 'square'},\n", - " 'mode': 'markers',\n", - " 'name': 'Post-storm dune crest',\n", - " 'type': 'scatter',\n", - " 'uid': '44b06676-00fa-40c1-a78b-d302ddb56ba7',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgba(255,255,255,0)',\n", - " 'line': {'color': 'rgba(202,178,214,1)', 'width': 2},\n", - " 'size': 10,\n", - " 'symbol': 'square'},\n", - " 'mode': 'markers',\n", - " 'name': 'Post-storm dune toe',\n", - " 'type': 'scatter',\n", - " 'uid': 'efec8ac2-fedc-4ee0-9849-0e72846641ff',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'line': {'color': 'rgb(44,127,184)', 'width': 4},\n", - " 'mode': 'lines',\n", - " 'name': 'Peak R_high: foreshore_slope_sto06',\n", - " 'type': 'scatter',\n", - " 'uid': 'f67daafe-c7e5-4c97-a57a-6a24d115b4f6',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'line': {'color': 'rgb(127,205,187)', 'width': 4},\n", - " 'mode': 'lines',\n", - " 'name': 'Peak R_high: mean_slope_sto06',\n", - " 'type': 'scatter',\n", - " 'uid': '96dc2836-4d14-447f-ba9d-67f9901d88e4',\n", - " 'x': [0],\n", - " 'y': [0]}],\n", - " 'layout': {'height': 300,\n", - " 'legend': {'font': {'size': 10}},\n", - " 'margin': {'b': 50, 'l': 50, 'r': 20, 't': 50},\n", - " 'title': 'Bed Profiles',\n", - " 'xaxis': {'autorange': True,\n", - " 'range': [0, 200],\n", - " 'showgrid': True,\n", - " 'showline': True,\n", - " 'title': 'x (m)',\n", - " 'zeroline': True},\n", - " 'yaxis': {'autorange': False,\n", - " 'range': [-1, 20],\n", - " 'showgrid': True,\n", - " 'showline': True,\n", - " 'title': 'z (m)',\n", - " 'zeroline': True}}\n", - "}), FigureWidget({\n", - " 'data': [{'lat': array([-33.45779575, -33.4584035 , -33.45911131, ..., -33.44589876,\n", - " -33.44665247, -33.44732817]),\n", - " 'lon': array([151.44105489, 151.44024676, 151.43957804, ..., 151.44420973,\n", - " 151.44479881, 151.44550951]),\n", - " 'marker': {'size': 10},\n", - " 'mode': 'markers',\n", - " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", - " 'WAMBE0027'], dtype='Filter by observed and predicted impacts:'), HBox(children=(V…" ] }, "metadata": {}, @@ -912,8 +704,8 @@ "execution_count": 5, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:15:25.538827Z", - "start_time": "2018-12-03T02:15:24.506209Z" + "end_time": "2018-12-03T23:02:42.021445Z", + "start_time": "2018-12-03T23:02:41.468637Z" }, "code_folding": [], "hide_input": false, @@ -923,287 +715,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a39f67eb200e413d9f909a6bbc5e701d", + "model_id": "a2b52c5ad861454db1756a427f13b55d", "version_major": 2, "version_minor": 0 }, - "text/html": [ - "

Failed to display Jupyter Widget of type VBox.

\n", - "

\n", - " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", - " that the widgets JavaScript is still loading. If this message persists, it\n", - " likely means that the widgets JavaScript library is either not installed or\n", - " not enabled. See the Jupyter\n", - " Widgets Documentation for setup instructions.\n", - "

\n", - "

\n", - " If you're reading this message in another frontend (for example, a static\n", - " rendering on GitHub or NBViewer),\n", - " it may mean that your frontend doesn't currently support widgets.\n", - "

\n" - ], "text/plain": [ - "VBox(children=(VBox(children=(HTML(value='Filter by beach:'), SelectMultiple(index=(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46), options=('AVOCAn', 'AVOCAs', 'BILG', 'BLUEYS', 'BOAT', 'BOOM', 'CATHIE', 'CRESn', 'CRESs', 'DEEWHYn', 'DEEWHYs', 'DIAMONDn', 'DIAMONDs', 'DUNBn', 'DUNBs', 'ELIZA', 'ENTRA', 'FOST', 'GRANTSn', 'GRANTSs', 'HARGn', 'HARGs', 'HARR', 'LHOUSE', 'LHOUSEn', 'LHOUSEs', 'MACM', 'MANNING', 'MONA', 'NAMB', 'NARRA', 'NINEMn', 'NINEMs', 'NSHORE_n', 'NSHORE_s', 'OLDBAR', 'ONEMILE', 'PEARLn', 'PEARLs', 'SCOT', 'STOCNn', 'STOCNs', 'STOCS', 'STUART', 'SWRO', 'TREACH', 'WAMBE'), value=('AVOCAn', 'AVOCAs', 'BILG', 'BLUEYS', 'BOAT', 'BOOM', 'CATHIE', 'CRESn', 'CRESs', 'DEEWHYn', 'DEEWHYs', 'DIAMONDn', 'DIAMONDs', 'DUNBn', 'DUNBs', 'ELIZA', 'ENTRA', 'FOST', 'GRANTSn', 'GRANTSs', 'HARGn', 'HARGs', 'HARR', 'LHOUSE', 'LHOUSEn', 'LHOUSEs', 'MACM', 'MANNING', 'MONA', 'NAMB', 'NARRA', 'NINEMn', 'NINEMs', 'NSHORE_n', 'NSHORE_s', 'OLDBAR', 'ONEMILE', 'PEARLn', 'PEARLs', 'SCOT', 'STOCNn', 'STOCNs', 'STOCS', 'STUART', 'SWRO', 'TREACH', 'WAMBE')))), VBox(children=(VBox(children=(HTML(value='foreshore_slope_sto06'), FigureWidget({\n", - " 'data': [{'colorscale': [[0.0, 'rgb(165, 0, 38)'], [0.003937007874015748,\n", - " 'rgb(166, 1, 38)'], [0.007874015748031496, 'rgb(168,\n", - " 3, 38)'], ..., [0.9921259842519685, 'rgb(2, 107,\n", - " 56)'], [0.9960629921259843, 'rgb(1, 105, 55)'], [1.0,\n", - " 'rgb(0, 104, 55)']],\n", - " 'reversescale': False,\n", - " 'showscale': False,\n", - " 'type': 'heatmap',\n", - " 'uid': 'f44e030d-f675-4ff3-8558-5eec469fe399',\n", - " 'x': [swash, collision, overwash, inundation],\n", - " 'y': [inundation, overwash, collision, swash],\n", - " 'z': [[0.1, 0.3, 0.5, 2], [1.0, 0.8, 0.6, 1], [1.4, 0.28, 1.6,\n", - " 0.21], [0.6, 0.4, 0.2, 3]]}],\n", - " 'layout': {'annotations': [{'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.1',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.3',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.5',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '2',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.0',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.8',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.6',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.4',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.28',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.6',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.21',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.6',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.4',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.2',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '3',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'}],\n", - " 'height': 300,\n", - " 'margin': {'b': 40, 'l': 100, 'pad': 0, 'r': 100, 't': 40},\n", - " 'xaxis': {'dtick': 1, 'gridcolor': 'rgb(0, 0, 0)', 'side': 'top', 'ticks': '', 'title': 'Predicted'},\n", - " 'yaxis': {'dtick': 1, 'ticks': '', 'ticksuffix': ' ', 'title': 'Observed'}}\n", - "}))), VBox(children=(HTML(value='mean_slope_sto06'), FigureWidget({\n", - " 'data': [{'colorscale': [[0.0, 'rgb(165, 0, 38)'], [0.003937007874015748,\n", - " 'rgb(166, 1, 38)'], [0.007874015748031496, 'rgb(168,\n", - " 3, 38)'], ..., [0.9921259842519685, 'rgb(2, 107,\n", - " 56)'], [0.9960629921259843, 'rgb(1, 105, 55)'], [1.0,\n", - " 'rgb(0, 104, 55)']],\n", - " 'reversescale': False,\n", - " 'showscale': False,\n", - " 'type': 'heatmap',\n", - " 'uid': '99e4355b-f090-44ba-b323-38f2dbc70722',\n", - " 'x': [swash, collision, overwash, inundation],\n", - " 'y': [inundation, overwash, collision, swash],\n", - " 'z': [[0.1, 0.3, 0.5, 2], [1.0, 0.8, 0.6, 1], [1.4, 0.28, 1.6,\n", - " 0.21], [0.6, 0.4, 0.2, 3]]}],\n", - " 'layout': {'annotations': [{'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.1',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.3',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.5',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '2',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'inundation',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.0',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.8',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.6',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'overwash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.4',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.28',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '1.6',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.21',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'collision',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.6',\n", - " 'x': 'swash',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.4',\n", - " 'x': 'collision',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '0.2',\n", - " 'x': 'overwash',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'},\n", - " {'font': {'color': '#FFFFFF'},\n", - " 'showarrow': False,\n", - " 'text': '3',\n", - " 'x': 'inundation',\n", - " 'xref': 'x',\n", - " 'y': 'swash',\n", - " 'yref': 'y'}],\n", - " 'height': 300,\n", - " 'margin': {'b': 40, 'l': 100, 'pad': 0, 'r': 100, 't': 40},\n", - " 'xaxis': {'dtick': 1, 'gridcolor': 'rgb(0, 0, 0)', 'side': 'top', 'ticks': '', 'title': 'Predicted'},\n", - " 'yaxis': {'dtick': 1, 'ticks': '', 'ticksuffix': ' ', 'title': 'Observed'}}\n", - "})))))))" + "VBox(children=(VBox(children=(HTML(value='Filter by beach:'), SelectMultiple(index=(0, 1, 2, 3, 4, 5, 6…" ] }, "metadata": {}, @@ -1312,117 +829,177 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:15:40.575569Z", - "start_time": "2018-12-03T02:15:25.540804Z" + "end_time": "2018-12-03T23:03:48.457193Z", + "start_time": "2018-12-03T23:03:48.274709Z" } }, - "outputs": [ - { - "ename": "ValueError", - "evalue": "\nFor some reason plotly.py was unable to communicate with the\nlocal orca server process, even though the server process seems to be running.\n\nPlease review the process and connection information below:\n\norca status\n-----------\n state: running\n executable: C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\orca.CMD\n version: 1.1.1\n port: 59780\n pid: 9652\n command: ['C:\\\\Users\\\\z5189959\\\\AppData\\\\Local\\\\Continuum\\\\anaconda3\\\\orca.CMD', 'serve', '-p', '59780', '--plotly', 'C:\\\\Users\\\\z5189959\\\\AppData\\\\Local\\\\Continuum\\\\anaconda3\\\\lib\\\\site-packages\\\\plotly\\\\package_data\\\\plotly.min.js', '--graph-only', '--mathjax', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js']\n \n\n", - "output_type": "error", - "traceback": [ - "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[1;31mConnectionRefusedError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 140\u001b[0m conn = connection.create_connection(\n\u001b[1;32m--> 141\u001b[1;33m (self.host, self.port), self.timeout, **extra_kw)\n\u001b[0m\u001b[0;32m 142\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\util\\connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 82\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0merr\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 83\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 84\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\util\\connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[1;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[0;32m 72\u001b[0m \u001b[0msock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mbind\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msource_address\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 73\u001b[1;33m \u001b[0msock\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msa\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 74\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0msock\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mConnectionRefusedError\u001b[0m: [WinError 10061] No connection could be made because the target machine actively refused it", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[1;31mNewConnectionError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 600\u001b[0m \u001b[0mbody\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mbody\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 601\u001b[1;33m chunked=chunked)\n\u001b[0m\u001b[0;32m 602\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connectionpool.py\u001b[0m in \u001b[0;36m_make_request\u001b[1;34m(self, conn, method, url, timeout, chunked, **httplib_request_kw)\u001b[0m\n\u001b[0;32m 356\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 357\u001b[1;33m \u001b[0mconn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mhttplib_request_kw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 358\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\http\\client.py\u001b[0m in \u001b[0;36mrequest\u001b[1;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[0;32m 1238\u001b[0m \u001b[1;34m\"\"\"Send a complete request to the server.\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1239\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_send_request\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbody\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1240\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\http\\client.py\u001b[0m in \u001b[0;36m_send_request\u001b[1;34m(self, method, url, body, headers, encode_chunked)\u001b[0m\n\u001b[0;32m 1284\u001b[0m \u001b[0mbody\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_encode\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'body'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1285\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mendheaders\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbody\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1286\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\http\\client.py\u001b[0m in \u001b[0;36mendheaders\u001b[1;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[0;32m 1233\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mCannotSendHeader\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1234\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_send_output\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmessage_body\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mencode_chunked\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mencode_chunked\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1235\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\http\\client.py\u001b[0m in \u001b[0;36m_send_output\u001b[1;34m(self, message_body, encode_chunked)\u001b[0m\n\u001b[0;32m 1025\u001b[0m \u001b[1;32mdel\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_buffer\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1026\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1027\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\http\\client.py\u001b[0m in \u001b[0;36msend\u001b[1;34m(self, data)\u001b[0m\n\u001b[0;32m 963\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mauto_open\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 964\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 965\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connection.py\u001b[0m in \u001b[0;36mconnect\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 165\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mconnect\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 166\u001b[1;33m \u001b[0mconn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_new_conn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 167\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_prepare_conn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 149\u001b[0m raise NewConnectionError(\n\u001b[1;32m--> 150\u001b[1;33m self, \"Failed to establish a new connection: %s\" % e)\n\u001b[0m\u001b[0;32m 151\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mNewConnectionError\u001b[0m: : Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[1;31mMaxRetryError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\adapters.py\u001b[0m in \u001b[0;36msend\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 439\u001b[0m \u001b[0mretries\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmax_retries\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 440\u001b[1;33m \u001b[0mtimeout\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 441\u001b[0m )\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[1;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, **response_kw)\u001b[0m\n\u001b[0;32m 638\u001b[0m retries = retries.increment(method, url, error=e, _pool=self,\n\u001b[1;32m--> 639\u001b[1;33m _stacktrace=sys.exc_info()[2])\n\u001b[0m\u001b[0;32m 640\u001b[0m \u001b[0mretries\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msleep\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\urllib3\\util\\retry.py\u001b[0m in \u001b[0;36mincrement\u001b[1;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[0;32m 387\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mnew_retry\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_exhausted\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 388\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mMaxRetryError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0m_pool\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0merror\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mResponseError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcause\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 389\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mMaxRetryError\u001b[0m: HTTPConnectionPool(host='localhost', port=59780): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it',))", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[1;31mConnectionError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\plotly\\io\\_orca.py\u001b[0m in \u001b[0;36mto_image\u001b[1;34m(fig, format, width, height, scale, validate)\u001b[0m\n\u001b[0;32m 1300\u001b[0m \u001b[0mwidth\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mwidth\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1301\u001b[1;33m height=height)\n\u001b[0m\u001b[0;32m 1302\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[0mOSError\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\retrying.py\u001b[0m in \u001b[0;36mwrapped_f\u001b[1;34m(*args, **kw)\u001b[0m\n\u001b[0;32m 48\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mwrapped_f\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 49\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mRetrying\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mdargs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mdkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcall\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkw\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 50\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\retrying.py\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self, fn, *args, **kwargs)\u001b[0m\n\u001b[0;32m 211\u001b[0m \u001b[1;31m# get() on an attempt with an exception should cause it to be raised, but raise just in case\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 212\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mattempt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 213\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\retrying.py\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, wrap_exception)\u001b[0m\n\u001b[0;32m 246\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 247\u001b[1;33m \u001b[0msix\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mreraise\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 248\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\six.py\u001b[0m in \u001b[0;36mreraise\u001b[1;34m(tp, value, tb)\u001b[0m\n\u001b[0;32m 692\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwith_traceback\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtb\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 693\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 694\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\retrying.py\u001b[0m in \u001b[0;36mcall\u001b[1;34m(self, fn, *args, **kwargs)\u001b[0m\n\u001b[0;32m 199\u001b[0m \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 200\u001b[1;33m \u001b[0mattempt\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mAttempt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfn\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mattempt_number\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 201\u001b[0m \u001b[1;32mexcept\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\plotly\\io\\_orca.py\u001b[0m in \u001b[0;36mrequest_image_with_retrying\u001b[1;34m(**kwargs)\u001b[0m\n\u001b[0;32m 1207\u001b[0m \u001b[0mjson_str\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdumps\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrequest_params\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mplotly\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mPlotlyJSONEncoder\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1208\u001b[1;33m \u001b[0mresponse\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mrequests\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpost\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mserver_url\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'/'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mjson_str\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1209\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mresponse\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\api.py\u001b[0m in \u001b[0;36mpost\u001b[1;34m(url, data, json, **kwargs)\u001b[0m\n\u001b[0;32m 111\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 112\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mrequest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'post'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdata\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mjson\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 113\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\api.py\u001b[0m in \u001b[0;36mrequest\u001b[1;34m(method, url, **kwargs)\u001b[0m\n\u001b[0;32m 57\u001b[0m \u001b[1;32mwith\u001b[0m \u001b[0msessions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mSession\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0msession\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 58\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0msession\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0murl\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0murl\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 59\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\sessions.py\u001b[0m in \u001b[0;36mrequest\u001b[1;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[0;32m 507\u001b[0m \u001b[0msend_kwargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 508\u001b[1;33m \u001b[0mresp\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mprep\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0msend_kwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 509\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\sessions.py\u001b[0m in \u001b[0;36msend\u001b[1;34m(self, request, **kwargs)\u001b[0m\n\u001b[0;32m 617\u001b[0m \u001b[1;31m# Send the request\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 618\u001b[1;33m \u001b[0mr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0madapter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 619\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\requests\\adapters.py\u001b[0m in \u001b[0;36msend\u001b[1;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[0;32m 507\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 508\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mConnectionError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0me\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 509\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mConnectionError\u001b[0m: HTTPConnectionPool(host='localhost', port=59780): Max retries exceeded with url: / (Caused by NewConnectionError(': Failed to establish a new connection: [WinError 10061] No connection could be made because the target machine actively refused it',))", - "\nDuring handling of the above exception, another exception occurred:\n", - "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# To output to file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mfig\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mheatmaps\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mchildren\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mimg_bytes\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpio\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwrite_image\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfig\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'fig1.png'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mformat\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'png'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m600\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mheight\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m400\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mscale\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;31m# fig = g_profiles\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\plotly\\io\\_orca.py\u001b[0m in \u001b[0;36mwrite_image\u001b[1;34m(fig, file, format, scale, width, height, validate)\u001b[0m\n\u001b[0;32m 1486\u001b[0m \u001b[0mwidth\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mwidth\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1487\u001b[0m \u001b[0mheight\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mheight\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1488\u001b[1;33m validate=validate)\n\u001b[0m\u001b[0;32m 1489\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1490\u001b[0m \u001b[1;31m# Open file\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;32mC:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\plotly\\io\\_orca.py\u001b[0m in \u001b[0;36mto_image\u001b[1;34m(fig, format, width, height, scale, validate)\u001b[0m\n\u001b[0;32m 1316\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1317\u001b[0m \u001b[1;33m{\u001b[0m\u001b[0minfo\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1318\u001b[1;33m \"\"\".format(info=status_str))\n\u001b[0m\u001b[0;32m 1319\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1320\u001b[0m \u001b[1;31m# Reset the status so that if the user tries again, we'll try to\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", - "\u001b[1;31mValueError\u001b[0m: \nFor some reason plotly.py was unable to communicate with the\nlocal orca server process, even though the server process seems to be running.\n\nPlease review the process and connection information below:\n\norca status\n-----------\n state: running\n executable: C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\orca.CMD\n version: 1.1.1\n port: 59780\n pid: 9652\n command: ['C:\\\\Users\\\\z5189959\\\\AppData\\\\Local\\\\Continuum\\\\anaconda3\\\\orca.CMD', 'serve', '-p', '59780', '--plotly', 'C:\\\\Users\\\\z5189959\\\\AppData\\\\Local\\\\Continuum\\\\anaconda3\\\\lib\\\\site-packages\\\\plotly\\\\package_data\\\\plotly.min.js', '--graph-only', '--mathjax', 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js']\n \n\n" - ] - } - ], + "outputs": [], "source": [ "# To output to file\n", - "fig = heatmaps[1].children[1]\n", - "img_bytes = pio.write_image(fig, 'fig1.png',format='png', width=600, height=400, scale=5)\n", + "# fig = heatmaps[1].children[1]\n", + "# img_bytes = pio.write_image(fig, 'fig1.png',format='png', width=600, height=400, scale=5)\n", "\n", "# fig = g_profiles\n", "# img_bytes = pio.write_image(fig, 'fig1.png',format='png', width=600, height=200, scale=5)\n" ] }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T23:02:47.179180Z", + "start_time": "2018-12-03T23:02:46.367273Z" + } + }, + "source": [ + "### Look at time dependance" + ] + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T02:15:40.576573Z", - "start_time": "2018-12-03T02:14:51.251Z" + "end_time": "2018-12-03T23:49:16.581105Z", + "start_time": "2018-12-03T23:49:16.274275Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8a366d02e4564347a5950b0f24c86363", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ + "# Create widgets for selecting site_id\n", + "site_id_title = widgets.HTML(value=\"Filter by site_id:\", )\n", "\n", - "import matplotlib.pyplot as plt\n", - "\n", - "site_id_temp = 'NINEMn0003'\n", - "z_pre = np.array(df_profiles.query(\"site_id=='{}' & profile_type=='prestorm'\".format(site_id_temp)).z.tolist())\n", - "z_post = np.array(df_profiles.query(\"site_id=='{}' & profile_type=='poststorm'\".format(site_id_temp)).z.tolist())\n", - "\n", - "z_diff = z_pre - z_post\n", - "no_nan=[True if not np.isnan(x) else False for x in z_diff]\n", - "\n", - "\n", - "# algo = rpt.Pelt(model=\"rbf\").fit(z_diff[no_nan])\n", + "site_id_select = widgets.Dropdown(\n", + " description='site_id: ',\n", + " value='NARRA0001',\n", + " options=df_profiles.index.get_level_values('site_id').unique()\n", + " .sort_values().tolist())\n", "\n", - "algo = rpt.Binseg(model=\"linear\").fit(signal)\n", + "site_id_impacts = widgets.HTML(value=\"\", )\n", "\n", - "result = algo.predict(pen=100)\n", + "site_id_container = widgets.HBox(children=[\n", + " widgets.VBox(\n", + " children=[site_id_title,\n", + " widgets.HBox(children=[site_id_select])]), site_id_impacts\n", + "])\n", "\n", - "result = [x for x in result if x100:\n", - "# break\n", + " berm_widths.append(berm_width)\n", + " swash_vol_changes.append(swash_vol_change)\n", + " dune_face_vol_changes.append(dune_face_vol_change)\n", + " site_ids_to_plot.append(site_id)\n", + " \n", + " if n>100:\n", + " break\n", "\n", " \n", "\n" @@ -382,562 +414,38 @@ }, { "cell_type": "code", - "execution_count": 95, + "execution_count": null, "metadata": { "ExecuteTime": { "end_time": "2018-12-03T03:12:11.598150Z", "start_time": "2018-12-03T03:12:11.590128Z" } }, - "outputs": [ - { - "data": { - "text/plain": [ - "[0.0,\n", - " 62.0,\n", - " 35.0,\n", - " 53.0,\n", - " 4.0,\n", - " 41.0,\n", - " 31.0,\n", - " 98.0,\n", - " 17.0,\n", - " 103.0,\n", - " 81.0,\n", - " 1.0,\n", - " 31.0,\n", - " 0.0,\n", - " 24.0,\n", - " 35.0,\n", - " 67.0,\n", - " 53.0,\n", - " 77.0,\n", - " 130.0,\n", - " 66.0,\n", - " 89.0,\n", - " 31.0,\n", - " 13.0,\n", - " 41.0,\n", - " 118.0,\n", - " 0.0,\n", - " 29.0,\n", - " 82.0,\n", - " 52.0,\n", - " 84.0,\n", - " 31.0,\n", - " 2.0,\n", - " 43.0,\n", - " 84.0,\n", - " 421.0,\n", - " 29.0,\n", - " 22.0,\n", - " 54.0,\n", - " 150.0,\n", - " 115.0,\n", - " 46.0,\n", - " 29.0,\n", - " 86.0,\n", - " 103.0,\n", - " 82.0,\n", - " 77.0,\n", - " 50.0,\n", - " 104.0,\n", - " 81.0,\n", - " 67.0,\n", - " 81.0,\n", - " 141.0,\n", - " 64.0,\n", - " 17.0,\n", - " 95.0,\n", - " 46.0,\n", - " 80.0,\n", - " 77.0,\n", - " 4.0,\n", - " 159.0,\n", - " 115.0,\n", - " 33.0,\n", - " 13.0,\n", - " 46.0,\n", - " 110.0,\n", - " 162.0,\n", - " 16.0,\n", - " 77.0,\n", - " 77.0,\n", - " 86.0,\n", - " 46.0,\n", - " 6.0,\n", - " 42.0,\n", - " 77.0,\n", - " 89.0,\n", - " 29.0,\n", - " 172.0,\n", - " 68.0,\n", - " 204.0,\n", - " 8.0,\n", - " 13.0,\n", - " 78.0,\n", - " 0.0,\n", - " 81.0,\n", - " 156.0,\n", - " 57.0,\n", - " 0.0,\n", - " 62.0,\n", - " 46.0,\n", - " 37.0,\n", - " 52.0,\n", - " 310.0,\n", - " 287.0,\n", - " 4.0,\n", - " 89.0,\n", - " 2.0,\n", - " 22.0,\n", - " 31.0,\n", - " 20.0,\n", - " 45.0,\n", - " 54.0,\n", - " 46.0,\n", - " 43.0,\n", - " 0.0,\n", - " 89.0,\n", - " 122.0,\n", - " 5.0,\n", - " 46.0,\n", - " 24.0,\n", - " 0.0,\n", - " 77.0,\n", - " 51.0,\n", - " 0.0,\n", - " 43.0,\n", - " 53.0,\n", - " 151.0,\n", - " 52.0,\n", - " 29.0,\n", - " 103.0,\n", - " 35.0,\n", - " 68.0,\n", - " 17.0,\n", - " 29.0,\n", - " 34.0,\n", - " 211.0,\n", - " 55.0,\n", - " 85.0,\n", - " 21.0,\n", - " 14.0,\n", - " 103.0,\n", - " 227.0,\n", - " 208.0,\n", - " 78.0,\n", - " 43.0,\n", - " 17.0,\n", - " 104.0,\n", - " 50.0,\n", - " 37.0,\n", - " 54.0,\n", - " 78.0,\n", - " 349.0,\n", - " 80.0,\n", - " 49.0,\n", - " 29.0,\n", - " 17.0,\n", - " 82.0,\n", - " 91.0,\n", - " 1.0,\n", - " 75.0,\n", - " 46.0,\n", - " 210.0,\n", - " 205.0,\n", - " 16.0,\n", - " 35.0,\n", - " 82.0,\n", - " 49.0,\n", - " 0.0,\n", - " 29.0,\n", - " 58.0,\n", - " 57.0,\n", - " 103.0,\n", - " 29.0,\n", - " 0.0,\n", - " 46.0,\n", - " 48.0,\n", - " 1.0,\n", - " 17.0,\n", - " 48.0,\n", - " 29.0,\n", - " 17.0,\n", - " 165.0,\n", - " 45.0,\n", - " 17.0,\n", - " 426.0,\n", - " 30.0]" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [] }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 72, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T03:31:19.534072Z", - "start_time": "2018-12-03T03:31:19.439822Z" + "end_time": "2018-12-05T05:03:39.147413Z", + "start_time": "2018-12-05T05:03:39.070207Z" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "01b5e4786fd44414a38db9266df25a12", + "model_id": "225855bac0d0464d9be74917812c19ac", "version_major": 2, "version_minor": 0 }, - "text/html": [ - "

Failed to display Jupyter Widget of type FigureWidget.

\n", - "

\n", - " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", - " that the widgets JavaScript is still loading. If this message persists, it\n", - " likely means that the widgets JavaScript library is either not installed or\n", - " not enabled. See the Jupyter\n", - " Widgets Documentation for setup instructions.\n", - "

\n", - "

\n", - " If you're reading this message in another frontend (for example, a static\n", - " rendering on GitHub or NBViewer),\n", - " it may mean that your frontend doesn't currently support widgets.\n", - "

\n" - ], "text/plain": [ "FigureWidget({\n", - " 'data': [{'marker': {'color': [0.6740000000000004, -0.262, 0.5449999999999999,\n", - " 0.35399999999999965, 0.3929999999999998,\n", - " 0.35399999999999965, 0.6699999999999999,\n", - " -0.22799999999999976, 1.0739999999999998,\n", - " -0.125, 0.35199999999999987, 0.5299999999999998,\n", - " 0.4109999999999996, -0.1120000000000001,\n", - " 0.9180000000000001, 0.621, -0.3579999999999992,\n", - " -0.20699999999999985, -0.48400000000000043,\n", - " 0.5430000000000001, -0.09600000000000053,\n", - " -0.41700000000000026, 0.4340000000000006,\n", - " 0.7559999999999998, 0.8720000000000003,\n", - " -0.5759999999999996, 0.5119999999999996,\n", - " 0.6440000000000001, 0.395, 0.09300000000000042,\n", - " 0.923, 0.4339999999999997, 0.5429999999999993,\n", - " -0.09699999999999998, -0.20899999999999963,\n", - " -0.8130000000000002, 0.706, 0.36399999999999944,\n", - " 0.34099999999999975, -0.08499999999999996,\n", - " 0.21799999999999953, 0.6240000000000006,\n", - " -0.16700000000000026, -0.278,\n", - " -0.5110000000000001, 0.726,\n", - " -0.35199999999999987, 0.13100000000000023,\n", - " -0.3440000000000003, 0.6760000000000002,\n", - " -0.5719999999999996, -0.4980000000000002,\n", - " -0.2020000000000004, 0.34199999999999964,\n", - " 0.41999999999999993, 0.5800000000000001,\n", - " 0.7200000000000002, 0.6230000000000002,\n", - " -0.49100000000000055, 0.11499999999999977,\n", - " -0.242, -0.6240000000000006, 0.9500000000000002,\n", - " 1.2479999999999998, 1.2889999999999997,\n", - " 0.021999999999999797, -0.3200000000000003,\n", - " 0.7829999999999999, -0.32899999999999974,\n", - " 0.3389999999999995, -0.01599999999999957,\n", - " 0.38399999999999945, -0.04599999999999982,\n", - " 0.4849999999999999, 0.02499999999999991,\n", - " -0.7749999999999999, 0.617,\n", - " -0.06500000000000039, 0.5589999999999997,\n", - " -0.1299999999999999, -0.0040000000000000036,\n", - " 1.298, 0.05500000000000016, 0.9689999999999999,\n", - " -0.28800000000000026, -0.09700000000000042,\n", - " -0.03100000000000014, 0.7960000000000003,\n", - " 0.33599999999999985, 0.28900000000000015, 0.798,\n", - " -0.05900000000000016, -0.0029999999999996696,\n", - " -0.15399999999999991, 0.31999999999999984,\n", - " -0.613, 0.2650000000000001, 0.258, 1.513,\n", - " 0.36199999999999966, 0.7849999999999997,\n", - " -0.28900000000000015, 1.0290000000000004,\n", - " 0.8260000000000005, -0.03799999999999981,\n", - " -0.21300000000000008, -0.492,\n", - " 1.6029999999999998, 0.5699999999999998,\n", - " 0.9300000000000002, 0.0389999999999997,\n", - " -0.3110000000000004, 1.0070000000000001,\n", - " 0.11500000000000021, 0.7269999999999999,\n", - " 0.30100000000000016, -0.5180000000000002,\n", - " 0.40600000000000014, 0.1389999999999998,\n", - " -0.08299999999999974, 1.174,\n", - " -0.29300000000000015, 0.036000000000000476,\n", - " 0.702, 0.49099999999999966, 0.27400000000000047,\n", - " 0.6890000000000005, 0.46199999999999974,\n", - " 0.7839999999999998, 0.2939999999999996,\n", - " 0.013000000000000345, -0.09400000000000075,\n", - " 0.022999999999999687, -0.6230000000000002,\n", - " 0.9040000000000004, 0.027000000000000135,\n", - " -0.1280000000000001, 0.25, 0.488,\n", - " -0.1200000000000001, 0.43599999999999994,\n", - " 0.04999999999999982, 0.11599999999999966,\n", - " 1.5290000000000001, 1.0189999999999997,\n", - " 0.5780000000000003, -0.4969999999999999,\n", - " -0.39800000000000013, 0.6430000000000002,\n", - " -0.04500000000000037, -0.40700000000000003,\n", - " 0.07000000000000028, -0.18599999999999994,\n", - " 1.4900000000000002, 0.2889999999999997,\n", - " -0.3719999999999999, 0.1519999999999997,\n", - " 0.10899999999999999, -0.3700000000000001,\n", - " 0.7320000000000002, -0.238,\n", - " -0.08900000000000041, 0.20699999999999985,\n", - " 0.9870000000000001, 1.9829999999999997,\n", - " 0.6460000000000004, 0.06100000000000039,\n", - " 0.06300000000000017, -0.03500000000000014,\n", - " 0.5730000000000004, 0.7640000000000002,\n", - " -0.7690000000000006, 0.5750000000000002,\n", - " 1.4529999999999998, 0.07500000000000018, 0.649],\n", - " 'colorscale': 'Viridis',\n", - " 'showscale': True,\n", - " 'size': 4},\n", + " 'data': [{'marker': {'size': 4},\n", " 'mode': 'markers',\n", - " 'text': [0.6740000000000004
STOCS0025, -0.262
NINEMn0049,\n", - " 0.5449999999999999
NINEMn0043,\n", - " 0.35399999999999965
LHOUSEn0056,\n", - " 0.3929999999999998
CRESn0120,\n", - " 0.35399999999999965
BOOM0008,\n", - " 0.6699999999999999
NINEMn0028,\n", - " -0.22799999999999976
DIAMONDn0028,\n", - " 1.0739999999999998
NINEMs0019, -0.125
DUNBn0032,\n", - " 0.35199999999999987
DUNBn0048,\n", - " 0.5299999999999998
MANNING0076,\n", - " 0.4109999999999996
DIAMONDn0014,\n", - " -0.1120000000000001
NARRA0008,\n", - " 0.9180000000000001
NINEMn0036, 0.621
BILG0005,\n", - " -0.3579999999999992
CRESn0085,\n", - " -0.20699999999999985
SWRO0009,\n", - " -0.48400000000000043
NINEMs0027,\n", - " 0.5430000000000001
NINEMs0012,\n", - " -0.09600000000000053
ONEMILE0006,\n", - " -0.41700000000000026
CRESn0066,\n", - " 0.4340000000000006
NINEMn0018,\n", - " 0.7559999999999998
DUNBn0033,\n", - " 0.8720000000000003
NINEMs0036,\n", - " -0.5759999999999996
ENTRA0074,\n", - " 0.5119999999999996
NINEMn0037,\n", - " 0.6440000000000001
DUNBn0035, 0.395
CRESn0103,\n", - " 0.09300000000000042
NINEMs0038, 0.923
MONA0011,\n", - " 0.4339999999999997
STUART0041,\n", - " 0.5429999999999993
NAMB0070,\n", - " -0.09699999999999998
NINEMs0013,\n", - " -0.20899999999999963
NINEMs0047,\n", - " -0.8130000000000002
NINEMs0057, 0.706
NINEMn0053,\n", - " 0.36399999999999944
NINEMn0052,\n", - " 0.34099999999999975
ENTRA0067,\n", - " -0.08499999999999996
NINEMs0014,\n", - " 0.21799999999999953
STOCNn0047,\n", - " 0.6240000000000006
ENTRA0073,\n", - " -0.16700000000000026
NINEMs0001, -0.278
NINEMn0042,\n", - " -0.5110000000000001
ONEMILE0003, 0.726
GRANTSs0002,\n", - " -0.35199999999999987
NSHORE_n0021,\n", - " 0.13100000000000023
AVOCAn0008,\n", - " -0.3440000000000003
ENTRA0069,\n", - " 0.6760000000000002
NINEMs0032,\n", - " -0.5719999999999996
NINEMs0048,\n", - " -0.4980000000000002
CRESn0105,\n", - " -0.2020000000000004
NINEMs0031,\n", - " 0.34199999999999964
DUNBn0047,\n", - " 0.41999999999999993
STUART0050,\n", - " 0.5800000000000001
BLUEYS0004,\n", - " 0.7200000000000002
SWRO0006,\n", - " 0.6230000000000002
NINEMs0044,\n", - " -0.49100000000000055
NINEMs0020,\n", - " 0.11499999999999977
NINEMs0039, -0.242
SWRO0010,\n", - " -0.6240000000000006
NINEMn0047,\n", - " 0.9500000000000002
NAMB0068,\n", - " 1.2479999999999998
OLDBAR0025,\n", - " 1.2889999999999997
MANNING0094,\n", - " 0.021999999999999797
NINEMs0005,\n", - " -0.3200000000000003
ONEMILE0010,\n", - " 0.7829999999999999
GRANTSn0018,\n", - " -0.32899999999999974
NINEMs0028,\n", - " 0.3389999999999995
NSHORE_n0031,\n", - " -0.01599999999999957
WAMBE0012,\n", - " 0.38399999999999945
NARRA0024,\n", - " -0.04599999999999982
ONEMILE0002,\n", - " 0.4849999999999999
LHOUSE0006,\n", - " 0.02499999999999991
WAMBE0014,\n", - " -0.7749999999999999
DIAMONDn0013, 0.617
DIAMONDn0034,\n", - " -0.06500000000000039
ELIZA0005,\n", - " 0.5589999999999997
OLDBAR0023,\n", - " -0.1299999999999999
ENTRA0046,\n", - " -0.0040000000000000036
DIAMONDn0039, 1.298
NINEMs0040,\n", - " 0.05500000000000016
NINEMs0017,\n", - " 0.9689999999999999
NINEMn0051,\n", - " -0.28800000000000026
CATHIE0012,\n", - " -0.09700000000000042
NAMB0059,\n", - " -0.03100000000000014
CRESn0112,\n", - " 0.7960000000000003
STOCS0015,\n", - " 0.33599999999999985
LHOUSEn0028,\n", - " 0.28900000000000015
NINEMs0003, 0.798
STUART0045,\n", - " -0.05900000000000016
WAMBE0013,\n", - " -0.0029999999999996696
NINEMs0018,\n", - " -0.15399999999999991
BLUEYS0002,\n", - " 0.31999999999999984
NINEMs0011, -0.613
STUART0036,\n", - " 0.2650000000000001
ELIZA0003, 0.258
NARRA0020,\n", - " 1.513
NSHORE_n0028, 0.36199999999999966
ELIZA0007,\n", - " 0.7849999999999997
STOCNn0010,\n", - " -0.28900000000000015
STUART0058,\n", - " 1.0290000000000004
STOCNn0008,\n", - " 0.8260000000000005
STOCS0002,\n", - " -0.03799999999999981
NINEMs0026,\n", - " -0.21300000000000008
WAMBE0009, -0.492
MONA0009,\n", - " 1.6029999999999998
NARRA0022,\n", - " 0.5699999999999998
OLDBAR0021,\n", - " 0.9300000000000002
NSHORE_n0029,\n", - " 0.0389999999999997
ONEMILE0008,\n", - " -0.3110000000000004
LHOUSEn0042,\n", - " 1.0070000000000001
NARRA0021,\n", - " 0.11500000000000021
STOCS0029,\n", - " 0.7269999999999999
BLUEYS0001,\n", - " 0.30100000000000016
BOOM0009,\n", - " -0.5180000000000002
MANNING0042,\n", - " 0.40600000000000014
NINEMn0046,\n", - " 0.1389999999999998
LHOUSEn0069,\n", - " -0.08299999999999974
STOCNs0192, 1.174
ENTRA0065,\n", - " -0.29300000000000015
LHOUSEn0025,\n", - " 0.036000000000000476
NINEMs0007, 0.702
GRANTSn0013,\n", - " 0.49099999999999966
MANNING0095,\n", - " 0.27400000000000047
NINEMs0043,\n", - " 0.6890000000000005
ENTRA0070,\n", - " 0.46199999999999974
LHOUSEn0059,\n", - " 0.7839999999999998
LHOUSEn0057,\n", - " 0.2939999999999996
NINEMs0029,\n", - " 0.013000000000000345
LHOUSEn0030,\n", - " -0.09400000000000075
NINEMs0008,\n", - " 0.022999999999999687
MANNING0092,\n", - " -0.6230000000000002
MONA0012,\n", - " 0.9040000000000004
NSHORE_n0026,\n", - " 0.027000000000000135
DIAMONDn0030,\n", - " -0.1280000000000001
MANNING0091, 0.25
STUART0043,\n", - " 0.488
NSHORE_n0020, -0.1200000000000001
ELIZA0004,\n", - " 0.43599999999999994
SWRO0005,\n", - " 0.04999999999999982
HARR0050,\n", - " 0.11599999999999966
FOST0001,\n", - " 1.5290000000000001
STOCS0008,\n", - " 1.0189999999999997
NARRA0009,\n", - " 0.5780000000000003
STUART0037,\n", - " -0.4969999999999999
STUART0033,\n", - " -0.39800000000000013
STUART0046,\n", - " 0.6430000000000002
FOST0004,\n", - " -0.04500000000000037
SWRO0001,\n", - " -0.40700000000000003
NINEMn0054,\n", - " 0.07000000000000028
STOCNs0069,\n", - " -0.18599999999999994
STOCNn0004,\n", - " 1.4900000000000002
MANNING0084,\n", - " 0.2889999999999997
STUART0040,\n", - " -0.3719999999999999
NAMB0048,\n", - " 0.1519999999999997
BOOM0007,\n", - " 0.10899999999999999
NINEMn0034,\n", - " -0.3700000000000001
ONEMILE0001,\n", - " 0.7320000000000002
ENTRA0075, -0.238
STOCNn0011,\n", - " -0.08900000000000041
DIAMONDn0021,\n", - " 0.20699999999999985
LHOUSEn0060,\n", - " 0.9870000000000001
CRESn0064,\n", - " 1.9829999999999997
NARRA0007,\n", - " 0.6460000000000004
MANNING0073,\n", - " 0.06100000000000039
ONEMILE0005,\n", - " 0.06300000000000017
NINEMs0037,\n", - " -0.03500000000000014
LHOUSEn0061,\n", - " 0.5730000000000004
NINEMn0040,\n", - " 0.7640000000000002
AVOCAn0005,\n", - " -0.7690000000000006
STOCNn0041,\n", - " 0.5750000000000002
ELIZA0006,\n", - " 1.4529999999999998
ENTRA0072,\n", - " 0.07500000000000018
MANNING0082, 0.649
LHOUSEn0029],\n", - " 'type': 'scatter',\n", - " 'uid': 'bdcb15ca-50ce-42b2-8441-134aec09d1a6',\n", - " 'x': [0.0, 62.0, 35.0, 53.0, 4.0, 41.0, 31.0, 98.0, 17.0, 103.0,\n", - " 81.0, 1.0, 31.0, 0.0, 24.0, 35.0, 67.0, 53.0, 77.0, 130.0,\n", - " 66.0, 89.0, 31.0, 13.0, 41.0, 118.0, 0.0, 29.0, 82.0, 52.0,\n", - " 84.0, 31.0, 2.0, 43.0, 84.0, 421.0, 29.0, 22.0, 54.0, 150.0,\n", - " 115.0, 46.0, 29.0, 86.0, 103.0, 82.0, 77.0, 50.0, 104.0, 81.0,\n", - " 67.0, 81.0, 141.0, 64.0, 17.0, 95.0, 46.0, 80.0, 77.0, 4.0,\n", - " 159.0, 115.0, 33.0, 13.0, 46.0, 110.0, 162.0, 16.0, 77.0, 77.0,\n", - " 86.0, 46.0, 6.0, 42.0, 77.0, 89.0, 29.0, 172.0, 68.0, 204.0,\n", - " 8.0, 13.0, 78.0, 0.0, 81.0, 156.0, 57.0, 0.0, 62.0, 46.0, 37.0,\n", - " 52.0, 310.0, 287.0, 4.0, 89.0, 2.0, 22.0, 31.0, 20.0, 45.0,\n", - " 54.0, 46.0, 43.0, 0.0, 89.0, 122.0, 5.0, 46.0, 24.0, 0.0, 77.0,\n", - " 51.0, 0.0, 43.0, 53.0, 151.0, 52.0, 29.0, 103.0, 35.0, 68.0,\n", - " 17.0, 29.0, 34.0, 211.0, 55.0, 85.0, 21.0, 14.0, 103.0, 227.0,\n", - " 208.0, 78.0, 43.0, 17.0, 104.0, 50.0, 37.0, 54.0, 78.0, 349.0,\n", - " 80.0, 49.0, 29.0, 17.0, 82.0, 91.0, 1.0, 75.0, 46.0, 210.0,\n", - " 205.0, 16.0, 35.0, 82.0, 49.0, 0.0, 29.0, 58.0, 57.0, 103.0,\n", - " 29.0, 0.0, 46.0, 48.0, 1.0, 17.0, 48.0, 29.0, 17.0, 165.0,\n", - " 45.0, 17.0, 426.0, 30.0],\n", - " 'y': [15.057260981886461, 50.48600703337221, 52.22661963845738,\n", - " 49.87527193413516, 60.378091629296, 44.69467666268621,\n", - " 33.08824662372501, 69.24966143957133, 46.3983426493909,\n", - " 55.66269386408765, 50.5038685904488, 38.24722379458162,\n", - " 48.77392309821484, 34.42678889134076, 32.339772440128606,\n", - " 28.13518326624829, 54.01652317900755, 51.57523510716254,\n", - " 59.03553546603745, 52.45400614301138, 62.599820358965985,\n", - " 70.4542638944535, 24.852993645288876, 38.001197477131235,\n", - " 31.316631841848864, 64.57753852853112, 17.65164087230827,\n", - " 27.89358334754175, 61.85947610858759, 63.58558665629535,\n", - " 52.707965993289484, 54.59027355785616, 53.4369169941986,\n", - " 36.53074365372308, 60.662690901453374, 93.01545825805395,\n", - " 21.321395510574977, 47.03420447676251, 44.784472634287866,\n", - " 67.77932649819007, 77.67132854981324, 49.702151674694086,\n", - " 57.01843446390366, 57.55836238002917, 60.0758110522641,\n", - " 32.33715180121005, 57.2927341040066, 53.685587497734865,\n", - " 77.02236536546766, 46.43886428194846, 74.93504091748079,\n", - " 60.06724901876906, 77.03905086279573, 30.912726190943072,\n", - " 54.53170249189508, 53.70339057156003, 22.441638077872113,\n", - " 54.791537795661974, 62.13997820476877, 29.40727911432272,\n", - " 82.18692443832771, 61.97015902384305, 42.77787059874549,\n", - " 47.91815920377601, 52.11069344547651, 49.79396221773086,\n", - " 73.9414412498821, 37.876215036107936, 57.13461030091145,\n", - " 37.3514512031067, 59.923715953669195, 25.866493800185477,\n", - " 45.53280065268179, 27.02215306756141, 81.15248906718988,\n", - " 71.51536479781095, 45.97756678228884, 69.86050918469093,\n", - " 49.48043946500161, 57.899970620410635, 37.74710860574265,\n", - " 34.57820959659622, 55.62901703497036, 31.875858999358044,\n", - " 62.34650424255848, 73.60708709493487, 50.53187039062722,\n", - " 19.918164614381215, 41.9039188222106, 74.10573605782186,\n", - " 42.98820404001569, 70.89929008060581, 91.11150252345915,\n", - " 103.92435818263927, 25.781875086423824, 65.08855861060485,\n", - " 32.16685072172824, 26.3774436608266, 49.37115355443433,\n", - " 19.700396999896146, 45.0105834352614, 46.43117556836857,\n", - " 25.19648137654068, 58.46871157481417, 16.8505048443866,\n", - " 75.37390874203606, 68.1773833511795, 14.320950372734673,\n", - " 46.84538149567382, 51.48000161377281, 53.437015226686775,\n", - " 45.40805859249032, 40.76201971776089, 50.89636554048608,\n", - " 57.403293218019435, 54.46366012058966, 64.73300675848911,\n", - " 55.16180585094216, 41.57191993591717, 63.75449963841763,\n", - " 35.469027712428435, 56.59236212355033, 31.326546007774674,\n", - " 37.03650824212717, 31.520950268291358, 58.44841826927378,\n", - " 46.28021033720412, 54.90788208817708, 29.509983621209795,\n", - " 34.0063988459262, 64.86742099649922, 59.221944976590606,\n", - " 74.9874011223268, 55.207330372211956, 26.000385560413722,\n", - " 39.945013530743594, 37.27891136273222, 59.478825901465555,\n", - " 57.3560107484194, 57.08482809741879, 24.933290176259288,\n", - " 88.35412756202288, 42.25595601431678, 56.81861249472931,\n", - " 32.63000580753741, 36.79710517558988, 58.3621888814069,\n", - " 70.12310930216574, 34.01482594371291, 58.839577879424155,\n", - " 55.252330933788805, 78.22085308306589, 59.782634298874065,\n", - " 28.36317684006946, 43.8967970926609, 47.27816880026671,\n", - " 21.722947051488013, 19.58764895174499, 38.591489138007844,\n", - " 50.57685864743641, 63.74425935533099, 82.20046361640517,\n", - " 44.20822435998208, 26.438775903302503, 50.05321159752885,\n", - " 54.12827133882625, 24.70991457046442, 60.9358370882951,\n", - " 54.14071472699229, 27.848684395204568, 52.36273443570386,\n", - " 71.01829280596758, 46.862832006518445, 15.790885970513834,\n", - " 89.42388399872287, 53.47096959758166]}],\n", - " 'layout': {'title': 'Dune Collision Protection',\n", - " 'xaxis': {'autorange': True, 'showgrid': True, 'showline': True, 'title': 'Exposed time', 'zeroline': True},\n", - " 'yaxis': {'autorange': True,\n", - " 'showgrid': True,\n", - " 'showline': True,\n", - " 'title': 'Collision protection volume',\n", - " 'zeroline': True}}\n", - "})" + " 'text': [-0…" ] }, "metadata": {}, @@ -946,18 +454,18 @@ ], "source": [ "trace1 = go.Scatter(\n", - " x=[x.total_seconds() / 60 / 60 for x in exposed_times],\n", - " y=vols,\n", - " text = ['{}
{}'.format(ele, site_id) for ele,site_id in zip(toe_ele_changes,site_ids)],\n", + " x=berm_widths,\n", + " y=dune_face_vol_changes,\n", + " text = ['{}
{}'.format(ele, site_id) for ele,site_id in zip(toe_ele_changes,site_ids_to_plot)],\n", " mode='markers',\n", " marker=dict(\n", " size=4,\n", "# color = [-1 if x<0 else 1 for x in toe_ele_changes],\n", - " color = toe_ele_changes,\n", - "# color = wave_powers,\n", + "# color = toe_ele_changes,\n", + "# color = dune_face_vol_changes,\n", "# color = [x.total_seconds() / 60 / 60 for x in exposed_times],\n", - " colorscale='Viridis',\n", - " showscale=True\n", + "# colorscale='Viridis',\n", + "# showscale=True\n", " ))\n", "\n", "layout = go.Layout(\n", @@ -966,14 +474,14 @@ "# legend=dict(font={'size': 10}),\n", "# margin=dict(t=50, b=50, l=50, r=20),\n", " xaxis=dict(\n", - " title='Exposed time',\n", + " title='Berm width',\n", " autorange=True,\n", " showgrid=True,\n", " zeroline=True,\n", " showline=True,\n", " ),\n", " yaxis=dict(\n", - " title='Collision protection volume',\n", + " title='Dune face vol change',\n", " autorange=True,\n", " showgrid=True,\n", " zeroline=True,\n", @@ -983,6 +491,74 @@ "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", "g_plot" ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T03:15:46.517975Z", + "start_time": "2018-12-05T03:15:46.512936Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[64.5799,\n", + " 21.0163,\n", + " 38.106,\n", + " 28.101,\n", + " 58.7247,\n", + " 33.5534,\n", + " 71.1675,\n", + " 52.6043,\n", + " 50.5765,\n", + " 39.9074,\n", + " 67.8385,\n", + " 43.9043,\n", + " 39.8181,\n", + " 37.7153,\n", + " 20.4454,\n", + " 39.7757,\n", + " 42.1843,\n", + " 33.6152,\n", + " 42.9587,\n", + " 39.9773,\n", + " 35.7835,\n", + " 31.2884,\n", + " -0.4618,\n", + " 31.0094,\n", + " 33.3479,\n", + " 47.8394,\n", + " 32.3566,\n", + " 36.5205,\n", + " 45.7109,\n", + " 16.0687,\n", + " 35.4375,\n", + " 43.327,\n", + " 53.5016,\n", + " 31.0357,\n", + " 47.6528,\n", + " 25.5658,\n", + " 41.0514,\n", + " 28.1645,\n", + " 44.5443,\n", + " 42.925,\n", + " 33.9535,\n", + " 36.2626,\n", + " 35.2536]" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# impacts['observed']\n", + "swash_vol_changes" + ] } ], "metadata": { @@ -1001,7 +577,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.4" + "version": "3.6.7" }, "toc": { "base_numbering": 1, @@ -1014,7 +590,7 @@ "toc_cell": false, "toc_position": {}, "toc_section_display": true, - "toc_window_display": false + "toc_window_display": true }, "varInspector": { "cols": { diff --git a/notebooks/03_dune_to_vs_runup.ipynb b/notebooks/03_dune_to_vs_runup.ipynb index 9673fcb..b99ab01 100644 --- a/notebooks/03_dune_to_vs_runup.ipynb +++ b/notebooks/03_dune_to_vs_runup.ipynb @@ -12,8 +12,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T03:38:44.538853Z", - "start_time": "2018-12-03T03:38:44.189514Z" + "end_time": "2018-12-03T23:04:57.331037Z", + "start_time": "2018-12-03T23:04:57.006071Z" } }, "outputs": [], @@ -28,8 +28,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T03:38:46.213387Z", - "start_time": "2018-12-03T03:38:44.781382Z" + "end_time": "2018-12-03T23:04:58.749827Z", + "start_time": "2018-12-03T23:04:57.333943Z" } }, "outputs": [], @@ -61,8 +61,8 @@ "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T03:38:53.297184Z", - "start_time": "2018-12-03T03:38:46.365829Z" + "end_time": "2018-12-03T23:05:05.800496Z", + "start_time": "2018-12-03T23:04:58.751721Z" } }, "outputs": [ @@ -77,7 +77,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", + "C:\\Users\\z5189959\\Desktop\\nsw-2016-storm-impact\\.venv\\lib\\site-packages\\numpy\\lib\\arraysetops.py:522: FutureWarning:\n", "\n", "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", "\n" @@ -127,162 +127,158 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Compare underpredicted cases" + "### Compare predicted R_high with D_low\n", + "Let's see what the distribution of R_high is compared with D_low. How far off are the predicted water levels compared with the dune toes?" ] }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 29, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T04:05:30.984007Z", - "start_time": "2018-12-03T04:05:30.805508Z" + "end_time": "2018-12-04T02:20:58.446500Z", + "start_time": "2018-12-04T02:20:58.439480Z" + } + }, + "outputs": [], + "source": [ + "def get_site_ids(df_forecasted, df_observed, forecasted_regime, observed_regime):\n", + " \"\"\"\n", + " Returns list of site_ids which match the given forecasted and observed regime\n", + " \"\"\"\n", + " set1 = set(df_forecasted.query(\"storm_regime == '{}'\".format(\n", + " forecasted_regime)).index.get_level_values('site_id'))\n", + " set2 = set(df_observed.query(\"storm_regime == '{}'\".format(\n", + " observed_regime)).index.get_level_values('site_id'))\n", + " return sorted(list(set1.intersection(set2)))\n", + "\n", + "\n", + "def get_R_high_D_low_diff(site_ids, df_profile_features, df_twls):\n", + " \"\"\"\n", + " Returns a dataframe of the difference between the R_high and D_low differences. \n", + " Positive values indicate R_high is larger than D_low.\n", + " \"\"\"\n", + " # Get dune toes at these sites and predicted max R_high\n", + " df_toes = df_profile_features.loc[site_ids].query(\n", + " 'profile_type==\"prestorm\"').dune_toe_z\n", + " df_R_highs = df_twls.loc[site_ids].groupby('site_id')['R_high'].max()\n", + "\n", + " # Join into one dataframe\n", + " df_twl_toes = pd.concat([df_toes, df_R_highs], axis=1, sort=True)\n", + " df_twl_toes['diff'] = df_twl_toes['R_high'] - df_twl_toes['dune_toe_z']\n", + " return df_twl_toes['diff']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-04T03:55:51.858020Z", + "start_time": "2018-12-04T03:55:50.879155Z" } }, "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", - "
dune_toe_zR_highdiff
AVOCAn00053.3063.260440-0.045560
AVOCAn00083.5073.220084-0.286916
BILG00054.8073.293445-1.513555
BLUEYS00013.0642.800144-0.263856
BLUEYS00022.9292.470641-0.458359
\n", - "
" - ], + "application/vnd.jupyter.widget-view+json": { + "model_id": "94883b85733444528fe8a73379ce4611", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - " dune_toe_z R_high diff\n", - "AVOCAn0005 3.306 3.260440 -0.045560\n", - "AVOCAn0008 3.507 3.220084 -0.286916\n", - "BILG0005 4.807 3.293445 -1.513555\n", - "BLUEYS0001 3.064 2.800144 -0.263856\n", - "BLUEYS0002 2.929 2.470641 -0.458359" + "FigureWidget({\n", + " 'data': [{'marker': {'color': '#ef8a62'},\n", + " 'name': 'Overpredicted',\n", + " …" ] }, - "execution_count": 39, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "# Find site_ids where the forecast has been underpredicted\n", - "set1 = set(impacts['forecasted']['mean_slope_sto06'].query(\"storm_regime == 'swash'\").index.get_level_values('site_id'))\n", - "set2 = set(impacts['observed'].query(\"storm_regime == 'collision'\").index.get_level_values('site_id'))\n", - "site_ids = list(set1.intersection(set2))\n", - "\n", - "# Get dune toes at these sites and predicted max R_high\n", - "df_toes = df_profile_features.loc[site_ids].query('profile_type==\"prestorm\"').dune_toe_z\n", - "df_R_highs = twls['forecasted']['mean_slope_sto06'].loc[site_ids].groupby('site_id')['R_high'].max()\n", - "\n", - "# Join into one dataframe\n", - "df_twl_toes = pd.concat([df_toes, df_R_highs],axis=1,sort=True)\n", - "df_twl_toes['diff'] = df_twl_toes['R_high'] - df_twl_toes['dune_toe_z']\n", - "df_twl_toes.head()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now let's plot the comparison between our R_high TWL values and the dune toes to see how far off they were." + "swash_overpredicted_site_ids = get_site_ids(df_forecasted=impacts['forecasted']['mean_slope_sto06'],\n", + " df_observed=impacts['observed'],\n", + " forecasted_regime='collision',\n", + " observed_regime='swash')\n", + "swash_overpredicted_diffs = get_R_high_D_low_diff(site_ids=swash_overpredicted_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])\n", + "\n", + "swash_correct_site_ids = get_site_ids(df_forecasted=impacts['forecasted']['mean_slope_sto06'],\n", + " df_observed=impacts['observed'],\n", + " forecasted_regime='swash',\n", + " observed_regime='swash')\n", + "swash_correct_diffs = get_R_high_D_low_diff(site_ids=swash_correct_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])\n", + "\n", + "\n", + "trace1 = go.Histogram(y=swash_correct_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Correctly predicted',\n", + " marker=dict(\n", + " color='#67a9cf',\n", + " ),\n", + " ybins=dict(\n", + " size=0.1\n", + "),)\n", + "trace2 = go.Histogram(y=swash_overpredicted_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Overpredicted',\n", + " marker=dict(\n", + " color='#ef8a62',\n", + "),\n", + " ybins=dict(\n", + " size=0.1\n", + "),)\n", + "\n", + "layout = go.Layout(\n", + " title='R_high - D_low
Swash Regime',\n", + " barmode='overlay',\n", + " yaxis=dict(\n", + " title='z (m AHD)'\n", + " ),\n", + " xaxis=dict(\n", + " title='Count'\n", + " ),\n", + " bargap=0.2,\n", + " bargroupgap=0.1,\n", + " legend=dict(x=.6, y=1)\n", + ")\n", + "\n", + "g_plot_swash = go.FigureWidget(data=[trace2, trace1], layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(g_plot_swash, 'g_plot_swash.png',format='png', width=600, height=400, scale=5)\n", + "\n", + "g_plot_swash\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 54, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T04:08:15.732169Z", - "start_time": "2018-12-03T04:08:15.656966Z" + "end_time": "2018-12-04T04:10:47.339268Z", + "start_time": "2018-12-04T04:10:45.796887Z" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "35b9331242af473dba2f91761c307022", + "model_id": "3933da9295fe446f9413bca8842100c2", "version_major": 2, "version_minor": 0 }, - "text/html": [ - "

Failed to display Jupyter Widget of type FigureWidget.

\n", - "

\n", - " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", - " that the widgets JavaScript is still loading. If this message persists, it\n", - " likely means that the widgets JavaScript library is either not installed or\n", - " not enabled. See the Jupyter\n", - " Widgets Documentation for setup instructions.\n", - "

\n", - "

\n", - " If you're reading this message in another frontend (for example, a static\n", - " rendering on GitHub or NBViewer),\n", - " it may mean that your frontend doesn't currently support widgets.\n", - "

\n" - ], "text/plain": [ "FigureWidget({\n", - " 'data': [{'type': 'histogram',\n", - " 'uid': '75f0d11f-9242-4fc7-b433-1f04e1e37ba6',\n", - " 'y': [-0.045560088746212646, -0.28691603912686325,\n", - " -1.5135547360075963, ..., -0.4613631587476821,\n", - " -0.5212332930925054, -0.3948507473332721]}],\n", - " 'layout': {'bargap': 0.2,\n", - " 'bargroupgap': 0.1,\n", - " 'title': 'D_low - R_high
Observed Collision, Forecasted Swash',\n", - " 'xaxis': {'title': 'Count'},\n", - " 'yaxis': {'title': 'z (m AHD)'}}\n", - "})" + " 'data': [{'marker': {'color': '#ef8a62'},\n", + " 'name': 'Underpredicted',\n", + " …" ] }, "metadata": {}, @@ -290,10 +286,45 @@ } ], "source": [ - "trace1 = go.Histogram(y=df_twl_toes['diff'].tolist())\n", + "collision_underpredicted_site_ids = get_site_ids(df_forecasted=impacts['forecasted']['mean_slope_sto06'],\n", + " df_observed=impacts['observed'],\n", + " forecasted_regime='swash',\n", + " observed_regime='collision')\n", + "collision_underpredicted_diffs = get_R_high_D_low_diff(site_ids=collision_underpredicted_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])\n", + "\n", + "collision_correct_site_ids = get_site_ids(df_forecasted=impacts['forecasted']['mean_slope_sto06'],\n", + " df_observed=impacts['observed'],\n", + " forecasted_regime='collision',\n", + " observed_regime='collision')\n", + "collision_correct_diffs = get_R_high_D_low_diff(site_ids=collision_correct_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])\n", + "\n", + "\n", + "trace1 = go.Histogram(y=collision_correct_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Correctly predicted',\n", + " marker=dict(\n", + " color='#67a9cf',\n", + " ),\n", + " ybins=dict(\n", + " size=0.1\n", + "),)\n", + "trace2 = go.Histogram(y=collision_underpredicted_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Underpredicted',\n", + " marker=dict(\n", + " color='#ef8a62',\n", + " ),\n", + " ybins=dict(\n", + " size=0.1\n", + "),)\n", "\n", "layout = go.Layout(\n", - " title='D_low - R_high
Observed Collision, Forecasted Swash',\n", + " title='R_high - D_low
Collision Regime',\n", + " barmode='overlay',\n", " yaxis=dict(\n", " title='z (m AHD)'\n", " ),\n", @@ -301,172 +332,267 @@ " title='Count'\n", " ),\n", " bargap=0.2,\n", - " bargroupgap=0.1\n", + " bargroupgap=0.1,\n", + " legend=dict(x=.6, y=1)\n", ")\n", "\n", - "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", - "g_plot" + "g_plot_collision = go.FigureWidget(data=[trace2, trace1], layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(g_plot_collision, 'g_plot_collision.png',format='png', width=600, height=400, scale=5)\n", + "\n", + "g_plot_collision" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "The above plot shows that the R_high value for most of the incorrectly forecasted collision regimes, was typically underpredicted by less than 0.5 m." + "### Does dune toe lower?\n" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": null, "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "### What do over predicted and underpredicted profiles look like?" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, "source": [ - "### Compare overpredicted cases" + "Define a function for getting the average beach profile for a number of given site_ids:" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 156, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T04:08:56.128806Z", - "start_time": "2018-12-03T04:08:55.894182Z" - } + "end_time": "2018-12-04T23:11:08.853877Z", + "start_time": "2018-12-04T23:11:08.846876Z" + }, + "hidden": true + }, + "outputs": [], + "source": [ + "def get_avg_profile(site_ids, debug=False):\n", + " rows = []\n", + " for n,site_id in enumerate(site_ids):\n", + " profile = df_profiles.query(\"site_id == '{}' and profile_type == 'prestorm'\".format(site_id))\n", + " profile_z = np.array(profile.z.tolist())\n", + " profile_x = np.array(profile.index.get_level_values('x').tolist())\n", + " \n", + " # Let's center the profile based on the z=0 location\n", + " idx_last_z_val = max(np.argwhere(~np.isnan(profile_z)==True))[0]\n", + " x_last_val = profile_x[idx_last_z_val]\n", + " profile_x = [x - x_last_val for x in profile_x]\n", + " \n", + " # Put values into a dictionary\n", + " for x,z in zip(profile_x, profile_z):\n", + " rows.append({'x':x, 'z': z})\n", + "\n", + " # Return early for debugging\n", + " if debug and n>3:\n", + " break\n", + " \n", + " # Create dataframe from rows\n", + " df = pd.DataFrame(rows)\n", + " avg_profile = df.groupby('x').agg({'z': [np.nanmean, np.nanstd]}).reset_index()\n", + "\n", + " return {\n", + " 'x': avg_profile.x.tolist(),\n", + " 'z': avg_profile.z.nanmean.tolist(),\n", + " 'std': avg_profile.z.nanstd.tolist(),\n", + " 'n': n+1 # number of profiles\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "Now, let's look at whether there is a difference between the average beach profile of correctly forecasted site_ids and incorrectly forecasted site_ids. First, looking at sites where we observed swash regime." + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T02:00:36.853374Z", + "start_time": "2018-12-05T01:58:21.839366Z" + }, + "code_folding": [], + "hidden": true }, "outputs": [ { "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
dune_toe_zR_highdiff
AVOCAn00043.1783.4169880.238988
BOOM00043.0653.0749800.009980
BOOM00112.7716.4918243.720824
BOOM00122.7963.1480870.352087
CATHIE00012.7803.5227920.742792
\n", - "
" - ], + "application/vnd.jupyter.widget-view+json": { + "model_id": "03f2e99d20a347f3922a0e6a36f99ccd", + "version_major": 2, + "version_minor": 0 + }, "text/plain": [ - " dune_toe_z R_high diff\n", - "AVOCAn0004 3.178 3.416988 0.238988\n", - "BOOM0004 3.065 3.074980 0.009980\n", - "BOOM0011 2.771 6.491824 3.720824\n", - "BOOM0012 2.796 3.148087 0.352087\n", - "CATHIE0001 2.780 3.522792 0.742792" + "FigureWidget({\n", + " 'data': [{'line': {'color': 'rgb(205, 0, 0)', 'width': 2},\n", + " 'mode': 'lines',\n", + " …" ] }, - "execution_count": 42, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ - "# Find site_ids where the forecast has been overpredicted\n", - "set1 = set(impacts['forecasted']['mean_slope_sto06'].query(\"storm_regime == 'collision'\").index.get_level_values('site_id'))\n", - "set2 = set(impacts['observed'].query(\"storm_regime == 'swash'\").index.get_level_values('site_id'))\n", - "site_ids = list(set1.intersection(set2))\n", - "\n", - "# Get dune toes at these sites and predicted max R_high\n", - "df_toes = df_profile_features.loc[site_ids].query('profile_type==\"prestorm\"').dune_toe_z\n", - "df_R_highs = twls['forecasted']['mean_slope_sto06'].loc[site_ids].groupby('site_id')['R_high'].max()\n", - "\n", - "# Join into one dataframe\n", - "df_twl_toes = pd.concat([df_toes, df_R_highs],axis=1,sort=True)\n", - "df_twl_toes['diff'] = df_twl_toes['R_high'] - df_twl_toes['dune_toe_z']\n", - "df_twl_toes.head()\n" + "overpredicted = get_avg_profile(swash_overpredicted_site_ids)\n", + "correct = get_avg_profile(swash_correct_site_ids)\n", + "\n", + "# Add mean profile\n", + "trace_overpredicted_mean = go.Scatter(\n", + " x=overpredicted['x'],\n", + " y=overpredicted['z'],\n", + " opacity=1,\n", + " mode='lines',\n", + " name='Mean overpredicted profile (n={})'.format(overpredicted['n']),\n", + " line=dict(\n", + " color=('rgb(205, 0, 0)'),\n", + " width=2)\n", + ")\n", + "\n", + "trace_overpredited_std_top = go.Scatter(\n", + " x=overpredicted['x'],\n", + " y=np.add(overpredicted['z'], overpredicted['std']),\n", + " opacity=1,\n", + " hoverinfo='none',\n", + " showlegend=False,\n", + " mode='lines',\n", + " line=dict(\n", + " color=('rgb(205, 0, 0)'),\n", + " width=0.5,\n", + " dash='dash')\n", + ")\n", + "\n", + "trace_overpredited_std_btm = go.Scatter(\n", + " x=overpredicted['x'],\n", + " y=np.subtract(overpredicted['z'], overpredicted['std']),\n", + " opacity=1,\n", + " hoverinfo='none',\n", + " mode='lines',\n", + " showlegend=False,\n", + " line=dict(\n", + " color=('rgb(205, 0, 0)'),\n", + " width=0.5,\n", + " dash='dash')\n", + ")\n", + "\n", + "trace_correct_mean = go.Scatter(\n", + " x=avg_correct_x,\n", + " y=avg_correct_z,\n", + " opacity=1,\n", + " mode='lines',\n", + " name='Mean correct profile (n={})'.format(correct['n']),\n", + " line=dict(\n", + " color=('rgb(0, 205, 0)'),\n", + " width=2)\n", + ")\n", + "\n", + "trace_correct_std_top = go.Scatter(\n", + " x=avg_correct_x,\n", + " y=np.add(avg_correct_z, avg_correct_std),\n", + " opacity=1,\n", + " hoverinfo='none',\n", + " showlegend=False,\n", + " mode='lines',\n", + " line=dict(\n", + " color=('rgb(0, 205, 0)'),\n", + " width=0.5,\n", + " dash='dash')\n", + ")\n", + "\n", + "trace_correct_std_btm = go.Scatter(\n", + " x=avg_correct_x,\n", + " y=np.subtract(avg_correct_z, avg_correct_std),\n", + " opacity=1,\n", + " hoverinfo='none',\n", + " mode='lines',\n", + " showlegend=False,\n", + " line=dict(\n", + " color=('rgb(0, 205, 0)'),\n", + " width=0.5,\n", + " dash='dash')\n", + ")\n", + "\n", + "layout = dict(showlegend=True,\n", + " title='Observed Swash Impact Regime',\n", + " legend=dict(x=.6, y=1),\n", + " xaxis=dict(\n", + " range=[-150, 0]),\n", + " yaxis=dict(\n", + " range=[0, 10]))\n", + "\n", + "fig = go.FigureWidget(data=[trace_overpredicted_mean,\n", + " trace_overpredited_std_top,\n", + " trace_overpredited_std_btm,\n", + " trace_correct_mean,\n", + " trace_correct_std_top,\n", + " trace_correct_std_btm],\n", + " layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(\n", + " fig, 'mean_profiles_swash.png', format='png', width=600, height=600, scale=5)\n", + "\n", + "fig" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "We can see that the difference is pretty minimal. For cases where we predicted collision, but observed swash (overprediction), we see that overpredicted profiles are slightly more concave than correctly predicted sites." ] }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 162, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T04:14:46.601092Z", - "start_time": "2018-12-03T04:14:46.522883Z" - } + "end_time": "2018-12-05T02:03:38.394415Z", + "start_time": "2018-12-05T02:00:37.335377Z" + }, + "hidden": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3ea49a4ac07c4ea19bbb4532326ff94c", + "model_id": "1255bccc024e4690b4b8ff4ccc8e9e35", "version_major": 2, "version_minor": 0 }, - "text/html": [ - "

Failed to display Jupyter Widget of type FigureWidget.

\n", - "

\n", - " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", - " that the widgets JavaScript is still loading. If this message persists, it\n", - " likely means that the widgets JavaScript library is either not installed or\n", - " not enabled. See the Jupyter\n", - " Widgets Documentation for setup instructions.\n", - "

\n", - "

\n", - " If you're reading this message in another frontend (for example, a static\n", - " rendering on GitHub or NBViewer),\n", - " it may mean that your frontend doesn't currently support widgets.\n", - "

\n" - ], "text/plain": [ "FigureWidget({\n", - " 'data': [{'type': 'histogram',\n", - " 'uid': '4a284474-2be1-4fd7-87d5-25364cc78df4',\n", - " 'y': [0.23898814460475037, 0.009980312001434566, 3.720823710344608,\n", - " ..., 1.5720238663972683, 0.912998680585452, 1.1419977620500927]}],\n", - " 'layout': {'bargap': 0.2,\n", - " 'bargroupgap': 0.1,\n", - " 'title': 'D_low - R_high
Observed Swash, Forecasted Collision',\n", - " 'xaxis': {'title': 'Count'},\n", - " 'yaxis': {'title': 'z (m AHD)'}}\n", - "})" + " 'data': [{'line': {'color': 'rgb(205, 0, 0)', 'width': 2},\n", + " 'mode': 'lines',\n", + " …" ] }, "metadata": {}, @@ -474,29 +600,114 @@ } ], "source": [ - "trace1 = go.Histogram(y=df_twl_toes['diff'].tolist())\n", + "underpredicted = get_avg_profile(collision_underpredicted_site_ids)\n", + "correct = get_avg_profile(collision_correct_site_ids)\n", "\n", - "layout = go.Layout(\n", - " title='D_low - R_high
Observed Swash, Forecasted Collision',\n", - " yaxis=dict(\n", - " title='z (m AHD)'\n", - " ),\n", - " xaxis=dict(\n", - " title='Count'\n", - " ),\n", - " bargap=0.2,\n", - " bargroupgap=0.1\n", + "# Add mean profile\n", + "trace_underpredicted_mean = go.Scatter(\n", + " x = underpredicted['x'],\n", + " y= underpredicted['z'],\n", + " opacity = 1,\n", + " mode='lines',\n", + " name='Mean underpredicted profile (n={})'.format(underpredicted['n']),\n", + " line = dict(\n", + " color = ('rgb(205, 0, 0)'),\n", + " width = 2)\n", + ")\n", + "\n", + "trace_underpredicted_std_top = go.Scatter(\n", + " x = underpredicted['x'],\n", + " y= np.add(underpredicted['z'],underpredicted['std']),\n", + " opacity = 1,\n", + " hoverinfo='none',\n", + " showlegend=False,\n", + " mode='lines',\n", + " line = dict(\n", + " color = ('rgb(205, 0, 0)'),\n", + " width = 0.5,\n", + " dash = 'dash')\n", + ") \n", + "\n", + "trace_underpredicted_std_btm = go.Scatter(\n", + " x = underpredicted['x'],\n", + " y= np.subtract(underpredicted['z'],underpredicted['std']),\n", + " opacity = 1,\n", + " hoverinfo='none',\n", + " mode='lines',\n", + " showlegend=False,\n", + " line = dict(\n", + " color = ('rgb(205, 0, 0)'),\n", + " width = 0.5,\n", + " dash = 'dash')\n", + ") \n", + "\n", + "trace_correct_mean = go.Scatter(\n", + " x = avg_correct_x,\n", + " y= avg_correct_z,\n", + " opacity = 1,\n", + " mode='lines',\n", + " name='Mean correct profile (n={})'.format(correct['n']),\n", + " line = dict(\n", + " color = ('rgb(0, 205, 0)'),\n", + " width = 2)\n", ")\n", "\n", - "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", - "g_plot" + "trace_correct_std_top = go.Scatter(\n", + " x = avg_correct_x,\n", + " y= np.add(avg_correct_z, avg_correct_std),\n", + " opacity = 1,\n", + " hoverinfo='none',\n", + " showlegend=False,\n", + " mode='lines',\n", + " line = dict(\n", + " color = ('rgb(0, 205, 0)'),\n", + " width = 0.5,\n", + " dash = 'dash')\n", + ") \n", + "\n", + "trace_correct_std_btm = go.Scatter(\n", + " x = avg_correct_x,\n", + " y= np.subtract(avg_correct_z, avg_correct_std),\n", + " opacity = 1,\n", + " hoverinfo='none',\n", + " mode='lines',\n", + " showlegend=False,\n", + " line = dict(\n", + " color = ('rgb(0, 205, 0)'),\n", + " width = 0.5,\n", + " dash = 'dash')\n", + ") \n", + " \n", + "layout = dict(showlegend=True,\n", + " title='Observed Collision Impact Regime',\n", + " legend=dict(x=.6, y=1),\n", + " xaxis=dict(\n", + " range=[-150,0]),\n", + " yaxis=dict(\n", + " range=[0,10]))\n", + " \n", + "fig=go.FigureWidget(data=[trace_underpredicted_mean, \n", + " trace_underpredicted_std_top,\n", + " trace_underpredicted_std_btm, \n", + " trace_correct_mean, \n", + " trace_correct_std_top, \n", + " trace_correct_std_btm], \n", + " layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(fig, 'mean_profiles_collision.png',format='png', width=600, height=600, scale=5)\n", + "\n", + "fig\n", + "\n" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "hidden": true + }, "source": [ - "The errors when we forecast collision but observe swash are much greater than we we forecast swash and observe collision. For this case, errors in excess of 1.0 m common. Why is this?" + "This plot is a bit more interesting. It shows that we are correctly forecasting collision when the profile is more accreted/convex, but when the profile is more eroded/concave, the water level is underpredicted. Why is this? " ] } ], @@ -506,6 +717,18 @@ "language": "python", "name": "python3" }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, "toc": { "base_numbering": 1, "nav_menu": {}, @@ -515,9 +738,14 @@ "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, - "toc_position": {}, + "toc_position": { + "height": "calc(100% - 180px)", + "left": "10px", + "top": "150px", + "width": "232.391px" + }, "toc_section_display": true, - "toc_window_display": false + "toc_window_display": true }, "varInspector": { "cols": { diff --git a/notebooks/04_profile_picker.ipynb b/notebooks/04_profile_picker.ipynb new file mode 100644 index 0000000..ce31898 --- /dev/null +++ b/notebooks/04_profile_picker.ipynb @@ -0,0 +1,743 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T00:54:50.235522Z", + "start_time": "2018-12-05T00:54:42.731587Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import numpy.ma as ma\n", + "\n", + "import numpy\n", + "from pyearth import Earth\n", + "from matplotlib import pyplot\n", + "\n", + "np.random.seed(2017)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T00:54:54.936556Z", + "start_time": "2018-12-05T00:54:50.271465Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing profiles.csv\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\z5189959\\Desktop\\nsw-2016-storm-impact\\.venv\\lib\\site-packages\\numpy\\lib\\arraysetops.py:522: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + " mask |= (ar1 == a)\n" + ] + } + ], + "source": [ + "def df_from_csv(csv, index_col, data_folder='../data/interim'):\n", + " print('Importing {}'.format(csv))\n", + " return pd.read_csv(os.path.join(data_folder,csv), index_col=index_col)\n", + "\n", + "df_profiles = df_from_csv('profiles.csv', index_col=[0, 1, 2])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-04T23:49:04.770025Z", + "start_time": "2018-12-04T23:49:04.265699Z" + } + }, + "source": [ + "## Try using pyearth" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T01:54:00.320555Z", + "start_time": "2018-12-05T01:53:58.905803Z" + }, + "code_folding": [ + 5, + 20, + 31, + 40 + ], + "scrolled": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ { 'slope': -0.06617795750241562,\n", + " 'type': 'land',\n", + " 'x_end': 63.0,\n", + " 'x_start': 40.5,\n", + " 'z_end': 9.943990321404,\n", + " 'z_mean': 9.20564731619437,\n", + " 'z_start': 8.348161899068224},\n", + " { 'slope': -0.09424321140128608,\n", + " 'x_end': 69.0,\n", + " 'x_start': 63.0,\n", + " 'z_end': 10.532233612481347,\n", + " 'z_mean': 10.310033111599461,\n", + " 'z_start': 10.062895267627406},\n", + " { 'slope': 0.07278057230588836,\n", + " 'x_end': 96.0,\n", + " 'x_start': 69.0,\n", + " 'z_end': 9.071344271845113,\n", + " 'z_mean': 9.942154478828064,\n", + " 'z_start': 10.600758995514095},\n", + " { 'slope': 0.010222110457455531,\n", + " 'x_end': 105.0,\n", + " 'x_start': 96.0,\n", + " 'z_end': 8.940005362742282,\n", + " 'z_mean': 8.960960594412768,\n", + " 'z_start': 9.032076613769703},\n", + " { 'slope': -0.006783434031405405,\n", + " 'x_end': 171.0,\n", + " 'x_start': 105.0,\n", + " 'z_end': 9.377956662680647,\n", + " 'z_mean': 9.12742372282666,\n", + " 'z_start': 8.933411617025225},\n", + " { 'slope': 0.04487864391014401,\n", + " 'x_end': 177.0,\n", + " 'x_start': 171.0,\n", + " 'z_end': 9.159019876027982,\n", + " 'z_mean': 9.312931484934994,\n", + " 'z_start': 9.382296403384132},\n", + " { 'slope': 0.28077356578561746,\n", + " 'x_end': 198.0,\n", + " 'x_start': 177.0,\n", + " 'z_end': 3.9204468853264824,\n", + " 'z_mean': 6.663384763062234,\n", + " 'z_start': 9.046622396024778},\n", + " { 'slope': 0.08534897213040515,\n", + " 'x_end': 204.0,\n", + " 'x_start': 198.0,\n", + " 'z_end': 3.3242471595653202,\n", + " 'z_mean': 3.4936366209579663,\n", + " 'z_start': 3.754184455095742},\n", + " { 'slope': 0.02118839446027552,\n", + " 'type': 'berm',\n", + " 'x_end': 252.0,\n", + " 'x_start': 204.0,\n", + " 'z_end': 2.11417905440144,\n", + " 'z_mean': 2.7099232730105225,\n", + " 'z_start': 3.26349144192863},\n", + " { 'slope': 0.06273209072355844,\n", + " 'type': 'foreshore',\n", + " 'x_end': 285.5,\n", + " 'x_start': 252.0,\n", + " 'z_end': 0.0614306329519847,\n", + " 'z_mean': 1.0727411577535628,\n", + " 'z_start': 2.070753280242818}]\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEWCAYAAAB1xKBvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzs3XmcXFd16PvfqqGrep4ndWtyW5awJVvIssEXzGxjG7Cxr0NsCDFDcODCu0lu8gEywiOBS14SJyTcYDnEARJi42C4NsEBGxJsDEYgGU+yJEvqltTzXD3XvN4fdapc1V09SV1d3dXr+/n0p6r23lVn11HprLOHs4+oKsYYY8xiXPmugDHGmPXBAoYxxpglsYBhjDFmSSxgGGOMWRILGMYYY5bEAoYxxpglsYBhzBKJyGtE5ISITIrIO0XkP0TkDifvfSLyZL7raEwuWcAwOSEinxaRf8l3PVbYZ4AvqmqZqv5fVb1eVb+ayw2KyBtEpGuRMl8RERWRK9PSLhSRORdZOWWjIrJpVvqnRSTiBMOAiPxURK6aVY+4kz8hIsdF5P1ZPl9EpF1EXsyS5xORe0VkXET6ROR/zcp/s4gcE5FpEfkvEdmalvcup07TIvKjLJ/9DhF5wanfT0Xk4oX2mTk3FjDMvETEs1G2vcTtbQWO5Lou52gE+LOFCohIKfDfgTHgPVmKfENVy4A64L+Af5uV3+PkVwC/A/yDiOycVeZ1QANwgYhcMSvv08AOEvvxjcDHReQ6p251wLeAPwZqgEPAN2Z9v78BPp/le+0Avg58GKgCvgM8nM/fb6GygLHBiMhpEfl9EXlRREZF5J9ExO/kvUFEukTkEyLSB/yTk/52EXkm7czz0rTP+4SIdKeddb7ZOQj8AfCrzhnfs07ZTSLysIiMiMhJEflQ2ud8WkS+KSL/IiLjwPuctH9z0iZE5HkRucip/4CIdIrItSv8XT/k1G3EqesmJ/0UcAHwHec7+UTkRyLyG/Nse5eIPOZ8znERedcC9Xy/iBx1vmO7iPymk14K/Aewydnm5OyWQZqvApeKyOvn2w6JYBEg0VK6Y75CqholcQBuEZH6LPmqqo+QOIhfOiv7DuAh4JEs2/h14E9VdVRVjwL/ALzPybsFOKKq/6aqQRLB5TIR2eVs8weq+gDQk6XKbwV+rKpPOnX/c6AFWGhfmHNgAWNjeg+J/2RtwEXAH6XlNZE4w9sK3Cki+4B7gd8EaoEDJM7efM7Z5ceAK1S13PnM06r6PeBzOGesqnqZ89n3AV3AJuBW4HMi8ua0bd8EfJPEWeLXnbR3AP8MVAO/BL5P4nfbQuLAd2AFv+ubgP8NvAtoBs4A9wOoahtwFniH851C823QOdA/BvwribPt24G/F5FL5nnLAPB2Emfu7wf+WkT2qeoUcD3Omb3zl+2ACTBNYp9/doF9cQeJf4P7gV3Ov222+heROLgPA6NZ8l0iciOJlsjJtPQSEv+uX3f+bnM+CxGpJvHv/mzaRz0LJPfJJel5znc/lZa/EHH+Zr/evYT3mmWwgLExfVFVO1V1hMQB5va0vDjwKVUNqeoM8CHggKoeVNWY02cfAl4NxAAfcLGIeFX1tKqeyrZBEdkMvBb4hKoGVfUZ4MvAe9OKPeWMDcSdbUPizPH7zpnjvwH1wOdVNULiwLdNRKpW6Lu+B7hXVZ92AsLvA1eJyLYFPj+bt5MInP+kqlFVfRp4kMTBdA5V/a6qnnLO3B8HHgWuXuY2IRE8t4jI9bMzRGQLiW6gf1XVfuCHzG0BvEtEAkDy3/1WZ78nbUrL/zbwv1T1l2n5t5D4bTwK/DvgAd7m5JU5j2Np5ceA8rT89LzZ+Qt5DHi902osItG6LQJKlvBeswwWMDamzrTnZ0ic+SUNOl0CSVuB33W6owLOAWMzsElVTwK/TaL7YEBE7l+gy2QTMKKqE7O23TJPvZL6057PAEOqGkt7DS8fjLJZznfd5JQBQFUnSZxlp9dxKbYCr5q1z95DokUzh4hcLyI/c7qvAsANJM7el8UJcn/q/Mms7PcCR51ADYkWwLtFxJtW5gFVrQIagReAy2d9Ro+TXwH8LfCmWfl3OJ8RderyLV4OSpPOY0Va+QpgIi0/PW92/rxU9ZiznS8CvST23YskWrNmBVnA2Jg2pz3fQma/8OyZNZ3AZ1W1Ku2vRFXvA1DVf1XV15I4SCqJ/uNsn9MD1IhI+hnjFqB7gW2vhOV81x4S3wNIdS3VklnHpegEHp+1z8pU9SOzC4qIj0Tr4y+BRueA/AgvH/CXu0/+CagEbp6V/uskBqL7nDGbu0gcWOe0RlR1iEQX5KdFpDlLfgj4BLBHRN7pfI9WEgHk19K2cStwg4jUqeooiYP5ZWkfdRkvTyI4kp7n7Ps2ljjJQFW/qaq7VbUW+BSJf8dfLOW9ZuksYGxMHxWRVhGpIdF8/8YCZf8B+LCIvEoSSkXkbSJSLiI7ReRNzkEvSOKMP3n230+iu8gFoKqdwE+B/y0ifkkMnH+Ql8cqcmU53/VfgfeLyF7nO30OOKiqp5e5zX8HLhKR94qI1/m7QkRekaVsEYluvUEg6nQnpQ/k9wO1IlK5lA07XUifJnFAB0AS02PbgCuBvc7fbhLfN+vgt3PW/n3g4/Pkh4G/Av7ESXov8BKwM20bF5E4y092A34N+CMRqXYGsz8EfMXJ+zawW0T+uzMx4U+A55x6ICJuJ90DuJzfUKp1JCKXO2XqSXTNfSf5XrNyLGBsTP9Kop+53fmbdzqmqh4i8R/7iyQGQE/y8swWH4lpjkNAH4kB3j9w8pJTModF5Gnn+e3ANhJn8t8mMX7w2Ep8oQUs57v+kMS0zgdJnA23Abctd4NOt9u1znt7SOybPyexv7KV/Z/AAyT277uBh9Pyj5EYqG53urfm6/JLd59T/6Q7gIdU9XlV7Uv+AV8A3u4E02z+gsRkgIZ58u8lMWbyDmcbf5/++c427ubloPQpEgPZZ4DHgb9wJkigqoMkZnF91tkPryJz37+XxAnJl0iM78yQOJlJ+gKJGWDHnccPYVac2A2UNhYROQ38hqr+IN91ybWN9F2NWQ3WwjDGGLMkOQsYIrJZEpf3HxWRIyLyW056jXNB0wnnsXqe99/hlDkhzno9xhhj8idnXVLO7IpmVX3amRlzGHgnif7vEVX9vIh8EqhW1U/Mem9yaYD9JGaJHAYud2ZaGGOMyYOctTBUtde5YCk5sHeUxHz2m0gsY4Dz+M4sb38r8JiqjjhB4jHgulzV1RhjzOJWZXEu50rZVwIHScw174VEUJlnBkYLmRdcdTHPxVMicidwJ0Bpaenlu3btWrmKG2NMgTt8+PCQqs5ZMyybnAcMESkjMU3xt1V1XGT2BajZ35YlLWvfmareA9wDsH//fj106NC5VtUYYzYcETmzeKmEnM6Sci6seRD4uqp+y0nuT1496jwOZHlrF5lX6LaSfZVKY4wxqySXs6QE+EcS69fclZb1MC9fyJNcCnm27wPXOleEVpO4COr7uaqrMcaYxeWyhfEaEldnvkkS91J4RkRuIHFl8DUicgK4xnmNiOwXkS8DOCuL/imJtWB+AXzGSTPGGJMnBXWlt41hGGPM8ojIYVXdv5SydqW3McaYJbGAsc689NJLxGKxxQsaY8wKs5ukryPd3d3cddddNDU1ceONN/LKV76SJU5TNsaY82YBY42La5zOsU6ODR3j0fsfRVXp7e3lwIEDbN26lZtvvplXvCLbbRaMMWZl2aD3GhGOhTkxfIJjQ8c4OnSUo0NHOTZ0jGNDx5iOTNMYbuSmoZuyvnfnzp3cfPPNbN++fZVrbYxZ75Yz6G0BY5WNBcdSgSA9MJwaOUVM5x+bKI2Vsn98PztmduCaZ+jprW99K7fcckuuqm6MKUDLCRjWJZUDqkrvZC9HB4/OCQw9E+d2wfqUe4rHqx/n2bJn2T+xnwuCF8wps2PHDuLxOOPj44yOjhIOhwEoKyujurqa4uJiG/MwxpwzCxjnIRqP0j7anjUwjIfGV2w7Vf4qXlH3isRf/SvYVbeLqmAVP//hzzl+7HiiTFUVbreb//zP/2RwcJDJyUmmp6fxeDxUVVXR1NTEJZdcQmNjowUNY8w52fABQ1UJhUJEIhG8Xi8+n2/OAXUqPMXx4eNzAsOJ4RNE4pEVq8vmis3sqtuVERheUfcKGkobUnVKtiBOnz7NiZdOpN47Pj7O9773PSKRCG63GxHB7/enno+NjdHb20tVVRV+v3/F6myM2Tg2dMBQVQYGBhgcHCQejxOIBBhxjdAX6+P40PFUYDg7dnbFtulxeWirauPCqgvZUb2DPU172NO8h111uyj3lS9Y16mpKZ555hnOnDnDxMRERn48HicejyMiiAixWIxoNIrb7UZVEREikQiRSMQChjHmnGzogPGjUz/iC49/gY7JDk5PnmY8unLdSCWeEi4ov4ALKl7+2162nWqtZjwwTiwWQ1VxD7iJRqJ0jXcBICKpA3zyMdmq6OjoYGBgAFUlHA5TVFREMBhMbXN6ehq/34+qoqrEYjFisVjqs7xeL16vd8W+ozFmY9nQAePEwAke6sq2WO7SlUs5DdJAg8v5kwbqpI4KrcAVdKEzinvITYgQxzhGPB7H5XLhdrtxuVyEw+FU2kJjC/F4PBVAPB4PIjInYASDQUpKSlKfE41GKSoqQlWprKykubkZn893Xt/XGLNxbeiAcWH1hUsqJwg1UkOjq5E66mjyNFGrtTR7mymKFeHxeIhGo3g8HiKRCIJk3AIqFoulyrjd7lSACAaDeL3eVFdSernZjy6Xi+QU6EgkkgoY6YLBIEVFRZSXl1NeXk5LSwvV1dWUl5fbLCljzHnb0AHjspbLEAR1bubnxUu9q54GVwP11NPobqSeeurd9bg10SJIHuzj8TguXMQlPqcLKfk83ey8ZFdR+rhDtu6o5KPb7SYWi6Ue4/H4nO4ll8vFtddeawHCGJMTGzpg1JTX8Ln/9jmC/UGKp4spj5UTCUdSM6dSZ/muxONCB/T0x2ySeckDvqoSjUZTA9CLfabL5cLr9aa6pKqqqmhsbOShhx5KbXNiYoJt27bZoLYxJic2dMAQET7+5o/T2dnJkSNHGBgYYCI6QSgUSs0uOtfH9MCRTPN4Eru7tLQ0NWYRj8cJh8MZM5pmPybHLMrLy6msrKSpqYk9e/ZQVVXFU089RX9/f2pb3d3dtLW1rfq+NMYUvg0dMCDRjbNlyxbq6+sZGRlhamoqdcBfaosiWwsjOc6QDBKzWwolJSVAYmZT8orsxVoYRUVFVFdXU1FRgcuVWB5k8+bNGQGjs7PTAoYxJidyFjBE5F7g7cCAqu520r4B7HSKVAEBVd2b5b2ngQkgBkSXus7JedSVkpKS1EF8PWltbSV9/ayurq6M/KVcmGiMMUuRyxbGV4AvAl9LJqjqryafi8hfAWMLvP+NqjqUs9oViM2bN2e87uzsTD1XVQYHBwkEAqmB+qqqKurr6y1oGGOWLWcBQ1WfEJFt2fIkcbR6F/CmXG1/o2htbc143d3dnZrJFQqFCAQClJaWprq2AoEAFRUVNjBujFm2fN2i9WqgX1VPzJOvwKMiclhE7lzog0TkThE5JCKHBgcHV7yia11lZSXl5S8vKRKJRBgYGEg9T78gUERwuVxEIiu3/pUxZuPIV8C4HbhvgfzXqOo+4HrgoyLyuvkKquo9qrpfVffX19evdD3XPBGZ08pIdkslLwpMDsSratbrN4wxZilWPWCIiAe4BfjGfGVUtcd5HAC+DVy5OrVbn2YHjOTAt8/no6qqiqmpKaanp5mamqKqqsqWBzHGnJN8TKt9C3BMVbuyZYpIKeBS1Qnn+bXAZ1azguvNfAFDRKivr6eiosJmSRljzlvOWhgich/wFLBTRLpE5INO1m3M6o4SkU0i8ojzshF4UkSeBX4OfFdVv5erehaChWZKJe+LUV5ejt/vt2BhjDlnuZwldfs86e/LktYD3OA8bwcuy1W9ClFTU1NqGROAsbExxsfHqaioyHPNjDGFJF+D3mYFud1uNm3alJE2+wI+Y4w5XxYwCsR84xjGGLNSLGAUiIXGMYwxZiVYwCgQ1sIwxuSaBYwCMTtg9PX12RXdxpgVZQGjQJSUlFBbW5t6HY/H6e3tzWONjDGFxgJGAZlviRBjjFkJFjAKiI1jGGNyyQJGAbGZUsaYXLKAUUCytTDS7y1ujDHnwwJGAamtrc24MdLMzAzDw8N5rJExppBYwCggLpfLxjGMMTljAaPA2EwpY0yuWMAoMLMHvq2FYYxZKRYwCox1SRljcsUCRoHZtGlTxk2ShoaGmJmZyWONjDGFwgJGgSkqKqKpqSkjzVoZxpiVkMtbtN4rIgMi8kJa2qdFpFtEnnH+bpjnvdeJyHEROSkin8xVHQuVdUsZY3Ihly2MrwDXZUn/a1Xd6/w9MjtTRNzA/wGuBy4GbheRi3NYz4JjM6WMMbmQs4Chqk8AI+fw1iuBk6rarqph4H7gphWtXIGzmVLGmFzIxxjGx0TkOafLqjpLfguQfkrc5aRlJSJ3isghETk0ODi40nVdl2a3MLq7u4nFYnmqjTGmUKx2wPgS0AbsBXqBv8pSRrKkzbsgkqreo6r7VXV/fX39ytRynausrKSioiL1OhqN0t/fn8caGWMKwaoGDFXtV9WYqsaBfyDR/TRbF5Dep9IK9KxG/QqJDXwbY1baqgYMEWlOe3kz8EKWYr8AdojIdhEpAm4DHl6N+hUSG/g2xqw0T64+WETuA94A1IlIF/Ap4A0ispdEF9Np4DedspuAL6vqDaoaFZGPAd8H3MC9qnokV/UsVDbwbYxZaTkLGKp6e5bkf5ynbA9wQ9rrR4A5U27N0lmXlDFmpdmV3gWqsbERj+fl84Hx8XHGxsbyWCNjzHpnAaNAud1uWloyZyO3t7fbHfiMMefMAkYBm90tdeTIEQYHBy1oGGPOiQWMAjZ7EcLR0VECgQChUChPNTLGrGcWMApYY2Njxuu+vj5cLheRSCRPNTLGrGcWMArYli1bMl4PDw8TCoXwer15qpExZj2zgFHAqqqqqK5+ebkuVSUUCuHz+fJYK2PMemUBo4CJCFu3bs1Im5qayrgjnzHGLJUFjAJnF/AZY1aKBYwCZ0uEGGNWigWMApethRGPx/NUG2PMemYBo8DV1tZSXFyceh0MBhkeHs5jjYwx65UFjAInIrbUuTFmRVjA2ABsHMMYsxIsYGwANlPKGLMSLGBsANbCMMasBAsYG0BzczMu18v/1MPDw0xNTeWxRsaY9ShnAUNE7hWRARF5IS3tL0TkmIg8JyLfFpGqed57WkSeF5FnRORQruq4UXi93jkr13Z3d+epNsaY9SqXLYyvANfNSnsM2K2qlwIvAb+/wPvfqKp7VXV/juq3odhMKWPM+cpZwFDVJ4CRWWmPqmrUefkzoHXOG82KU1Wam5sz0mwcwxizXPkcw/gA8B/z5CnwqIgcFpE7F/oQEblTRA6JyKHBwcEVr+R6p6oMDg5m3N8brIVhjFm+vAQMEflDIAp8fZ4ir1HVfcD1wEdF5HXzfZaq3qOq+1V1f319fQ5qu76FQiECgQDbtm3LSO/p6SEWi+WnUsaYdWnVA4aI3AG8HXiPznNzaVXtcR4HgG8DV65eDQtLJBLB5XJRVlZGWVlZKj0Wi9HX15fHmhlj1ptVDRgich3wCeBGVZ2ep0ypiJQnnwPXAi9kK2sW5/V6icfjqOqcmVLWLWWMWY5cTqu9D3gK2CkiXSLyQeCLQDnwmDNl9m6n7CYRecR5ayPwpIg8C/wc+K6qfi9X9Sx0Pp+PqqoqpqamqK2tzcizgW9jzHJ4Fi9yblT19izJ/zhP2R7gBud5O3BZruq10YgI9fX1VFRUsGPHDg4ePJjKs4BhjFkOu9J7AxAR/H4/O3bsyEjv7OxknmEkY4yZY1kBwxlfcOeqMia3Ghoa8Hq9qdeTk5OMjY3lsUbGmPVkwYAhIi4RebeIfFdEBoBjQK+IHHGW+dix0PvN2uJyuWhpaclIs4FvY8xSLdbC+C+gjcQSHk2qullVG4CrSVyp/XkR+bUc19GsIFu51hhzrhYb9H6LqkZmJ6rqCPAg8KCIeOe+zaxVtqaUMeZcLRgwksFCRPYAu5zko6r6wuwyZn2wFoYx5lwtGDBEpBJ4CNgMPAcIsEdEzgI3qep47qtoVtLsMYyBgQFCoRA+ny9PNTLGrBeLjWH8KXAI2KGqN6vqO4EdwC+Az+a6cmbl+f1+GhoaUq9VlZ6enjzWyBizXiwWMN4CfFJV48kE5/kfOHlmHbJxDGPMuVgsYITT7l+R4qSFclMlk2uzA4aNYxhjlmKxWVJ+EXklibGLdAJYp/c6ZS0MY8y5WCxg9AF3LZBn1qHZM6W6u7uJx+O4XLZSjDFmfotNq33DKtXD5JiqEgqFiEQiFBcXU1JSwvR0YoX5UCjE4OAgjY2Nea6lMWYtW2xa7S0L5avqt1a2OiYXkrdpDQQCuFwu4vE4jY2NdHR0pMp0dXVZwDDGLGixLql3zHr+nbTXCljAWAeSt2ktKSkhGo0SiUSorKzMKNPZ2cnll1+epxoaY9aDxbqk3p98LiK/TH9t1o9IJIKIMDY2xsTERGq583Q2U8oYs5jljHLajRPWKa/XSzAYZGRkBAC32019fX1GGQsYxpjF5HRajIjcKyIDIvJCWlqNiDwmIiecx+p53nuHU+aEiNyRy3oWuqKiIqLRKP39/QwPD9PT00NlZWXGrKjR0VEmJyfzWEtjzFq32P0wviMiD4vIw8AFyedpaYv5CnDdrLRPAj9U1R3AD53Xs7dbA3wKeBVwJfCp+QKLWVw4HMbj8dDY2EhtbS2bNm3C7XZTXZ25S62VYYxZyGKD3n+Z9vyvlvvhqvqEiGyblXwT8Abn+VeBHwGfmFXmrcBjzjLqiMhjJALPfcutg0mMYfj9fmpqapiYmCAWixGJRGhubmZ4eDhVrquri127di3wScaYjWyxQe/Hs6WLyGbgNiBr/iIaVbXX+fxeEWnIUqYFSL/8uMtJy1aXO4E7AbZs2XIO1Sl8Xq8XVaWyspLS0lIikQihUIi2tjZeeCHVW2hXfBtjFrTkMQwRqRORj4jIEyRaBbmctD97KRKYZ9BdVe9R1f2qun/2QK5J8Pl8VFVVMT09nQoWpaWlc5Y6ty4pY8xCFhvDKBeRXxeR7wE/By4ELlDVNlX9vXPcZr+INDuf3wwMZCnTReIeHEmtgK3BfY5EhPr6ejZv3ozHk2hURqNz1pSkt7c3a7oxxsDiLYwB4IMk7n3Rpqq/C4TPc5sPA8lZT3eQuEHTbN8HrhWRamew+1onzZwjEUFEiEQiVFdXU1paSl1dHWVlZakysViM3t7evNVRVQkGg0xMTBAMBlG1mdzGrCWLBYw/APzAl4DfF5G25Xy4iNwHPAXsFJEuEfkg8HngGhE5AVzjvEZE9ovIlyF1z/A/JXGjpl8An0kOgJtzF4lEcLlciCR6/EQk42ZKkL9uqXg8TldXF8eOHePUqVMcO3aMrq4u4vH44m82xqyKxQa9/xr4axG5ALgd+L/AJhH5BPBtVX1pkfffPk/Wm7OUPQT8Rtrre4F7F66+WQ6v10s8HkdVERFUlfr6etrb21NlOjs7ueqqq1a1XqqaChbJMZbi4mL6+voIh8Ns377dVtI1Zg1Y0v9CVW1X1c+q6h7gCqAS+I+c1sysuOTg99TUFNPT00xNTbFt27aMMvloYQSDQU6fPs309DQTExNMT0/T399PMBjk5MmTdHd3W/eUMWvAYtdhzKGqzwPPk+iuMutIcvC7oqKCSCSC1+uloqIio0xXV1eqBbJaJicnmZ6ezuh+isfjxONx3G43/f391NXVUVxcvGp1yof0Jei9Xi8+n29V/x2MWcyyA4YpLPX19fh8PkKhxB13p6amGB0dpaamZlW2H4/H6evrIxAIABAIBFBVotEoHo8n9by3t5ft27cX7AFUVRkYGGBwcDAVsOvr62loaCjY72zWHwsYG0i2+2JUVVXR0tKSMY7R1dW1KgEjOXbR2dlJLBYjFovh8XgIBAKICNPT07hcLlSVzs5OmpqaKCkpyXm94vE4ExMTTE1N4Xa7ERFcLhelpaX4/f6cHMCDwSBnzpwhFoul/m2mp6epqKgo+JaVWT8sYGwgyftilJaWpga9A4EAzc3Ncwa+L7300pzXZ2ZmhlOnTjE9PU1RURHT09NEo1EqKiqIRqMUFxczPT2NiNDe3k40GqWmpobx8XFOnjzJyMgIMzMzzMzM8Cu/8iv4/X6i0SgikrrexOVyUVRURHV1NRUVFYsOnsdiMY4cOUJPTw/BYJDJyUl8Ph91dXWUlpaydevWOWf9K9GVNDk5yfj4OKWlpakWxsTEBJOTkxYwzJqxpIAhIm8nMc11q/MeAVRVKxZ8o1lTsk2rdblcNDU1ZZQ734Hv5PUUU1NTAHPOzFWV6elpnnvuOc6cOYPb7cbv91NaWkosFsPv9zM2Nsbg4GBqEHxmZoaDBw/OO/h94MABILF0e/LP4/Hg8Xjw+/2Ul5dTU1NDS0sLJSUllJSU4PP5cLvdqQN0PB5ncHCQjo4OysvLmZqaSt1wqra2lqmpKXp6ejLO+uPxON3d3RlrctXW1tLS0rLkmV2qysjICKOjo0xMTBAKhVLBb3R0lLq6OuuWMmvCUlsYfwPcAjyvNl1l3co2rTYej89Zg2uhgKGqzMzMMDIywtTUFKqaMUheVFREMBhkcHCQYDCI2+2mvLycpqYm/H4/ExMTdHd3097ezsDAAFNTU8RiMaLRKOFwmJmZmfOaEZXs2pptvgsSXS5XRpBJvk4GuGTa+Pg45eXlFBcXE4lEuPjii3G5XHR2dnLmzBlcLleqpdTX10coFGLTpk3EYrFFWx2hUCg1lTgQCOD1epmcnEwFrWAwaK0MsyYsNWB0Ai9YsFjfktNqR0dHiUajzMzMUF5eTmNjYyqAAKmD/ey78sViMdrb23nxxRcZHh5mamoqNViePLh6PB7i8Tgej4eSkhIikUhG19H09DTh8PkuFrBykrOxIpHIksq7XC5+8pOf4PP5KC4uxuPx4Ha78Xq9qYP9sLGSAAAgAElEQVR6aWkpQ0NDtLa2smnTJlSVkpISKisrKSoqmhM8wuEwoVAIEUmtJByLxaiqqmJsbIy+vj62bdtmrQyTd0sNGB8HHhGRx4FQMlFV78pJrUxOiAh1dXWp6x6SXSwnT56kvLyc8fFxINGK6O7upq2tLfV6enqaZ555hhMnTjA5OZk6k4/H40xNTRGPxwmFQkSj0dRjLrhcLrxeL7FYLBXkki2l1TifSQ8wS7nhVLK14vV6KS8vp7S0lKqqqlSLZc+ePZSVlREIBCgvLycSiaQWiSwtLcXlcjE5OZnqpjImn5YaMD4LTJJYJqQod9UxuRYOhxkbG0uNMYyMjDAxMTHnYHvw4EHi8XjqHho/+9nPOH78eGoGUyQSyVlLobS0lIaGBurq6jIGlMPhcGqp9mQd3G43kAhq6UEsGo2mpuTGYrGM/GTaaiw7EovFUmM5yanD6Q4ePEh1dTWXXXYZfr+fqakpJicn8Xq9jIyMUFlZSTAYJBwOW8AwebfUgFGjqtfmtCZmVUQikYyz2ORU1qKizPOAZ555htHR0dQg+eDgID09K7dgcLL7Knljp7a2Nvbt20dTUxOlpaWpcvF4nPHxcUZGRhgaGmJmZgaPx0M0GsXn86VmPiUDXiQSSc2SUlXGx8fp6upibGyM6enpVBcaZAaZZABJH49J5k9OThIOh7OOjayE0dFRnnjiCVpbW9mxYwder5fKykoaGhpS04xtTS2zFiw1YPxARK5V1UdzWhuTc8nunHg8nnEA9Hq9GeWCwSAzMzOEw+FUl9Ryud1uioqKKC4uTs36SQan8vJyysrK2L59O3v27KGqqirrrCKXy0VVVRVVVVVs37592dNXVZVLL7006yB9tsfkNNyqqqrUVN+hoSHa29vp6elJjf9AovUQDodT103EYjFCoVDGOMRSu8ni8Thnz56ls7OThoYG2traUi0Sl8uVam3YOIbJp6UGjI8CHxeREBDBptWuWz6fj8bGRnp6elLdPPF4fE53RzgcJhqN4na7CYfDjI6OZv28kpKS1AHd7/fjcrkoLi5O9ccnPz8YDFJUVERNTQ1VVVU0NDRQX19PZWXlkqefigh+v39ZXTMikppGey6Sy8Bv3bqVoaEhXnrpJYaGhlIBVVUpLS2lpKQEl8vFxMREqjUQj8cZGRnB7XYTDAZTM8GS4z7prZ0kVaW/v5+BgQG2bdvGK1/5SsrLy1OtI+uWMvm0pIChquW5rohZHSJCa2srqsqJEyfo7e1lbGwsdY1GPB5HRPD5fKmz44GBgTlnym9+85t529veltF9NPv6i+Li4tSYCSSCS3l5ec6uls6VZNDZsmULra2tjI+Pp5YwSU67LSoqwuPx0NHRwZkzZwgEAkxPT+P3+6moqGB8fDzVCikqKmJmZoZ4PE4gEGB8fHxOd5eq0tHRQUdHB1u2bOHVr341W7ZssYBh8koWajKLyDZVPb1AvgAtqrom7u25f/9+PXToUL6rsS6k36xofHycjo4OHnvssdTBvbq6msrKSoaHh5mYmMh47zXXXMMtt9xiS45nEY/HGRsb4/Tp03R3d9Pf34/H42FiYgKPx8PU1FRqRlpyUD65lld/fz8zMzPzfnZzczM33ngje/futX1vVoyIHFbV/Uspu1gL4y9ExEXirniHgUESM6UuBN5I4r4WnyJxS1WzjogIxcXFFBcX09DQQHd3dypYQGIgNhQKzRm72LdvnwWLBbhcLqqrq6mqquKiiy7iyJEj9Pf3U1RURCAQwOfzEQ6HqayspKysLNWlV1paitfrpa+vj6eeeirrhYa9vb0cOHCAbdu28clPfnJdtdJMYVjsBkq/IiIXA+8BPgA0A9PAUeAR4LOqGsx5LU3ODQ4OzkmbHSw2bdrE+973PgsWSyAilJaWsn///tSaUMkpvdFoFK/XS3V1dWqsJzmQf+mll3LNNddw+PBhHnrooaz/LrOXpDdmtSw6hqGqLwJ/uFIbFJGdwDfSki4A/kRV/yatzBtItGo6nKRvqepnVqoOZq5bb72VCy+8kK997WupMYh0breb3/iN38Dn8+WhduuXy+WisrKSysrKecskL+5LEhG2b9/OG9/4Rtrb2zl8+HDGGNLRo0c5duwYu3btslaGWVWrfqqoqsdVda+q7gUuJ9Fi+XaWoj9OlrNgsTr27t3LH//xH3PRRRfNyYvFYvT19eWhVhtXNBqlsbFxzr9HJBLhq1/9akYXojGrId99C28GTqnqmTzXwziqq6v5nd/5Hd75zndmnL1eccUV7Nu3L48121hKS0spKytjenqasrIympubM/JHR0c5cOBAzpZgMSabfAeM24D75sm7SkSeFZH/EJFL5vsAEblTRA6JyKFs/b1m+VwuF9dffz0f//jHqauro7a2lve85z3W/bGK/H4/bW1t1NfXA1BXV0d5eebs9vb2du6//367CtysmgWn1aYKifwQ+CtVfSQt7R5VvfOcNyxSBPQAl6hq/6y8CiCuqpMicgPwBVXdsdhn2rTalTczM8Po6CibNm3Kd1U2nOQV9i+88ALHjx9neHiYjo6OORf83XLLLbzuda9bd9e3mLVhJafVJm0HPiEiV6jq/+ukLWkDC7geeHp2sABQ1fG054+IyN+LSJ2qDp3nNs0yJafemtWXnGl1xRVX0NzczMGDB6msrOTQoUMZF/o9/PDDhEIhmpqa2LRpEzU1NRQXF1vwMCtuqQEjQGK84W9F5DvAr63Atm9nnu4oEWkC+lVVReRKEl1nw9nKGlPoXC4Xra2tBAIBnnvuObZt28apU6dS+dFolB/84Ads27aNyspKqqqq2LZtG62trVRUVFjLw6yYpQYMUdUo8D9E5H3Ak0D1uW5UREqAa4DfTEv7MICq3g3cCnxERKLADHCb3bzJbGQul4tLLrkktTR7KBTKuDNiKBSip6cntdxIT08PDQ0NbN++Pet9yI05F0sNGHcnn6jqV0TkeRILEp4TVZ0GamelpW/ji8AXz/XzjSlEbrebXbt2MTY2htvtZmJiImNq7cTEBMXFxVRXV+Pz+ZieniYQCFBcXExlZaWtQ2XO25JmSanqgVmvD6vqB3JTJWPMfIqLi2lra6OmpoZdu3bNuZAyeZ/0aDRKJBIhEAgQCATW1G1xzfq11BaGMWYNSK42DIlrNdxuNwcPHswYBO/t7aW+vh6v10tRURHBYHBVbl9rCl++r8MwxiyTy+Vi8+bNXHnlldxwww3ceuutGfmxWIxjx46hqni93owl6I05HxYwjFmHkqsN19fX86Y3vYkbb7wxI39mZobe3l6Ki4sZHx9naGjILvAz580ChjEF4Prrr2fv3r0ZaWfPnuXZZ58lHA5z7Ngx2tvbLWiY82IBw5gC4HK5eN/73kdTU1NG+vHjx+nu7mZoaIinn37agoY5LxYwjCkQxcXFfOQjH8mYPquqHDlyhOnpaSYmJjhy5AhdXV02CG7OiQUMYwpIU1MTH/hA5oz3SCTCSy+9lLrg78yZMwSDdt8zs3wWMIwpMJdddhnXXXddRtr09DSdnZ0UFxcTCoWy3iTLmMVYwDCmAN14443s3LkzI21gYCDVHWVdUuZcWMAwpgC53W4+/OEPp+6nkfTss8/S3d3NzMyMBQ2zbBYwjClQJSUlfPSjH6WoqCiVpqr88pe/pL+/f859NYxZjAUMYwpYc3Mzt99+e0ZaMBjkoYcesnEMs2wWMIwpcJdccgmXXJJ5l+PBwUEefPBB65Yyy2IBw5gCJyK8+tWvprm5OSP98OHD/OhHP8pPpcy6ZAHDmAJXVFREcXExV199NRUVFRl5DzzwACdOnMhTzcx6YwHDmALn8/koKyvD7Xbz5je/GY/n5bsaxONxDhw4wOjoaB5raNaLvAUMETktIs+LyDMicihLvojI34rISRF5TkT25aOexqx3IkJTUxO1tbXU1tbymte8JiN/YmKCu+++m0gkkqcamvUi3y2MN6rqXlXdnyXvemCH83cn8KVVrZkxBcTv91NVVcXExASbN29m9+7dGfmnT5/mvvvus0Fws6B8B4yF3AR8TRN+BlSJSPNibzLGzCUiVFRU4Pf7icVi7N69m02bNmWU+clPfsITTzyRpxqa9SCfAUOBR0XksIjcmSW/BehMe93lpGUQkTtF5JCIHBocHMxRVY0pDMFgEJfLRTgcZt++fZSUlGTk33///Zw8eTJPtTNrXT4DxmtUdR+JrqePisjrZuVLlvfMaS+r6j2qul9V989eBsEY87LkXfrGxsaAxOypq6++Gq/Xmypjg+BmIXkLGKra4zwOAN8GrpxVpAvYnPa6FehZndoZU3iS02urq6uprKykoqKCmpoa3vSmN2WUGx8f58CBAzYIbubIS8AQkVIRKU8+B64FXphV7GHg153ZUq8GxlS1d5WrakzB8Pl81NbWEg6HmZycZGhoiGg0SnV19ZyZUx0dHdx///15qqlZqzyLF8mJRuDbIpKsw7+q6vdE5MMAqno38AhwA3ASmAben6e6GlMQRISWlhbC4TAnTpygrKwMEaGyspLGxkZGRkY4evRoqvyTTz7J1q1bed3rZvcWm40qLwFDVduBy7Kk3532XIGPrma9jCl0LpeLuro6+vv7CYfDqCrDw8N4PB5uvvlmhoaGSJ88cv/999PS0kJbW1sea23WirU8rdYYkyPBYBARIRAIMDQ0REdHB6dPn+Zd73oXPp8vVS4Wi3H33XcTCATyWFuzVljAMGaDSc6WGh0dTQWOsrIywuEwIsK73/3ujPI2CG6SLGAYs8EkZ0sl15cCiEQiqdbGK17xijn3BG9vb+eBBx7IR3XNGmIBw5gNJjlbKhKJEAqFiEQixONxQqEQPT099PT08I53vIOLL744431PPPEEP/7xj/NUa7MWWMAwZoNJzpbavn07JSUlRKNRwuEwoVCIWCzGsWPHOH36NB/4wAeoq6vLeO99993HqVOn8lRzk28WMIzZgFwuF1u3bmXLli00Njbi9/vxer2EQiECgQBPP/00/f39fPjDH864J3gsFuPAgQOpq8XNxmIBw5gNyu/309TURCwWIxKJEI1G8Xq9xONxAoEAhw8fJhAIcNttt2W8b2xsjAMHDhCNRvNUc5MvFjCM2aCSXVNbt27F4/HgdrsJhUKEQiEmJyfp6+vjpz/9KcPDw+zduzfjvadOnbJB8A3IAoYxG5jL5aKtrY3W1lY8Hg+qmronhqoyPj7OiRMniMfj1NTUZLz38ccf58knn8xHtU2eWMAwZoMrLi5m586d1NfX43IlDglutxuXy4Wq4vV6icVibN26NeOiPkgMgnd0dOSj2iYPLGAYs8GJCI2NjVxxxRVs376diooKioqKEBHcbjfxeJxoNMrMzAxNTU04a8ABEI1G+dKXvmSD4BtEvhYfNMasISJCVVUVe/bswev10tHRwcTERCo/2U3l8/lobm6mp+flOw2MjY3xpS99id/93d/NuLfGcsXjccbHxxkdHSUcDhOPxxGR1JXo1dXVFBcXZwQss7osYBhjgJdbGhUVFTQ1NXHmzBn6+voYHR0lHo/j9XpRVaqrqwmFQgwPD6fe29HRwd/93d9x44034vP58Pv9lJWV4ff7gcTaVRMTE0xOThIOh4FEEBKR1LhJT08Pg4ODTE5OMjk5SSwWw+Vy4fV6KS0tpby8nK1bt3LhhRdSVVWV6j4zq0cK6abv+/fv10OHDuW7Gsase6pKMBhkfHyckydP8tJLLxGNRlNrT83MzNDd3c3MzEzG+/btO8yWLSO4XNW4XDX4fPX86Efl+P1ufD4XbrefSKSFWCw2Z5uxWAy3242I4PF4CIVCuN3uVOsmGbSqq6vZvn07e/bsscCxAkTksKruX0pZa2EYY+ZILlBYXFxMXV0dZWVlHDt2jJmZGaLRKCLCli1baG8/QSQST73vmWf2Ulf3MLW1iYHwiYlSurvfA8Scvwgix/H5fHi9XoqLi/F4PKmWiIhkBBMRSV3v4XK5iMfjDAwMMDo6ypkzZ2hpaeGiiy6itrbWuqtWgQUMY8yC3G43e/bsYfPmzTz//POcPXuW0dFRYrEY27e7OXUqTCyWOJQUFYVQffmgPTpaN+fzkq2XZDdVktfrTV1xngwkyS6r5IytWCyGiBAOh+nv72dgYICOjg6qq6vZtm0bra2tVFRU4Pf7LXjkgAUMY8yiXC4XNTU1XH311QwMDPDLX/6SsbExpqc72L//Zxw8+Fpqa/t57Wsfo6RkOvW+bAFjPpFIZM4S6l6vF6/Xi8/no7i4mJKSklResrsqEAgQCATo7Oykurqa5uZmNm/ezNatW63VscJWfQxDRDYDXwOagDhwj6p+YVaZNwAPAckJ3t9S1c8s9tk2hmFM7qkqAwMD9PX1cebMGXp6ehgY6KekJIbPN4PbPYnPF0RkApEIExMxpqfdTEwUMTZWSSTiPq/tu91u/H4/fr8fj8dDSUkJLpcLj8dDPB6nqKgIv99PY2MjTU1NtLS0UFNTY8FjHmt9DCMK/K6qPi0i5cBhEXlMVV+cVe7Hqvr2PNTPGLMAEaGhoYHKykq2bdvGzMwMgUCAkZGR1ED58PAwwWAoNSOqoqKITZvKUgfuUCjE4OAgAwMDDA4OLus6jlgsxtTUFFNTU6k0l8uFz+dLzdDyer0EAgFOnTpFZWUllZWVtLa20tDQQE1NDRUVFTZYfg5WPWCoai/Q6zyfEJGjQAswO2AYY9YoEUmd5VdWVtLU1ISqptaiCgaDTE1NEYlEUFV8Pl9qamy28YXp6Wk6Ozvp7Ozk7NmzdHZ20tvby1J7QOLxODMzMxmztkQkFUSKioo4duwYtbW1VFdXU1tbS0tLS+o6D7vWY2nyOq1WRLYBTwC7VXU8Lf0NwINAF9AD/J6qHpnnM+4E7gTYsmXL5WfOnMltpY0xqyIcDtPd3Z0KIJ2dnXR1dZ33KrlFRUWpgXW/359qlZSWllJZWcnmzZs3VDfWcrqk8hYwRKQMeBz4rKp+a1ZeBRBX1UkRuQH4gqruWOwzbQzDmMIWi8Xo6+vj7NmzqUBy9uxZQqHQeX2u1+tNBZKysjLq6+upr6/fEDOv1nzAEBEv8O/A91X1riWUPw3sV9WhhcpZwDBm44nH4wwNDXHy5ElefPFFzp49y8jIyJwZV8vl8Xjw+fyMj1/AFVcUs2tXW0FeLLimA4YkQvRXgRFV/e15yjQB/aqqInIl8E1gqy5SWQsYxmxs6Veo9/b28vzzz9PV1UUgEGBycvK8u7MuuugS9u69pKAuFlzrs6ReA7wXeF5EnnHS/gDYAqCqdwO3Ah8RkSgwA9y2WLAwxpj0K9QbGxu59NJLGR8fZ2RkJHWRX19fH4FAgKmpKYLB4LJaInfddRNXXXWct7zlMRoaqrjwwgtpa2ujpKRk3QeOpbC1pIwxG4KqMjMzw8jICFNTU6gq8XickZERTp06lVpocXp6OuuYSDBYwte+dhcgVFePcc01P+O1r+2gqamWCy64YN2Odaz1FoYxxqw6EaGkpCTjanFIBJLLL7+ciYkJxsfHOX36NL29vbS3Bzh8uJaREaGmpotgsAxIBILR0UoeeOCt/PCHo7zlLU9xxRVPUltbSUNDA01NTWzfvp3KysqCGusAa2EYY0yGeDzO2NhYKnCcODHJt761g5/+dA/RaPZz7Pr6Ed7ylp/wyleeoLi4iOrqalpbW9fFIPmaHvTOJQsYxpiVkj6A3tXVxeHDfdx33zZ+/ONdxGLZlzdpbBzm2mt/ymWXncTtFmpra9myZcuaDhwWMIwxZgUlxz+GhoZ48skzfPnLjTz+eBvxePbA0dw8xLXX/oRLLjmB1+uhpqaGCy64gL1791JaWrqmxjgsYBhjTI7E43ECgQCPPnqCu++u48c/3k48nr3l0NLSzzXX/IRLLunA43HT1NTExRdfvKZmVlnAMMaYHEuOdTzxRA9/93eV/Od/bkI1e+DYvLmPa655kp07OygvL6OpqYndu3dzwQUX4Haf3+q958sChjHGrJLkWMfhw1P82Z+5ePTR6oybSKXburWH669/il27uqmoSNyjfO/evXkd37CAYYwxeaCqHDo0wx/9UZhHH62at9z27V1cd91P2bGjm7q6urwOjFvAMMaYPFJVDh6c4ROfmOaJJ+a/62Bb21kncPRTX19PW1sbu3fvXtXxDQsYxhizBsTjcR5/fII/+qMIP/3p/IHjoovO8La3HWTHjmFaW1u58MILV+0WsxYwjDFmDYnH4/zwh4nA8fOfzx84du1q5/rrf8bFF0+zZcsWdu7cyebNm3PaTWUBwxhj1qBYLMY3v9nD5z7n47nnGuYtt3v3KW688ZdcckmYvXv3snPnzpzNprKAYYwxa5SqMj09zQMP9PGXf1nOiy/OHzguvfQkt9zyHFdfXZWz2VQWMIwxZo1LBo5/+Zdu7rqripdemj9w7N17nF/91eNcdVXlis+msoBhjDHrRDwe5+zZTu67b5Avf3kL7e3ZA4eIsm/fcW677QRXX92wYrOpLGAYY8w6klyr6syZs9x//xhf+cp2zp6dL3DEedWrXuL97+/m6qs3nfdsKgsYxhizDiW7qX75y2f4t38L8uCDl9LdXZ+1rMsV57/9txN86EP9vP71W895NtVyAkZerkUXketE5LiInBSRT2bJ94nIN5z8gyKybfVraYwxq0tEKC0t5aqrXs3HPraFL3zhSe688/s0NQ3NKRuPu3jyyZ28//2v4YMfjPDkk2eIx+O5rd9qtzBExA28BFwDdAG/AG5X1RfTyvwP4FJV/bCI3AbcrKq/uthnWwvDGFMokq2NU6dOcfTocR59tILvfnc//f21Wct7PDF+67cm+Iu/qFxW99Rav0XrlcBJVW0HEJH7gZuAF9PK3AR82nn+TeCLIiJaSP1nxhizgGRrY8+ePbS1tbFjx3Fe//rv8cQTTTz88D4GB6szykejbvz+AKGQH7/fn5M65SNgtACdaa+7gFfNV0ZVoyIyBtQCc9plInIncCfAli1bclFfY4zJm2Tg2Lt3L7W1tTQ2HuPyy7/J44+38oMfXMXwcGKRw8bGKd7xjmEikdqCChjZ2kqzWw5LKZNIVL0HuAcSXVLnVzVjjFmbXC4XW7Zsob6+nubmk1RVHeGNb/wWhw5dzEMP7eG97+2gtNSH1+vNWR3yETC6gM1pr1uBnnnKdImIB6gERlanesYYszaJCCUlJezevZvKykpOnTrF5s0j3HLLz6isLKe+fis+ny9n289HwPgFsENEtgPdwG3Au2eVeRi4A3gKuBX4Txu/MMaYhGRro6GhgampKQBKS0vx+/05Xd121QOGMybxMeD7gBu4V1WPiMhngEOq+jDwj8A/i8hJEi2L21a7nsYYs5aJCMXFxRQXF6/aNvPRwkBVHwEemZX2J2nPg8CvrHa9jDHGzC8/N5E1xhiz7ljAMMYYsyQWMIwxxiyJBQxjjDFLUlCr1YrIIHBmCUXryHLV+AZj+yDB9kOC7YeNuw+2qmr2JXFnKaiAsVQicmipi20VKtsHCbYfEmw/2D5YCuuSMsYYsyQWMIwxxizJRg0Y9+S7AmuA7YME2w8Jth9sHyxqQ45hGGOMWb6N2sIwxhizTBYwjDHGLEnBBwwROS0iz4vIMyJyyEmrEZHHROSE81i92OesNyJyr4gMiMgLaWlZv7ck/K2InBSR50RkX/5qvrLm2Q+fFpFu5zfxjIjckJb3+85+OC4ib81PrVeWiGwWkf8SkaMickREfstJ31C/hwX2w4b6PZwXVS3oP+A0UDcr7f8DPuk8/yTw5/muZw6+9+uAfcALi31v4AbgP0jc6fDVwMF81z/H++HTwO9lKXsx8CzgA7YDpwB3vr/DCuyDZmCf87wceMn5rhvq97DAfthQv4fz+Sv4FsY8bgK+6jz/KvDOPNYlJ1T1CebepXC+730T8DVN+BlQJSLNq1PT3JpnP8znJuB+VQ2pagdwErgyZ5VbJaraq6pPO88ngKNACxvs97DAfphPQf4ezsdGCBgKPCoih0XkTietUVV7IfEjAhryVrvVNd/3bgE608p1sfB/pELwMae75d60LsmC3w8isg14JXCQDfx7mLUfYIP+HpZrIwSM16jqPuB64KMi8rp8V2gNynZPx0Keb/0loA3YC/QCf+WkF/R+EJEy4EHgt1V1fKGiWdIKeT9syN/DuSj4gKGqPc7jAPBtEk3K/mQT23kcyF8NV9V837sL2JxWrhXoWeW6rRpV7VfVmKrGgX/g5W6Ggt0PIuIlcZD8uqp+y0necL+HbPthI/4ezlVBBwwRKRWR8uRz4FrgBeBh4A6n2B3AQ/mp4aqb73s/DPy6Mzvm1cBYsquiEM3qj7+ZxG8CEvvhNhHxich2YAfw89Wu30oTEQH+ETiqqnelZW2o38N8+2Gj/R7OS75H3XP5B1xAYpbDs8AR4A+d9Frgh8AJ57Em33XNwXe/j0TzOkLiTOmD831vEk3v/0NiFsjzwP581z/H++Gfne/5HImDQnNa+T909sNx4Pp813+F9sFrSXSlPAc84/zdsNF+Dwvshw31ezifP1saxBhjzJIUdJeUMcaYlWMBwxhjzJJYwDDGGLMkFjCMMcYsiQUMY4wxS2IBw5gcEZFiEXlcRNzLeM/HROT9uayXMefKptUakyMi8lHAo6pfWMZ7SoCfqOorc1czY86NtTCMWSYRucJZqM7vrCZwRER2Zyn6Hpyrp0XkDU5r4wEReUlEPi8i7xGRn0vifi1tAKo6DZwWkQ29KqpZmzz5roAx642q/kJEHgb+DCgG/kVVX0gvIyJFwAWqejot+TLgFSSWW28HvqyqVzo38vl/gN92yh0CrmajL0Nh1hwLGMacm88AvwCCwP/Mkl8HBGal/UKdNZlE5BTwqJP+PPDGtHIDwK4Vra0xK8C6pIw5NzVAGYk7t/mz5M9kSQ+lPY+nvY6TefLmd3pQjj4AAAC2SURBVN5vzJpiAcOYc3MP8MfA14E/n52pqqOAW0SyBZP/v507tk0gCKIA+qcZcgJHZPQBRZA7dyUUYSFRAg0hDcEFTix5T6e1CN6Ld6XJvkY7O3/Z5WdjKrwNgQErVdU5ybO7r0m+knxU1fGXo99ZNqSudUhy21AiTGGsFiapqn2SS3efZt6B/6LDgEm6+5HkvubjXpbH8s9JJcEmOgwAhugwABgiMAAYIjAAGCIwABgiMAAY8gJ4QmdywOuU8wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ { 'slope': -0.006232531713848901,\n", + " 'type': 'land',\n", + " 'x_end': 87.0,\n", + " 'x_start': 54.0,\n", + " 'z_end': 18.907362973310256,\n", + " 'z_mean': 18.226859544431967,\n", + " 'z_start': 18.244707421270647},\n", + " { 'slope': 0.10048504940215892,\n", + " 'x_end': 90.0,\n", + " 'x_start': 87.0,\n", + " 'z_end': 18.81114066206634,\n", + " 'z_mean': 18.95124513461371,\n", + " 'z_start': 19.011103385573893},\n", + " { 'slope': 0.7867562476656698,\n", + " 'x_end': 105.0,\n", + " 'x_start': 90.0,\n", + " 'z_end': 8.264119331473214,\n", + " 'z_mean': 13.443236505259332,\n", + " 'z_start': 18.482680684877423},\n", + " { 'slope': 0.138231538826561,\n", + " 'x_end': 108.0,\n", + " 'x_start': 105.0,\n", + " 'z_end': 7.625424767531349,\n", + " 'z_mean': 7.719382219664138,\n", + " 'z_start': 7.899377829775406},\n", + " { 'slope': -0.24669278691155727,\n", + " 'x_end': 111.0,\n", + " 'x_start': 108.0,\n", + " 'z_end': 8.25183247996525,\n", + " 'z_mean': 8.037437899312298,\n", + " 'z_start': 7.767262334494268},\n", + " { 'slope': -0.022224358740496428,\n", + " 'x_end': 138.0,\n", + " 'x_start': 111.0,\n", + " 'z_end': 8.805851879663944,\n", + " 'z_mean': 8.69776858676918,\n", + " 'z_start': 8.321441165942321},\n", + " { 'slope': 0.011690412029154119,\n", + " 'x_end': 174.0,\n", + " 'x_start': 138.0,\n", + " 'z_end': 8.399119455457473,\n", + " 'z_mean': 8.591198407135863,\n", + " 'z_start': 8.769268316237742},\n", + " { 'slope': 0.06596545786924302,\n", + " 'x_end': 183.0,\n", + " 'x_start': 174.0,\n", + " 'z_end': 7.84469125226732,\n", + " 'z_mean': 8.148131103000907,\n", + " 'z_start': 8.376950179198564},\n", + " { 'slope': 0.19014969366205653,\n", + " 'x_end': 213.0,\n", + " 'x_start': 183.0,\n", + " 'z_end': 2.9990666738937883,\n", + " 'z_mean': 5.087790707786215,\n", + " 'z_start': 7.748699573256347},\n", + " { 'slope': 0.012096582737314357,\n", + " 'type': 'berm',\n", + " 'x_end': 219.0,\n", + " 'x_start': 213.0,\n", + " 'z_end': 2.9163517442302123,\n", + " 'z_mean': 2.9347601110839676,\n", + " 'z_start': 2.975348176164513},\n", + " { 'slope': 0.03056014910314705,\n", + " 'x_end': 255.0,\n", + " 'x_start': 219.0,\n", + " 'z_end': 2.050738949067936,\n", + " 'z_mean': 2.653057687157337,\n", + " 'z_start': 2.927273834441084},\n", + " { 'slope': 0.06806395674070564,\n", + " 'type': 'foreshore',\n", + " 'x_end': 285.5,\n", + " 'x_start': 255.0,\n", + " 'z_end': 0.04691924522162938,\n", + " 'z_mean': 1.100297110086715,\n", + " 'z_start': 2.0068617905167647}]\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ { 'slope': 0.0008328773436106309,\n", + " 'type': 'berm',\n", + " 'x_end': 58.0,\n", + " 'x_start': 37.0,\n", + " 'z_end': 1.8572595562110041,\n", + " 'z_mean': 1.8943805115420846,\n", + " 'z_start': 1.910394386927169},\n", + " { 'slope': -0.021220543877635122,\n", + " 'type': 'berm',\n", + " 'x_end': 138.0,\n", + " 'x_start': 58.0,\n", + " 'z_end': 3.5977328867797485,\n", + " 'z_mean': 2.7247048500781106,\n", + " 'z_start': 1.8468598845719795},\n", + " { 'slope': -0.06381773295732189,\n", + " 'x_end': 142.0,\n", + " 'x_start': 138.0,\n", + " 'z_end': 3.8359998018824712,\n", + " 'z_mean': 3.741723519647647,\n", + " 'z_start': 3.6479493664613014},\n", + " { 'slope': -0.016157748520191067,\n", + " 'x_end': 157.0,\n", + " 'x_start': 142.0,\n", + " 'z_end': 4.169920934351783,\n", + " 'z_mean': 4.013083138991948,\n", + " 'z_start': 3.8843177342116757},\n", + " { 'slope': -0.1322171985012303,\n", + " 'x_end': 177.0,\n", + " 'x_start': 157.0,\n", + " 'z_end': 6.427354838550462,\n", + " 'z_mean': 5.4360212510513115,\n", + " 'z_start': 4.223480595415142},\n", + " { 'slope': 0.34782985777944603,\n", + " 'x_end': 193.0,\n", + " 'x_start': 177.0,\n", + " 'z_end': 1.3683244048034364,\n", + " 'z_mean': 3.876447007928749,\n", + " 'z_start': 6.295019014555152},\n", + " { 'slope': 0.06019958288565148,\n", + " 'type': 'foreshore',\n", + " 'x_end': 213.5,\n", + " 'x_start': 193.0,\n", + " 'z_end': 0.06618164722605435,\n", + " 'z_mean': 0.6722026822899186,\n", + " 'z_start': 1.1980470061124415}]\n" + ] + } + ], + "source": [ + "from scipy.signal import savgol_filter\n", + "import re\n", + "from scipy.stats import linregress\n", + "import warnings\n", + "warnings.simplefilter(action='ignore', category=FutureWarning)\n", + "\n", + "def get_breakpoints(model, min_distance=20):\n", + " # Get breakpoints\n", + " breakpoints = []\n", + " for line in model.summary().split('\\n'):\n", + " # Get unpruned lines\n", + " if 'No' in line and 'None' not in line:\n", + " # Get break points\n", + " m = re.search(\"h\\(x0-(\\d*\\.?\\d+)\\)\", line)\n", + " if m:\n", + " breakpoints.append(float(m.groups()[0]))\n", + " m = re.search(\"h\\((\\d*\\.?\\d+)-x0\\)\", line)\n", + " if m:\n", + " breakpoints.append(float(m.groups()[0]))\n", + " return sorted(list(set(breakpoints)))\n", + " \n", + "def get_segments(breakpoints, x_min, x_max):\n", + " segments = []\n", + " breakpoints = [x_min] + breakpoints + [x_max]\n", + "\n", + " for x1, x2 in zip(breakpoints, breakpoints[1:]):\n", + " segments.append({\n", + " 'x_start': x1,\n", + " 'x_end': x2\n", + " })\n", + " return segments \n", + "\n", + "def get_segment_slopes(segments, x, z):\n", + " for segment in segments:\n", + " mask = ma.masked_where((segment['x_start'] < x) & (x < segment['x_end']),x ).mask\n", + " segment['z_mean'] = np.mean(z[mask])\n", + " segment['z_start'] = np.mean(z[mask][0])\n", + " segment['z_end'] = np.mean(z[mask][-1])\n", + " segment['slope'] = -linregress(x[mask], z[mask]).slope\n", + " return segments\n", + " \n", + "def classify_segments(segments, x,z):\n", + " \n", + " # Most seaward slope must be foreshore\n", + " segments[-1]['type'] = 'foreshore'\n", + " \n", + " # Most landward slope must be land\n", + " segments[0]['type'] = 'land'\n", + " \n", + " # Segments with really high slopes must be structures\n", + " for seg in segments:\n", + " if seg['slope'] > 2.0:\n", + " seg['type'] = 'structure'\n", + " \n", + " # Segments with large change of slope and \n", + " # Segment with max slope should be dune face\n", + "# dune_face_idx = [n for n, seg in enumerate(segments) if seg['slope']==max(x['slope'] for x in segments)][0]\n", + "# segments[dune_face_idx]['type'] = 'dune_face'\n", + " \n", + " # Pick out berms \n", + " for seg in segments:\n", + " if (-0.03 < seg['slope'] < 0.03 # berms should be relatively flat\n", + " and 0 < seg['z_mean'] < 4 # berms should be located between 0-4 m AHD\n", + " ): # berms should be seaward of dune face\n", + " seg['type'] = 'berm'\n", + " \n", + "# slope = None\n", + "# for seg in reversed(segments):\n", + "# if slope is None:\n", + "# continue\n", + "# elif slope - 0.03 < seg['slope'] < slope + 0.03:\n", + "# seg['type'] = 'foreshore'\n", + "# else:\n", + "# break\n", + " \n", + " return segments\n", + "\n", + "def get_piecewise_linear_model(x,z):\n", + " #Fit an Earth model\n", + " model = Earth(penalty=3,thresh=0.0005)\n", + " model.fit(x,z)\n", + " return model\n", + "\n", + "def plot_profile_classification(site_id, profile_type):\n", + " df_profile = df_profiles.query(\"site_id == '{}' and profile_type == '{}'\".format(site_id, profile_type))\n", + " x = np.array(df_profile.index.get_level_values('x').tolist())\n", + " z = np.array(df_profile.z.tolist()) \n", + " \n", + " nan_mask = ma.masked_invalid(z).mask\n", + " x = x[~nan_mask]\n", + " z_unfiltered = z[~nan_mask]\n", + " z = savgol_filter(z_unfiltered, 51, 3)\n", + " \n", + " model = get_piecewise_linear_model(x,z)\n", + " breakpoints = get_breakpoints(model)\n", + " segments = get_segments(breakpoints, x_min=x.min(), x_max=x.max())\n", + " segments = get_segment_slopes(segments, x=x, z=z)\n", + "# segments = merge_similar_segments(segments)\n", + " segments = classify_segments(segments, x=x, z=z)\n", + " \n", + " pyplot.figure()\n", + " pyplot.plot(x,z_unfiltered, color='0.5',marker='.', alpha=.2, ms=10,linestyle=\"None\")\n", + "\n", + " # Plot different segments\n", + " foreshore_segments = [x for x in segments if x.get('type') == 'foreshore']\n", + " for seg in foreshore_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='b')\n", + "\n", + " land_segments = [x for x in segments if x.get('type') == 'land']\n", + " for seg in land_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='g')\n", + "\n", + " berm_segments = [x for x in segments if x.get('type') == 'berm']\n", + " for seg in berm_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='y')\n", + "\n", + " dune_face_segments = [x for x in segments if x.get('type') == 'dune_face']\n", + " for seg in dune_face_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='r')\n", + " \n", + " structure_segments = [x for x in segments if x.get('type') == 'structure']\n", + " for seg in structure_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='m')\n", + " \n", + " unclassified_segments = [x for x in segments if x.get('type') is None]\n", + " for seg in unclassified_segments:\n", + " pyplot.plot([seg['x_start'], seg['x_end']],\n", + " [seg['z_start'], seg['z_end']],\n", + " linewidth=4, \n", + " color='0.4')\n", + "\n", + " pyplot.xlabel('x (m)')\n", + " pyplot.ylabel('z (m AHD)')\n", + " pyplot.title('{} profile at {}'.format(profile_type, site_id))\n", + " pyplot.show()\n", + "\n", + " import pprint\n", + " pp = pprint.PrettyPrinter(indent=4)\n", + " pp.pprint(segments)\n", + "\n", + "plot_profile_classification('NARRA0018', 'prestorm')\n", + "plot_profile_classification('NARRA0019', 'prestorm')\n", + "plot_profile_classification('CRESn0017', 'poststorm')" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "## Try lmfit" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "hidden": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T01:13:41.773484Z", + "start_time": "2018-12-05T01:13:27.230746Z" + }, + "code_folding": [ + 0 + ], + "hidden": true, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[Model]]\n", + " Model(piecewise_linear)\n", + "[[Fit Statistics]]\n", + " # fitting method = ampgo, with L-BFGS-B as local solver\n", + " # function evals = 79866\n", + " # data points = 491\n", + " # variables = 8\n", + " chi-square = 65.4379204\n", + " reduced chi-square = 0.13548224\n", + " Akaike info crit = -973.533027\n", + " Bayesian info crit = -939.961474\n", + "[[Variables]]\n", + " x0: 62.1499306 (init = 40.5)\n", + " x1: 181.207436 (init = 40.5)\n", + " x2: 196.301872 (init = 40.5)\n", + " b: 5.81709441 (init = 0)\n", + " k1: 0.06544372 (init = 0)\n", + " k2: -0.07421739 (init = 0)\n", + " k3: -0.32199700 (init = 0)\n", + " k4: 0.29325377 (init = 0)\n", + "\n" + ] + } + ], + "source": [ + "from lmfit import Model, Parameters\n", + "\n", + "def get_data():\n", + " site_id='NARRA0018'\n", + " profile_type='prestorm'\n", + " df_profile = df_profiles.query(\"site_id == '{}' and profile_type == '{}'\".format(site_id, profile_type))\n", + " x = np.array(df_profile.index.get_level_values('x').tolist())\n", + " z = np.array(df_profile.z.tolist()) \n", + "\n", + " nan_mask = ma.masked_invalid(z).mask\n", + " x = x[~nan_mask]\n", + " z = z[~nan_mask]\n", + " return x,z\n", + "\n", + "# def piecewise_linear(x, x0, x1, b, k1, k2, k3):\n", + "# condlist = [x < x0, (x >= x0) & (x < x1), x >= x1]\n", + "# funclist = [lambda x: k1*x + b, lambda x: k1*x + b + k2*(x-x0), lambda x: k1*x + b + k2*(x-x0) + k3*(x - x1)]\n", + "# return np.piecewise(x, condlist, funclist)\n", + "\n", + "# x,z = get_data()\n", + "\n", + "# fmodel = Model(piecewise_linear)\n", + "# params = Parameters()\n", + "# params.add('x0', value=0, vary=True, min=min(x), max=max(x))\n", + "# params.add('x1', value=0, vary=True, min=min(x), max=max(x))\n", + "# params.add('b', value=0, vary=True)\n", + "# params.add('k1', value=0, vary=True, min=-0.01, max=0.01)\n", + "# params.add('k2', value=0, vary=True, min=-0.1, max=-0.5)\n", + "# params.add('k3', value=0, vary=True, min=0.1, max=0.5)\n", + "\n", + "def piecewise_linear(x, x0, x1, x2, b, k1, k2, k3,k4):\n", + " condlist = [x < x0, (x >= x0) & (x < x1), (x >= x1) & (x < x2), x >= x2]\n", + " funclist = [lambda x: k1*x + b, lambda x: k1*x + b + k2*(x-x0), lambda x: k1*x + b + k2*(x-x0) + k3*(x - x1), lambda x: k1*x + b + k2*(x-x0) + k3*(x - x1) +k4*(x-x2)]\n", + " return np.piecewise(x, condlist, funclist)\n", + "\n", + "x,z = get_data()\n", + "\n", + "fmodel = Model(piecewise_linear)\n", + "params = Parameters()\n", + "params.add('x0', value=0, vary=True, min=min(x), max=max(x))\n", + "params.add('x1', value=0, vary=True, min=min(x), max=max(x))\n", + "params.add('x2', value=0, vary=True, min=min(x), max=max(x))\n", + "params.add('b', value=0, vary=True)\n", + "params.add('k1', value=0, vary=True, min=-0.5, max=0.5)\n", + "params.add('k2', value=0, vary=True, min=-0.5, max=0.5)\n", + "params.add('k3', value=0, vary=True, min=-0.5, max=0.5)\n", + "params.add('k4', value=0, vary=True, min=-0.5, max=0.5)\n", + "\n", + "\n", + "result = fmodel.fit(z, params, x=x,method='ampgo')\n", + "\n", + "\n", + "pyplot.figure()\n", + "pyplot.plot(x,z, color='0.5',marker='.', alpha=.2, ms=10,linestyle=\"None\")\n", + "pyplot.plot(x,result.best_fit, color='r')\n", + "pyplot.show()\n", + "print(result.fit_report())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Try spline" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-05T01:49:30.968871Z", + "start_time": "2018-12-05T01:49:30.648994Z" + }, + "code_folding": [ + 2 + ] + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from scipy.signal import savgol_filter\n", + "\n", + "def get_data():\n", + " site_id='NARRA0018'\n", + " profile_type='prestorm'\n", + " df_profile = df_profiles.query(\"site_id == '{}' and profile_type == '{}'\".format(site_id, profile_type))\n", + " x = np.array(df_profile.index.get_level_values('x').tolist())\n", + " z = np.array(df_profile.z.tolist()) \n", + "\n", + " nan_mask = ma.masked_invalid(z).mask\n", + " x = x[~nan_mask]\n", + " z = z[~nan_mask]\n", + " return x,z\n", + "\n", + "x,z = get_data()\n", + "\n", + "z_filtered = savgol_filter(z, 31, 3)\n", + "\n", + "\n", + "pyplot.figure()\n", + "pyplot.plot(x,z, color='0.5',marker='.', alpha=.2, ms=10,linestyle=\"None\")\n", + "pyplot.plot(x,z_filtered, color='r')\n", + "pyplot.show()\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.7" + }, + "toc": { + "base_numbering": 1, + "nav_menu": {}, + "number_sections": true, + "sideBar": true, + "skip_h1_title": false, + "title_cell": "Table of Contents", + "title_sidebar": "Contents", + "toc_cell": false, + "toc_position": {}, + "toc_section_display": true, + "toc_window_display": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b8ead25cd5df9ce415e183e28d45e0fdd8838bf3 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:59:43 +1100 Subject: [PATCH 6/7] Disable numpy futurewarnings when running from CLI --- src/cli.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cli.py b/src/cli.py index 210b91f..10b79e4 100644 --- a/src/cli.py +++ b/src/cli.py @@ -11,6 +11,9 @@ import analysis.forecast_twl as forecast_twl import analysis.forecasted_storm_impacts as forecasted_storm_impacts import analysis.observed_storm_impacts as observed_storm_impacts +# Disable numpy warnings +import warnings +warnings.simplefilter(action='ignore', category=FutureWarning) @click.group() def cli(): From 5f59c8f8ee6c0d50e5d5ab2da0af52a9c99f9a23 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 12:01:08 +1100 Subject: [PATCH 7/7] Update slope function to accept top x coordinate Needed to ensure correctly mean slope is calculated. If only inputting dune toe z coordinates, sometimes the function can chose the wrong x coordinate if there are multiple crossings of the z coordinate. --- src/analysis/forecast_twl.py | 38 ++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 1bb29c1..82efc65 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -23,6 +23,7 @@ def forecast_twl( runup_function, n_processes=MULTIPROCESS_THREADS, slope="foreshore", + profile_type='prestorm' ): # Use df_waves as a base df_twl = df_waves.copy() @@ -45,12 +46,14 @@ def forecast_twl( df_twl["beta"] = pd.concat(results) elif slope == "mean": - df_temp = df_twl.join(df_profile_features.query("profile_type=='prestorm'").reset_index(level='profile_type') + df_temp = df_twl.join(df_profile_features.query("profile_type=='{}'".format(profile_type)).reset_index( + level='profile_type') , how="inner") df_temp["mhw"] = 0.5 with Pool(processes=n_processes) as pool: results = pool.starmap( - mean_slope_for_site_id, [(site_id, df_temp, df_profiles, "dune_toe_z", "mhw") for site_id in site_ids] + mean_slope_for_site_id, [(site_id, df_temp, df_profiles, "dune_toe_z", "dune_toe_x", "mhw") for + site_id in site_ids] ) df_twl["beta"] = pd.concat(results) @@ -71,7 +74,8 @@ def forecast_twl( return df_twl -def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, btm_elevation_col): +def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, top_x_col, btm_elevation_col, + profile_type='prestorm'): """ Calculates the foreshore slope values a given site_id. Returns a series (with same indicies as df_twl) of foreshore slopes. This function is used to parallelize getting foreshore slopes as it is computationally @@ -83,7 +87,7 @@ def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, btm_ """ # Get the prestorm beach profile - profile = df_profiles.query("site_id =='{}' and profile_type == 'prestorm'".format(site_id)) + profile = df_profiles.query("site_id =='{}' and profile_type == '{}'".format(site_id, profile_type)) profile_x = profile.index.get_level_values("x").tolist() profile_z = profile.z.tolist() @@ -96,6 +100,7 @@ def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, btm_ top_elevation=row[top_elevation_col], btm_elevation=row[btm_elevation_col], method="end_points", + top_x= row[top_x_col] ), axis=1, ) @@ -191,7 +196,7 @@ def foreshore_slope_from_profile(profile_x, profile_z, tide, runup_function, **k iteration_count += 1 -def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, method="end_points"): +def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, method="end_points", top_x=None, btm_x=None): """ Returns a slope (beta) from a bed profile, given the top and bottom elevations of where the slope should be taken. :param x: List of x bed profile coordinates @@ -199,6 +204,9 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho :param top_elevation: Top elevation of where to take the slope :param btm_elevation: Bottom elevation of where to take the slope :param method: Method used to calculate slope (end_points or least_squares) + :param top_x: x-coordinate of the top end point. May be needed, as there may be multiple crossings of the + top_elevation. + :param btm_x: x-coordinate of the bottom end point :return: """ @@ -208,7 +216,18 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho end_points = {"top": {"z": top_elevation}, "btm": {"z": btm_elevation}} + + for end_type in end_points.keys(): + + # Add x coordinates if they are specified + if top_x and end_type == 'top': + end_points['top']['x'] = top_x + continue + if btm_x and end_type == 'top': + end_points['btm']['x'] = btm_x + continue + elevation = end_points[end_type]["z"] intersection_x = crossings(profile_x, profile_z, elevation) @@ -285,8 +304,10 @@ def crossings(profile_x, profile_z, constant_z): @click.option("--profile-features-csv", required=True, help="") @click.option("--runup-function", required=True, help="", type=click.Choice(["sto06"])) @click.option("--slope", required=True, help="", type=click.Choice(["foreshore", "mean"])) +@click.option("--profile-type", required=True, help="", type=click.Choice(["prestorm", "poststorm"])) @click.option("--output-file", required=True, help="") -def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv, runup_function, slope, output_file): +def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv, runup_function, slope, + profile_type,output_file): logger.info("Creating forecast of total water levels") logger.info("Importing data") df_waves = pd.read_csv(waves_csv, index_col=[0, 1]) @@ -295,15 +316,16 @@ def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) logger.info("Forecasting TWL") - df_twl_foreshore_slope_sto06 = forecast_twl( + df_twl = forecast_twl( df_tides, df_profiles, df_waves, df_profile_features, runup_function=getattr(runup_models, runup_function), slope=slope, + profile_type=profile_type ) - df_twl_foreshore_slope_sto06.to_csv(output_file) + df_twl.to_csv(output_file) logger.info("Saved to %s", output_file) logger.info("Done!")