From f4e3169bd19dcfd246ac4bc8d06e72ace6eacadc Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 10:48:27 +1100 Subject: [PATCH 01/65] Update beach orientations MATALB to run on command --- src/data/beach_orientations.m | 76 +++++++++++++++++++++++++++++------ 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/src/data/beach_orientations.m b/src/data/beach_orientations.m index d537ad6..df0a9a5 100644 --- a/src/data/beach_orientations.m +++ b/src/data/beach_orientations.m @@ -1,19 +1,39 @@ -% Calculate orientation the beach profile at each unique site and save to .mat file +% Calculate orientation the beach profile at each unique site and save to .mat file. Orientation is +% the number of degrees, anticlockwise from east, perpendicular to the shoreline (pointing towards +% land). + +%% Setup % Needs the following coastal tools: -% J:\Coastal\Tools\MALT Logspiral Transformation -% J:\Coastal\Tools\Coordinate Transformations +addpath('J:\Coastal\Tools\MALT Logspiral Transformation') +addpath('J:\Coastal\Tools\Coordinate Transformations') clear clc +%% Options +% Where is the profiles file located? This should contain a structure including the .lat and .lon +% for each analysed cross section +profilesFile = '..\..\data\raw\processed_shorelines\profiles.mat'; + +% Where should we store the processed beach orientations? +outputFile = '..\..\data\raw\processed_shorelines\orientations.mat'; + +% How far in meters does the profile extend towards land and sea? Used to provide end points of the +% cross section +distance = 200; + + +%% Script + % Load profile data, this is where we want to calculate orientations. warning('off','all') -data = load('C:\Users\z5189959\Desktop\nsw_2016_storm_impact\data\raw\processed_shorelines\profiles.mat'); +data = load(profilesFile); data = data.data; +% Save results to variable output = []; -for ii = 1:n +for ii = 1:length(data) disp(num2str(ii)) lat = data(ii).lat; lon = data(ii).lon; @@ -21,14 +41,41 @@ for ii = 1:n [x,y,utmzone] = deg2utm(lat,lon); if strcmp(beach, 'BOOM') == 1 || strcmp(beach, 'HARGn') == 1 || strcmp(beach, 'BILG') == 1 || strcmp(beach, 'HARGs') == 1 || strcmp(beach, 'DEEWHYn') == 1 - % log spiral transformation file is out of date. Talk to Mitch - continue - end + % These are straight beaches, load the transformation file directly and read the rotation angle. + parameterDir = 'J:\Coastal\Tools\MALT Logspiral Transformation'; + parameterFile = [parameterDir, filesep, beach, '.mat']; + parameterMat = load(parameterFile); + fields = fieldnames(parameterMat); + field = fields(1,1); + site = getfield(parameterMat, field{1}); + rot_angle = site.rot_angle; % Angle of the shoreline counter clockwise from east + + % Figure out end points in utm coordinates + + x_land = x - distance * cos(deg2rad(rot_angle)); + y_land = y + distance * sin(deg2rad(rot_angle)); + x_sea = x + distance * cos(deg2rad(rot_angle)); + y_sea = y - distance * sin(deg2rad(rot_angle)); + + [lat_land,lon_land] = utm2deg(x_land,y_land,utmzone); + [lat_sea,lon_sea] = utm2deg(x_land,y_land,utmzone); - if strcmp(beach, 'AVOCAs') == 1 - % negative solution. Talk to Mitch + row.lat_center = lat; + row.lon_center = lon; + row.lat_land = lat_land; + row.lon_land = lat_land; + row.lat_sea = lat_sea; + row.lon_sea = lon_sea; + row.orientation = rot_angle + 90; % Tangent to shoreline towards line + row.beach = beach; + output = [output; row]; continue end + +% if strcmp(beach, 'AVOCAs') == 1 +% % negative solution. Talk to Mitch +% continue +% end % Get the sp log spiral transformed coordinates xyz.x = x; @@ -56,7 +103,12 @@ for ii = 1:n [lat_sea,lon_sea] = utm2deg(xyz_sea.x,xyz_sea.y,utmzone); % Orientation in degrees anticlockwise from east, pointing towards land - orientation = radtodeg(atan2((xyz_land.y - xyz_sea.y), (xyz_land.x - xyz_sea.x))); + try + orientation = radtodeg(atan2((xyz_land.y - xyz_sea.y), (xyz_land.x - xyz_sea.x))); + catch + disp(['Cannot calculate orientation: ' beach]) + continue + end row.lat_center = lat; row.lon_center = lon; @@ -70,4 +122,4 @@ for ii = 1:n end warning('on','all') -save('orientations.mat','output','-v7') +save(outputFile','output','-v7') From ccf7601041b937db73f4fde90e4977402fe025b6 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:23:23 +1100 Subject: [PATCH 02/65] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8280973..156fcca 100644 --- a/.gitignore +++ b/.gitignore @@ -7,11 +7,14 @@ # Pycharm .idea +# Matlab +*.asv + # DotEnv configuration .env -*.asv # Python __pycache__/ *.py[cod] *$py.class +/.venv/ From 6d62a30b2f87656b69c9830e199ea1de3816cc66 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:24:30 +1100 Subject: [PATCH 03/65] Use pipenv to setup virtualenv and packages --- Pipfile | 24 ++++ Pipfile.lock | 301 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 325 insertions(+) create mode 100644 Pipfile create mode 100644 Pipfile.lock diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..b77f0b5 --- /dev/null +++ b/Pipfile @@ -0,0 +1,24 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +numpy = "*" +scipy = "*" +pandas = "*" +matplotlib = "*" +click = "*" +mat4py = "*" +black = "*" +shapely = "*" +fiona = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.7.13-cp37-cp37m-win_amd64.whl"} +gdal = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl"} + +[requires] +python_version = "3.7" + +[pipenv] +allow_prereleases = true diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..2f9b793 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,301 @@ +{ + "_meta": { + "hash": { + "sha256": "b69e9a3b98da8758ee19f86a9f158f31b6538abdbe55c3352ef0cb71cb617b5b" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.7" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "appdirs": { + "hashes": [ + "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", + "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" + ], + "version": "==1.4.3" + }, + "attrs": { + "hashes": [ + "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", + "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + ], + "version": "==18.2.0" + }, + "black": { + "hashes": [ + "sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", + "sha256:e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5" + ], + "index": "pypi", + "version": "==18.9b0" + }, + "click": { + "hashes": [ + "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", + "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" + ], + "index": "pypi", + "version": "==7.0" + }, + "click-plugins": { + "hashes": [ + "sha256:b1ee1ccc9421c73007fe290680d97984eb6eaf5f4512b7620c6aa46031d6cb6b", + "sha256:dfed74b5063546a137de99baaaf742b4de4337ad2b3e1df5ec7c8a256adc0847" + ], + "version": "==1.0.4" + }, + "cligj": { + "hashes": [ + "sha256:20f24ce9abfde3f758aec3399e6811b936b6772f360846c662c19bf5537b4f14", + "sha256:60c93dda4499562eb87509a8ff3535a7441053b766c9c26bcf874a732f939c7c", + "sha256:6c7d52d529a78712491974f975c33473f430c0f7beb18c0d7a402a743dcb460a" + ], + "version": "==0.5.0" + }, + "cycler": { + "hashes": [ + "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", + "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" + ], + "version": "==0.10.0" + }, + "fiona": { + "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.7.13-cp37-cp37m-win_amd64.whl", + "hashes": [ + "sha256:425a98dcf87c06a481e256803c8c68d7d4cd04f5e4505c4ab32a13571a3cc57a" + ], + "index": "pypi", + "version": "==1.7.13" + }, + "gdal": { + "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl", + "hashes": [ + "sha256:2f6c36ee59f9b24fb16514e4fce8b73e7833714feb9b8397f91662256e1b12d8" + ], + "index": "pypi", + "version": "==2.3.2" + }, + "kiwisolver": { + "hashes": [ + "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3", + "sha256:0f7f532f3c94e99545a29f4c3f05637f4d2713e7fd91b4dd8abfc18340b86cd5", + "sha256:1a078f5dd7e99317098f0e0d490257fd0349d79363e8c923d5bb76428f318421", + "sha256:1aa0b55a0eb1bd3fa82e704f44fb8f16e26702af1a073cc5030eea399e617b56", + "sha256:2874060b91e131ceeff00574b7c2140749c9355817a4ed498e82a4ffa308ecbc", + "sha256:379d97783ba8d2934d52221c833407f20ca287b36d949b4bba6c75274bcf6363", + "sha256:3b791ddf2aefc56382aadc26ea5b352e86a2921e4e85c31c1f770f527eb06ce4", + "sha256:4329008a167fac233e398e8a600d1b91539dc33c5a3eadee84c0d4b04d4494fa", + "sha256:45813e0873bbb679334a161b28cb9606d9665e70561fd6caa8863e279b5e464b", + "sha256:53a5b27e6b5717bdc0125338a822605084054c80f382051fb945d2c0e6899a20", + "sha256:574f24b9805cb1c72d02b9f7749aa0cc0b81aa82571be5201aa1453190390ae5", + "sha256:66f82819ff47fa67a11540da96966fb9245504b7f496034f534b81cacf333861", + "sha256:79e5fe3ccd5144ae80777e12973027bd2f4f5e3ae8eb286cabe787bed9780138", + "sha256:83410258eb886f3456714eea4d4304db3a1fc8624623fc3f38a487ab36c0f653", + "sha256:8b6a7b596ce1d2a6d93c3562f1178ebd3b7bb445b3b0dd33b09f9255e312a965", + "sha256:9576cb63897fbfa69df60f994082c3f4b8e6adb49cccb60efb2a80a208e6f996", + "sha256:95a25d9f3449046ecbe9065be8f8380c03c56081bc5d41fe0fb964aaa30b2195", + "sha256:a424f048bebc4476620e77f3e4d1f282920cef9bc376ba16d0b8fe97eec87cde", + "sha256:aaec1cfd94f4f3e9a25e144d5b0ed1eb8a9596ec36d7318a504d813412563a85", + "sha256:acb673eecbae089ea3be3dcf75bfe45fc8d4dcdc951e27d8691887963cf421c7", + "sha256:b15bc8d2c2848a4a7c04f76c9b3dc3561e95d4dabc6b4f24bfabe5fd81a0b14f", + "sha256:b1c240d565e977d80c0083404c01e4d59c5772c977fae2c483f100567f50847b", + "sha256:c595693de998461bcd49b8d20568c8870b3209b8ea323b2a7b0ea86d85864694", + "sha256:ce3be5d520b4d2c3e5eeb4cd2ef62b9b9ab8ac6b6fedbaa0e39cdb6f50644278", + "sha256:e0f910f84b35c36a3513b96d816e6442ae138862257ae18a0019d2fc67b041dc", + "sha256:ea36e19ac0a483eea239320aef0bd40702404ff8c7e42179a2d9d36c5afcb55c", + "sha256:efabbcd4f406b532206b8801058c8bab9e79645b9880329253ae3322b7b02cd5", + "sha256:f923406e6b32c86309261b8195e24e18b6a8801df0cfc7814ac44017bfcb3939" + ], + "version": "==1.0.1" + }, + "mat4py": { + "hashes": [ + "sha256:8272ce80747120ff44200b1fde341c657595813e1adf61262e44b52642c10dbe" + ], + "index": "pypi", + "version": "==0.4.1" + }, + "matplotlib": { + "hashes": [ + "sha256:16aa61846efddf91df623bbb4598e63be1068a6b6a2e6361cc802b41c7a286eb", + "sha256:1975b71a33ac986bb39b6d5cfbc15c7b1f218f1134efb4eb3881839d6ae69984", + "sha256:2b222744bd54781e6cc0b717fa35a54e5f176ba2ced337f27c5b435b334ef854", + "sha256:317643c0e88fad55414347216362b2e229c130edd5655fea5f8159a803098468", + "sha256:4269ce3d1b897d46fc3cc2273a0cc2a730345bb47e4456af662e6fca85c89dd7", + "sha256:65214fd668975077cdf8d408ccf2b2d6bdf73b4e6895a79f8e99ce4f0b43fcdb", + "sha256:74bc213ab8a92d86a0b304d9359d1e1d14168d4c6121b83862c9d8a88b89a738", + "sha256:88949be0db54755995dfb0210d0099a8712a3c696c860441971354c3debfc4af", + "sha256:8e1223d868be89423ec95ada5f37aa408ee64fe76ccb8e4d5f533699ba4c0e4a", + "sha256:9fa00f2d7a552a95fa6016e498fdeb6d74df537853dda79a9055c53dfc8b6e1a", + "sha256:c27fd46cab905097ba4bc28d5ba5289930f313fb1970c9d41092c9975b80e9b4", + "sha256:c94b792af431f6adb6859eb218137acd9a35f4f7442cea57e4a59c54751c36af", + "sha256:f4c12a01eb2dc16693887a874ba948b18c92f425c4d329639ece6d3bb8e631bb" + ], + "index": "pypi", + "version": "==3.0.2" + }, + "munch": { + "hashes": [ + "sha256:6ae3d26b837feacf732fb8aa5b842130da1daf221f5af9f9d4b2a0a6414b0d51" + ], + "version": "==2.3.2" + }, + "numpy": { + "hashes": [ + "sha256:0df89ca13c25eaa1621a3f09af4c8ba20da849692dcae184cb55e80952c453fb", + "sha256:154c35f195fd3e1fad2569930ca51907057ae35e03938f89a8aedae91dd1b7c7", + "sha256:18e84323cdb8de3325e741a7a8dd4a82db74fde363dce32b625324c7b32aa6d7", + "sha256:1e8956c37fc138d65ded2d96ab3949bd49038cc6e8a4494b1515b0ba88c91565", + "sha256:23557bdbca3ccbde3abaa12a6e82299bc92d2b9139011f8c16ca1bb8c75d1e95", + "sha256:24fd645a5e5d224aa6e39d93e4a722fafa9160154f296fd5ef9580191c755053", + "sha256:36e36b6868e4440760d4b9b44587ea1dc1f06532858d10abba98e851e154ca70", + "sha256:3d734559db35aa3697dadcea492a423118c5c55d176da2f3be9c98d4803fc2a7", + "sha256:416a2070acf3a2b5d586f9a6507bb97e33574df5bd7508ea970bbf4fc563fa52", + "sha256:4a22dc3f5221a644dfe4a63bf990052cc674ef12a157b1056969079985c92816", + "sha256:4d8d3e5aa6087490912c14a3c10fbdd380b40b421c13920ff468163bc50e016f", + "sha256:4f41fd159fba1245e1958a99d349df49c616b133636e0cf668f169bce2aeac2d", + "sha256:561ef098c50f91fbac2cc9305b68c915e9eb915a74d9038ecf8af274d748f76f", + "sha256:56994e14b386b5c0a9b875a76d22d707b315fa037affc7819cda08b6d0489756", + "sha256:73a1f2a529604c50c262179fcca59c87a05ff4614fe8a15c186934d84d09d9a5", + "sha256:7da99445fd890206bfcc7419f79871ba8e73d9d9e6b82fe09980bc5bb4efc35f", + "sha256:99d59e0bcadac4aa3280616591fb7bcd560e2218f5e31d5223a2e12a1425d495", + "sha256:a4cc09489843c70b22e8373ca3dfa52b3fab778b57cf81462f1203b0852e95e3", + "sha256:a61dc29cfca9831a03442a21d4b5fd77e3067beca4b5f81f1a89a04a71cf93fa", + "sha256:b1853df739b32fa913cc59ad9137caa9cc3d97ff871e2bbd89c2a2a1d4a69451", + "sha256:b1f44c335532c0581b77491b7715a871d0dd72e97487ac0f57337ccf3ab3469b", + "sha256:b261e0cb0d6faa8fd6863af26d30351fd2ffdb15b82e51e81e96b9e9e2e7ba16", + "sha256:c857ae5dba375ea26a6228f98c195fec0898a0fd91bcf0e8a0cae6d9faf3eca7", + "sha256:cf5bb4a7d53a71bb6a0144d31df784a973b36d8687d615ef6a7e9b1809917a9b", + "sha256:db9814ff0457b46f2e1d494c1efa4111ca089e08c8b983635ebffb9c1573361f", + "sha256:df04f4bad8a359daa2ff74f8108ea051670cafbca533bb2636c58b16e962989e", + "sha256:ecf81720934a0e18526177e645cbd6a8a21bb0ddc887ff9738de07a1df5c6b61", + "sha256:edfa6fba9157e0e3be0f40168eb142511012683ac3dc82420bee4a3f3981b30e" + ], + "index": "pypi", + "version": "==1.15.4" + }, + "pandas": { + "hashes": [ + "sha256:11975fad9edbdb55f1a560d96f91830e83e29bed6ad5ebf506abda09818eaf60", + "sha256:12e13d127ca1b585dd6f6840d3fe3fa6e46c36a6afe2dbc5cb0b57032c902e31", + "sha256:1c87fcb201e1e06f66e23a61a5fea9eeebfe7204a66d99df24600e3f05168051", + "sha256:242e9900de758e137304ad4b5663c2eff0d798c2c3b891250bd0bd97144579da", + "sha256:26c903d0ae1542890cb9abadb4adcb18f356b14c2df46e4ff657ae640e3ac9e7", + "sha256:2e1e88f9d3e5f107b65b59cd29f141995597b035d17cc5537e58142038942e1a", + "sha256:31b7a48b344c14691a8e92765d4023f88902ba3e96e2e4d0364d3453cdfd50db", + "sha256:4fd07a932b4352f8a8973761ab4e84f965bf81cc750fb38e04f01088ab901cb8", + "sha256:5b24ca47acf69222e82530e89111dd9d14f9b970ab2cd3a1c2c78f0c4fbba4f4", + "sha256:647b3b916cc8f6aeba240c8171be3ab799c3c1b2ea179a3be0bd2712c4237553", + "sha256:66b060946046ca27c0e03e9bec9bba3e0b918bafff84c425ca2cc2e157ce121e", + "sha256:6efa9fa6e1434141df8872d0fa4226fc301b17aacf37429193f9d70b426ea28f", + "sha256:be4715c9d8367e51dbe6bc6d05e205b1ae234f0dc5465931014aa1c4af44c1ba", + "sha256:bea90da782d8e945fccfc958585210d23de374fa9294a9481ed2abcef637ebfc", + "sha256:d318d77ab96f66a59e792a481e2701fba879e1a453aefeebdb17444fe204d1ed", + "sha256:d785fc08d6f4207437e900ffead930a61e634c5e4f980ba6d3dc03c9581748c7", + "sha256:de9559287c4fe8da56e8c3878d2374abc19d1ba2b807bfa7553e912a8e5ba87c", + "sha256:f4f98b190bb918ac0bc0e3dd2ab74ff3573da9f43106f6dba6385406912ec00f", + "sha256:f71f1a7e2d03758f6e957896ed696254e2bc83110ddbc6942018f1a232dd9dad", + "sha256:fb944c8f0b0ab5c1f7846c686bc4cdf8cde7224655c12edcd59d5212cd57bec0" + ], + "index": "pypi", + "version": "==0.23.4" + }, + "pyparsing": { + "hashes": [ + "sha256:40856e74d4987de5d01761a22d1621ae1c7f8774585acae358aa5c5936c6c90b", + "sha256:f353aab21fd474459d97b709e527b5571314ee5f067441dc9f88e33eecd96592" + ], + "version": "==2.3.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", + "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + ], + "version": "==2.7.5" + }, + "pytz": { + "hashes": [ + "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", + "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" + ], + "version": "==2018.7" + }, + "scipy": { + "hashes": [ + "sha256:0611ee97296265af4a21164a5323f8c1b4e8e15c582d3dfa7610825900136bb7", + "sha256:08237eda23fd8e4e54838258b124f1cd141379a5f281b0a234ca99b38918c07a", + "sha256:0e645dbfc03f279e1946cf07c9c754c2a1859cb4a41c5f70b25f6b3a586b6dbd", + "sha256:0e9bb7efe5f051ea7212555b290e784b82f21ffd0f655405ac4f87e288b730b3", + "sha256:108c16640849e5827e7d51023efb3bd79244098c3f21e4897a1007720cb7ce37", + "sha256:340ef70f5b0f4e2b4b43c8c8061165911bc6b2ad16f8de85d9774545e2c47463", + "sha256:3ad73dfc6f82e494195144bd3a129c7241e761179b7cb5c07b9a0ede99c686f3", + "sha256:3b243c77a822cd034dad53058d7c2abf80062aa6f4a32e9799c95d6391558631", + "sha256:404a00314e85eca9d46b80929571b938e97a143b4f2ddc2b2b3c91a4c4ead9c5", + "sha256:423b3ff76957d29d1cce1bc0d62ebaf9a3fdfaf62344e3fdec14619bb7b5ad3a", + "sha256:42d9149a2fff7affdd352d157fa5717033767857c11bd55aa4a519a44343dfef", + "sha256:625f25a6b7d795e8830cb70439453c9f163e6870e710ec99eba5722775b318f3", + "sha256:698c6409da58686f2df3d6f815491fd5b4c2de6817a45379517c92366eea208f", + "sha256:729f8f8363d32cebcb946de278324ab43d28096f36593be6281ca1ee86ce6559", + "sha256:8190770146a4c8ed5d330d5b5ad1c76251c63349d25c96b3094875b930c44692", + "sha256:878352408424dffaa695ffedf2f9f92844e116686923ed9aa8626fc30d32cfd1", + "sha256:8b984f0821577d889f3c7ca8445564175fb4ac7c7f9659b7c60bef95b2b70e76", + "sha256:8f841bbc21d3dad2111a94c490fb0a591b8612ffea86b8e5571746ae76a3deac", + "sha256:c22b27371b3866c92796e5d7907e914f0e58a36d3222c5d436ddd3f0e354227a", + "sha256:d0cdd5658b49a722783b8b4f61a6f1f9c75042d0e29a30ccb6cacc9b25f6d9e2", + "sha256:d40dc7f494b06dcee0d303e51a00451b2da6119acbeaccf8369f2d29e28917ac", + "sha256:d8491d4784aceb1f100ddb8e31239c54e4afab8d607928a9f7ef2469ec35ae01", + "sha256:dfc5080c38dde3f43d8fbb9c0539a7839683475226cf83e4b24363b227dfe552", + "sha256:e24e22c8d98d3c704bb3410bce9b69e122a8de487ad3dbfe9985d154e5c03a40", + "sha256:e7a01e53163818d56eabddcafdc2090e9daba178aad05516b20c6591c4811020", + "sha256:ee677635393414930541a096fc8e61634304bb0153e4e02b75685b11eba14cae", + "sha256:f0521af1b722265d824d6ad055acfe9bd3341765735c44b5a4d0069e189a0f40", + "sha256:f25c281f12c0da726c6ed00535ca5d1622ec755c30a3f8eafef26cf43fede694" + ], + "index": "pypi", + "version": "==1.1.0" + }, + "shapely": { + "hashes": [ + "sha256:045e991636787c22bf3e18b57cdaa200681acc0e5db0720123643909d99ad32b", + "sha256:2e8398aacf67cfdfcd64154738c809fea52008afefb4704103f43face369230d", + "sha256:56b8184ef9cf2e2e1dd09ccfe341028af08ea57254524c9458e7f115655385af", + "sha256:7268fd767dc88ef083a528a1e8977a358c7a56cb349aae9e4c36913cfba30857", + "sha256:7e06705e0a20e10f0ce35b233b32b57f6b77044e58e2ad4023d6e64f6c3719a7", + "sha256:937502b7f7bfea39910e30617a30d74ce1b6585895b3d8a2a4602c223a0dd73c", + "sha256:99dc867fe6519c1af1840cceea8bcf5dd1ece077207bdcb19072cdb4fbda8584", + "sha256:9e45485c49fd9ee81a81be756e648a0c1c125e770e3ed42845350d75a46723ad", + "sha256:e3c3eb85f7d4308ccbfcdd23513bfe201b193673c98400219b9a480b903b3033", + "sha256:eb4f295b1ff558857d8061ff7716b1e10ec3c24b5b784bccb51dc87e6fd3ad07", + "sha256:f87c677c0b176827167d1ebad37bba36a9e6baf61f608ff8ef4b9d9ff002c3c3", + "sha256:ffe14cf22da9c95aa87a287ddb96202e3cbb4ec1ec862050d9e4b114307fa206" + ], + "index": "pypi", + "version": "==1.7a1" + }, + "six": { + "hashes": [ + "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", + "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + ], + "version": "==1.11.0" + }, + "toml": { + "hashes": [ + "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", + "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" + ], + "version": "==0.10.0" + } + }, + "develop": {} +} From 8f790cbf1b46fb299ab31ad79543b3376bd6857d Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:25:28 +1100 Subject: [PATCH 04/65] Fix formatting with black --- src/analysis/analysis.py | 14 +- src/analysis/compare_impacts.py | 19 +-- src/analysis/forecast_twl.py | 161 +++++++++++++---------- src/analysis/forecasted_storm_impacts.py | 55 ++++---- src/analysis/observed_storm_impacts.py | 78 ++++++----- src/analysis/runup_models.py | 27 ++-- src/data/profile_features.py | 86 ++++++------ 7 files changed, 233 insertions(+), 207 deletions(-) diff --git a/src/analysis/analysis.py b/src/analysis/analysis.py index 810d8a3..1d1f9a9 100644 --- a/src/analysis/analysis.py +++ b/src/analysis/analysis.py @@ -1,13 +1,15 @@ import pandas as pd import os + def main(): - data_folder = './data/interim' - df_waves = pd.read_csv(os.path.join(data_folder, 'waves.csv'), index_col=[0,1]) - df_tides = pd.read_csv(os.path.join(data_folder, 'tides.csv'), index_col=[0,1]) - df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0,1,2]) - df_sites = pd.read_csv(os.path.join(data_folder, 'sites.csv'),index_col=[0]) + data_folder = "./data/interim" + df_waves = pd.read_csv(os.path.join(data_folder, "waves.csv"), index_col=[0, 1]) + df_tides = pd.read_csv(os.path.join(data_folder, "tides.csv"), index_col=[0, 1]) + df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) + df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) + -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/src/analysis/compare_impacts.py b/src/analysis/compare_impacts.py index a74e8c5..e6a3837 100644 --- a/src/analysis/compare_impacts.py +++ b/src/analysis/compare_impacts.py @@ -7,7 +7,7 @@ import os import pandas as pd -logging.config.fileConfig('./src/logging.conf', disable_existing_loggers=False) +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) @@ -18,15 +18,16 @@ def compare_impacts(df_forecasted, df_observed): :param df_observed: :return: """ - df_compared = df_forecasted.merge(df_observed, left_index=True, right_index=True, - suffixes=['_forecasted', '_observed']) + df_compared = df_forecasted.merge( + df_observed, left_index=True, right_index=True, suffixes=["_forecasted", "_observed"] + ) return df_compared -if __name__ == '__main__': - logger.info('Importing existing data') - data_folder = './data/interim' - df_forecasted = pd.read_csv(os.path.join(data_folder, 'impacts_forecasted_mean_slope_sto06.csv'), index_col=[0]) - df_observed = pd.read_csv(os.path.join(data_folder, 'impacts_observed.csv'), index_col=[0]) +if __name__ == "__main__": + logger.info("Importing existing data") + data_folder = "./data/interim" + df_forecasted = pd.read_csv(os.path.join(data_folder, "impacts_forecasted_mean_slope_sto06.csv"), index_col=[0]) + df_observed = pd.read_csv(os.path.join(data_folder, "impacts_observed.csv"), index_col=[0]) df_compared = compare_impacts(df_forecasted, df_observed) - df_compared.to_csv(os.path.join(data_folder, 'impacts_observed_vs_forecasted_mean_slope_sto06.csv')) + df_compared.to_csv(os.path.join(data_folder, "impacts_observed_vs_forecasted_mean_slope_sto06.csv")) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 86fc02e..70f357e 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -9,54 +9,57 @@ from scipy import stats from src.analysis.runup_models import sto06_individual, sto06 -logging.config.fileConfig('./src/logging.conf', disable_existing_loggers=False) +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) -def forecast_twl(df_tides, df_profiles, df_waves, df_profile_features, runup_function, n_processes=4, - slope='foreshore'): +def forecast_twl( + df_tides, df_profiles, df_waves, df_profile_features, runup_function, n_processes=4, slope="foreshore" +): # Use df_waves as a base df_twl = df_waves.copy() # Merge tides - logger.info('Merging tides') + logger.info("Merging tides") df_twl = df_twl.merge(df_tides, left_index=True, right_index=True) # Estimate foreshore slope. Do the analysis per site_id. This is so we only have to query the x and z # cross-section profiles once per site. - logger.info('Calculating beach slopes') - site_ids = df_twl.index.get_level_values('site_id').unique() + logger.info("Calculating beach slopes") + site_ids = df_twl.index.get_level_values("site_id").unique() # site_ids = [x for x in site_ids if 'NARRA' in x] # todo remove this - for testing narrabeen only - if slope == 'foreshore': + if slope == "foreshore": # Process each site_id with a different process and combine results at the end with Pool(processes=n_processes) as pool: - results = pool.starmap(foreshore_slope_for_site_id, - [(site_id, df_twl, df_profiles) for site_id in site_ids]) - df_twl['beta'] = pd.concat(results) + results = pool.starmap( + foreshore_slope_for_site_id, [(site_id, df_twl, df_profiles) for site_id in site_ids] + ) + df_twl["beta"] = pd.concat(results) - elif slope == 'mean': + elif slope == "mean": # todo mean beach profile - df_temp = df_twl.join(df_profile_features, how='inner') - df_temp['mhw'] = 0.5 + df_temp = df_twl.join(df_profile_features, 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]) - df_twl['beta'] = pd.concat(results) + results = pool.starmap( + mean_slope_for_site_id, [(site_id, df_temp, df_profiles, "dune_toe_z", "mhw") for site_id in site_ids] + ) + df_twl["beta"] = pd.concat(results) # Estimate runup - R2, setup, S_total, S_inc, S_ig = runup_function(df_twl, Hs0_col='Hs0', Tp_col='Tp', beta_col='beta') + R2, setup, S_total, S_inc, S_ig = runup_function(df_twl, Hs0_col="Hs0", Tp_col="Tp", beta_col="beta") - df_twl['R2'] = R2 - df_twl['setup'] = setup - df_twl['S_total'] = S_total + df_twl["R2"] = R2 + df_twl["setup"] = setup + df_twl["S_total"] = S_total # Estimate TWL - df_twl['R_high'] = df_twl['tide'] + df_twl['R2'] - df_twl['R_low'] = df_twl['tide'] + 1.1 * df_twl['setup'] - 1.1 / 2 * df_twl['S_total'] + df_twl["R_high"] = df_twl["tide"] + df_twl["R2"] + df_twl["R_low"] = df_twl["tide"] + 1.1 * df_twl["setup"] - 1.1 / 2 * df_twl["S_total"] # Drop unneeded columns - df_twl.drop(columns=['E', 'Exs', 'P', 'Pxs', 'dir'], inplace=True, errors='ignore') + df_twl.drop(columns=["E", "Exs", "P", "Pxs", "dir"], inplace=True, errors="ignore") return df_twl @@ -74,15 +77,21 @@ 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_x = profile.index.get_level_values('x').tolist() + profile_x = profile.index.get_level_values("x").tolist() profile_z = profile.z.tolist() df_twl_site = df_twl.query("site_id == '{}'".format(site_id)) - df_beta = df_twl_site.apply(lambda row: slope_from_profile(profile_x=profile_x, profile_z=profile_z, - top_elevation=row[top_elevation_col], - btm_elevation=row[btm_elevation_col], - method='end_points'), axis=1) + df_beta = df_twl_site.apply( + lambda row: slope_from_profile( + profile_x=profile_x, + profile_z=profile_z, + top_elevation=row[top_elevation_col], + btm_elevation=row[btm_elevation_col], + method="end_points", + ), + axis=1, + ) return df_beta @@ -99,16 +108,22 @@ def foreshore_slope_for_site_id(site_id, df_twl, df_profiles): # Get the prestorm beach profile profile = df_profiles.query("site_id =='{}' and profile_type == 'prestorm'".format(site_id)) - profile_x = profile.index.get_level_values('x').tolist() + profile_x = profile.index.get_level_values("x").tolist() profile_z = profile.z.tolist() df_twl_site = df_twl.query("site_id == '{}'".format(site_id)) - df_beta = df_twl_site.apply(lambda row: foreshore_slope_from_profile(profile_x=profile_x, profile_z=profile_z, - tide=row.tide, - runup_function=sto06_individual, - Hs0=row.Hs0, - Tp=row.Tp), axis=1) + df_beta = df_twl_site.apply( + lambda row: foreshore_slope_from_profile( + profile_x=profile_x, + profile_z=profile_z, + tide=row.tide, + runup_function=sto06_individual, + Hs0=row.Hs0, + Tp=row.Tp, + ), + axis=1, + ) return df_beta @@ -137,9 +152,13 @@ def foreshore_slope_from_profile(profile_x, profile_z, tide, runup_function, **k while True: R2, setup, S_total, _, _ = runup_function(beta=beta, **kwargs) - beta_new = slope_from_profile(profile_x=profile_x, profile_z=profile_z, method='end_points', - top_elevation=tide + setup + S_total / 2, - btm_elevation=tide + setup - S_total / 2) + beta_new = slope_from_profile( + profile_x=profile_x, + profile_z=profile_z, + method="end_points", + top_elevation=tide + setup + S_total / 2, + btm_elevation=tide + setup - S_total / 2, + ) # Return None if we can't find a slope, usually because the elevations we've specified are above/below our # profile x and z coordinates. @@ -158,7 +177,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"): """ 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 @@ -173,16 +192,10 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho if any([x is None for x in [profile_x, profile_z, top_elevation, btm_elevation]]): return None - end_points = { - 'top': { - 'z': top_elevation, - }, - 'btm': { - 'z': btm_elevation, - }} + end_points = {"top": {"z": top_elevation}, "btm": {"z": btm_elevation}} for end_type in end_points.keys(): - elevation = end_points[end_type]['z'] + elevation = end_points[end_type]["z"] intersection_x = crossings(profile_x, profile_z, elevation) # No intersections found @@ -191,26 +204,26 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho # One intersection elif len(intersection_x) == 1: - end_points[end_type]['x'] = intersection_x[0] + end_points[end_type]["x"] = intersection_x[0] # More than on intersection else: - if end_type == 'top': + if end_type == "top": # For top elevation, take most seaward intersection - end_points[end_type]['x'] = intersection_x[-1] + end_points[end_type]["x"] = intersection_x[-1] else: # For bottom elevation, take most landward intersection that is seaward of top elevation - end_points[end_type]['x'] = [x for x in intersection_x if x > end_points['top']['x']][0] + end_points[end_type]["x"] = [x for x in intersection_x if x > end_points["top"]["x"]][0] - if method == 'end_points': - x_top = end_points['top']['x'] - x_btm = end_points['btm']['x'] - z_top = end_points['top']['z'] - z_btm = end_points['btm']['z'] + if method == "end_points": + x_top = end_points["top"]["x"] + x_btm = end_points["btm"]["x"] + z_top = end_points["top"]["z"] + z_btm = end_points["btm"]["z"] return -(z_top - z_btm) / (x_top - x_btm) - elif method == 'least_squares': - profile_mask = [True if end_points['top']['x'] < pts < end_points['btm']['x'] else False for pts in x] + elif method == "least_squares": + profile_mask = [True if end_points["top"]["x"] < pts < end_points["btm"]["x"] else False for pts in x] slope_x = np.array(profile_x)[profile_mask].tolist() slope_z = np.array(profile_z)[profile_mask].tolist() slope, _, _, _, _ = stats.linregress(slope_x, slope_z) @@ -245,23 +258,25 @@ def crossings(profile_x, profile_z, constant_z): return [profile_x[i] - (profile_x[i] - profile_x[i + 1]) / (z[i] - z[i + 1]) * (z[i]) for i in indicies] -if __name__ == '__main__': - logger.info('Importing data') - data_folder = './data/interim' - df_waves = pd.read_csv(os.path.join(data_folder, 'waves.csv'), index_col=[0, 1]) - df_tides = pd.read_csv(os.path.join(data_folder, 'tides.csv'), index_col=[0, 1]) - df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0, 1, 2]) - df_sites = pd.read_csv(os.path.join(data_folder, 'sites.csv'), index_col=[0]) - df_profile_features = pd.read_csv(os.path.join(data_folder, 'profile_features.csv'), index_col=[0]) +if __name__ == "__main__": + logger.info("Importing data") + data_folder = "./data/interim" + df_waves = pd.read_csv(os.path.join(data_folder, "waves.csv"), index_col=[0, 1]) + df_tides = pd.read_csv(os.path.join(data_folder, "tides.csv"), index_col=[0, 1]) + df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) + df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) + df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) - logger.info('Forecasting TWL') + logger.info("Forecasting TWL") - df_twl_foreshore_slope_sto06 = forecast_twl(df_tides, df_profiles, df_waves, df_profile_features, - runup_function=sto06, slope='foreshore') - df_twl_foreshore_slope_sto06.to_csv(os.path.join(data_folder, 'twl_foreshore_slope_sto06.csv')) + df_twl_foreshore_slope_sto06 = forecast_twl( + df_tides, df_profiles, df_waves, df_profile_features, runup_function=sto06, slope="foreshore" + ) + df_twl_foreshore_slope_sto06.to_csv(os.path.join(data_folder, "twl_foreshore_slope_sto06.csv")) - df_twl_mean_slope_sto06 = forecast_twl(df_tides, df_profiles, df_waves, df_profile_features, - runup_function=sto06, slope='mean') - df_twl_mean_slope_sto06.to_csv(os.path.join(data_folder, 'twl_mean_slope_sto06.csv')) + df_twl_mean_slope_sto06 = forecast_twl( + df_tides, df_profiles, df_waves, df_profile_features, runup_function=sto06, slope="mean" + ) + df_twl_mean_slope_sto06.to_csv(os.path.join(data_folder, "twl_mean_slope_sto06.csv")) - logger.info('Done') + logger.info("Done") diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index edeb8ff..8e4acbd 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -7,7 +7,7 @@ import os import pandas as pd -logging.config.fileConfig('./src/logging.conf', disable_existing_loggers=False) +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) @@ -19,20 +19,19 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): :param df_forecasted_twl: :return: """ - logger.info('Getting forecasted storm regimes') + logger.info("Getting forecasted storm regimes") df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index) # For each site, find the maximum R_high value and the corresponding R_low value. - idx = df_forecasted_twl.groupby(level=['site_id'])['R_high'].idxmax().dropna() - df_r_vals = df_forecasted_twl.loc[idx, ['R_high', 'R_low']].reset_index(['datetime']) - df_forecasted_impacts = df_forecasted_impacts.merge(df_r_vals, how='left', left_index=True, right_index=True) + idx = df_forecasted_twl.groupby(level=["site_id"])["R_high"].idxmax().dropna() + df_r_vals = df_forecasted_twl.loc[idx, ["R_high", "R_low"]].reset_index(["datetime"]) + df_forecasted_impacts = df_forecasted_impacts.merge(df_r_vals, how="left", left_index=True, right_index=True) # Join with df_profile features to find dune toe and crest elevations - df_forecasted_impacts = df_forecasted_impacts.merge(df_profile_features[['dune_toe_z', 'dune_crest_z']], - how='left', - left_index=True, - right_index=True) + df_forecasted_impacts = df_forecasted_impacts.merge( + df_profile_features[["dune_toe_z", "dune_crest_z"]], how="left", left_index=True, right_index=True + ) # Compare R_high and R_low wirth dune crest and toe elevations df_forecasted_impacts = storm_regime(df_forecasted_impacts) @@ -47,27 +46,33 @@ def storm_regime(df_forecasted_impacts): :param df_forecasted_impacts: :return: """ - logger.info('Getting forecasted storm regimes') + logger.info("Getting forecasted storm regimes") df_forecasted_impacts.loc[ - df_forecasted_impacts.R_high <= df_forecasted_impacts.dune_toe_z, 'storm_regime'] = 'swash' + df_forecasted_impacts.R_high <= df_forecasted_impacts.dune_toe_z, "storm_regime" + ] = "swash" df_forecasted_impacts.loc[ - df_forecasted_impacts.dune_toe_z <= df_forecasted_impacts.R_high, 'storm_regime'] = 'collision' - df_forecasted_impacts.loc[(df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_high) & - (df_forecasted_impacts.R_low <= df_forecasted_impacts.dune_crest_z), - 'storm_regime'] = 'overwash' - df_forecasted_impacts.loc[(df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_low) & - (df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_high), - 'storm_regime'] = 'inundation' + df_forecasted_impacts.dune_toe_z <= df_forecasted_impacts.R_high, "storm_regime" + ] = "collision" + df_forecasted_impacts.loc[ + (df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_high) + & (df_forecasted_impacts.R_low <= df_forecasted_impacts.dune_crest_z), + "storm_regime", + ] = "overwash" + df_forecasted_impacts.loc[ + (df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_low) + & (df_forecasted_impacts.dune_crest_z <= df_forecasted_impacts.R_high), + "storm_regime", + ] = "inundation" return df_forecasted_impacts -if __name__ == '__main__': - logger.info('Importing existing data') - data_folder = './data/interim' - df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(os.path.join(data_folder, 'profile_features.csv'), index_col=[0]) - df_forecasted_twl = pd.read_csv(os.path.join(data_folder, 'twl_mean_slope_sto06.csv'), index_col=[0, 1]) +if __name__ == "__main__": + logger.info("Importing existing data") + data_folder = "./data/interim" + df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) + df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) + df_forecasted_twl = pd.read_csv(os.path.join(data_folder, "twl_mean_slope_sto06.csv"), index_col=[0, 1]) df_forecasted_impacts = forecasted_impacts(df_profile_features, df_forecasted_twl) - df_forecasted_impacts.to_csv(os.path.join(data_folder, 'impacts_forecasted_mean_slope_sto06.csv')) + df_forecasted_impacts.to_csv(os.path.join(data_folder, "impacts_forecasted_mean_slope_sto06.csv")) diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index be48505..7666627 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -5,7 +5,7 @@ import numpy as np import pandas as pd from scipy.integrate import simps -logging.config.fileConfig('./src/logging.conf', disable_existing_loggers=False) +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) @@ -29,14 +29,14 @@ def volume_change(df_profiles, df_profile_features, zone): :param zone: Either 'swash' or 'dune_face' :return: """ - logger.info('Calculating change in beach volume in {} zone'.format(zone)) + logger.info("Calculating change in beach volume in {} zone".format(zone)) df_vol_changes = pd.DataFrame(index=df_profile_features.index) df_profiles = df_profiles.sort_index() - sites = df_profiles.groupby(level=['site_id']) + sites = df_profiles.groupby(level=["site_id"]) for site_id, df_site in sites: - logger.debug('Calculating change in beach volume at {} in {} zone'.format(site_id, zone)) + logger.debug("Calculating change in beach volume at {} in {} zone".format(site_id, zone)) prestorm_dune_toe_x = df_profile_features.loc[df_profile_features.index == site_id].dune_toe_x.tolist() prestorm_dune_crest_x = df_profile_features.loc[df_profile_features.index == site_id].dune_crest_x.tolist() @@ -50,36 +50,44 @@ def volume_change(df_profiles, df_profile_features, zone): # Find last x coordinate where we have both prestorm and poststorm measurements. If we don't do this, # the prestorm and poststorm values are going to be calculated over different lengths. - df_zone = df_site.dropna(subset=['z']) - x_last_obs = min([max(df_zone.query("profile_type == '{}'".format(profile_type)).index.get_level_values('x')) - for profile_type in ['prestorm', 'poststorm']]) + df_zone = df_site.dropna(subset=["z"]) + x_last_obs = min( + [ + max(df_zone.query("profile_type == '{}'".format(profile_type)).index.get_level_values("x")) + for profile_type in ["prestorm", "poststorm"] + ] + ) # Where we want to measure pre and post storm volume is dependant on the zone selected - if zone == 'swash': + if zone == "swash": x_min = prestorm_dune_toe_x x_max = x_last_obs - elif zone == 'dune_face': + elif zone == "dune_face": x_min = prestorm_dune_crest_x x_max = prestorm_dune_toe_x else: - logger.warning('Zone argument not properly specified. Please check') + logger.warning("Zone argument not properly specified. Please check") x_min = None x_max = None # Now, compute the volume of sand between the x-coordinates prestorm_dune_toe_x and x_swash_last for both prestorm # and post storm profiles. - prestorm_vol = beach_volume(x=df_zone.query("profile_type=='prestorm'").index.get_level_values('x'), - z=df_zone.query("profile_type=='prestorm'").z, - x_min=x_min, - x_max=x_max) - poststorm_vol = beach_volume(x=df_zone.query("profile_type=='poststorm'").index.get_level_values('x'), - z=df_zone.query("profile_type=='poststorm'").z, - x_min=x_min, - x_max=x_max) - - df_vol_changes.loc[site_id, 'prestorm_{}_vol'.format(zone)] = prestorm_vol - df_vol_changes.loc[site_id, 'poststorm_{}_vol'.format(zone)] = poststorm_vol - df_vol_changes.loc[site_id, '{}_vol_change'.format(zone)] = prestorm_vol - poststorm_vol + prestorm_vol = beach_volume( + x=df_zone.query("profile_type=='prestorm'").index.get_level_values("x"), + z=df_zone.query("profile_type=='prestorm'").z, + x_min=x_min, + x_max=x_max, + ) + poststorm_vol = beach_volume( + x=df_zone.query("profile_type=='poststorm'").index.get_level_values("x"), + z=df_zone.query("profile_type=='poststorm'").z, + x_min=x_min, + x_max=x_max, + ) + + df_vol_changes.loc[site_id, "prestorm_{}_vol".format(zone)] = prestorm_vol + df_vol_changes.loc[site_id, "poststorm_{}_vol".format(zone)] = poststorm_vol + df_vol_changes.loc[site_id, "{}_vol_change".format(zone)] = prestorm_vol - poststorm_vol return df_vol_changes @@ -110,28 +118,28 @@ def storm_regime(df_observed_impacts): :param df_observed_impacts: :return: """ - logger.info('Getting observed storm regimes') - df_observed_impacts.loc[df_observed_impacts.swash_vol_change < 3, 'storm_regime'] = 'swash' - df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change > 3, 'storm_regime'] = 'collision' + logger.info("Getting observed storm regimes") + df_observed_impacts.loc[df_observed_impacts.swash_vol_change < 3, "storm_regime"] = "swash" + df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change > 3, "storm_regime"] = "collision" return df_observed_impacts -if __name__ == '__main__': - logger.info('Importing existing data') - data_folder = './data/interim' - df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(os.path.join(data_folder, 'profile_features.csv'), index_col=[0]) +if __name__ == "__main__": + logger.info("Importing existing data") + data_folder = "./data/interim" + df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) + df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) - logger.info('Creating new dataframe for observed impacts') + logger.info("Creating new dataframe for observed impacts") df_observed_impacts = pd.DataFrame(index=df_profile_features.index) - logger.info('Getting pre/post storm volumes') - df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone='swash') - df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone='dune_face') + logger.info("Getting pre/post storm volumes") + df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") + df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone="dune_face") df_observed_impacts = df_observed_impacts.join([df_swash_vol_changes, df_dune_face_vol_changes]) # Classify regime based on volume changes df_observed_impacts = storm_regime(df_observed_impacts) # Save dataframe to csv - df_observed_impacts.to_csv(os.path.join(data_folder, 'impacts_observed.csv')) + df_observed_impacts.to_csv(os.path.join(data_folder, "impacts_observed.csv")) diff --git a/src/analysis/runup_models.py b/src/analysis/runup_models.py index 650c36b..e088aeb 100644 --- a/src/analysis/runup_models.py +++ b/src/analysis/runup_models.py @@ -1,6 +1,7 @@ import numpy as np import pandas as pd + def sto06_individual(Hs0, Tp, beta): Lp = 9.8 * Tp ** 2 / 2 / np.pi @@ -9,17 +10,18 @@ def sto06_individual(Hs0, Tp, beta): S_inc = 0.75 * beta * np.sqrt(Hs0 * Lp) # Dissipative conditions - if beta / (Hs0/Lp)**(0.5) <= 0.3: + if beta / (Hs0 / Lp) ** (0.5) <= 0.3: setup = 0.016 * (Hs0 * Lp) ** 0.5 S_total = 0.046 * (Hs0 * Lp) ** 0.5 - R2 = 0.043 * (Hs0 * Lp) ** 0.5 + R2 = 0.043 * (Hs0 * Lp) ** 0.5 else: setup = 0.35 * beta * (Hs0 * Lp) ** 0.5 - S_total = np.sqrt(S_inc ** 2 + S_ig **2) + S_total = np.sqrt(S_inc ** 2 + S_ig ** 2) R2 = 1.1 * (setup + S_total / 2) return R2, setup, S_total, S_inc, S_ig + def sto06(df, Hs0_col, Tp_col, beta_col): """ Vectorized version of Stockdon06 which can be used with dataframes @@ -30,22 +32,23 @@ def sto06(df, Hs0_col, Tp_col, beta_col): :return: """ - Lp = 9.8 * df[Tp_col] ** 2 / 2 / np.pi + Lp = 9.8 * df[Tp_col] ** 2 / 2 / np.pi # General equation - S_ig = pd.to_numeric(0.06 * np.sqrt(df[Hs0_col] * Lp), errors='coerce') - S_inc = pd.to_numeric(0.75 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors='coerce') - setup = pd.to_numeric(0.35 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors='coerce') + S_ig = pd.to_numeric(0.06 * np.sqrt(df[Hs0_col] * Lp), errors="coerce") + S_inc = pd.to_numeric(0.75 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors="coerce") + setup = pd.to_numeric(0.35 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors="coerce") S_total = np.sqrt(S_inc ** 2 + S_ig ** 2) R2 = 1.1 * (setup + S_total / 2) # Dissipative conditions - dissipative = df[beta_col] / (df[Hs0_col] / Lp)**(0.5) <= 0.3 - setup.loc[dissipative,:] = 0.016 * (df[Hs0_col] * Lp) ** (0.5) # eqn 16 - S_total.loc[dissipative,:] = 0.046 * (df[Hs0_col] * Lp) ** (0.5) # eqn 17 - R2.loc[dissipative,:] = 0.043 * (df[Hs0_col] * Lp) ** (0.5) # eqn 18 + dissipative = df[beta_col] / (df[Hs0_col] / Lp) ** (0.5) <= 0.3 + setup.loc[dissipative, :] = 0.016 * (df[Hs0_col] * Lp) ** (0.5) # eqn 16 + S_total.loc[dissipative, :] = 0.046 * (df[Hs0_col] * Lp) ** (0.5) # eqn 17 + R2.loc[dissipative, :] = 0.043 * (df[Hs0_col] * Lp) ** (0.5) # eqn 18 return R2, setup, S_total, S_inc, S_ig -if __name__ == '__main__': + +if __name__ == "__main__": pass diff --git a/src/data/profile_features.py b/src/data/profile_features.py index 1067fea..db901f3 100644 --- a/src/data/profile_features.py +++ b/src/data/profile_features.py @@ -19,14 +19,14 @@ def shapes_from_shp(shp_file): shapes = [] ids = [] properties = [] - for feat in fiona.open(shp_file, 'r'): - shapes.append(shape(feat['geometry'])) - ids.append(feat['id']) - properties.append(feat['properties']) + for feat in fiona.open(shp_file, "r"): + shapes.append(shape(feat["geometry"])) + ids.append(feat["id"]) + properties.append(feat["properties"]) return shapes, ids, properties -def convert_coord_systems(g1, in_coord_system='EPSG:4326', out_coord_system='EPSG:28356'): +def convert_coord_systems(g1, in_coord_system="EPSG:4326", out_coord_system="EPSG:28356"): """ Converts coordinates from one coordinates system to another. Needed because shapefiles are usually defined in lat/lon but should be converted to GDA to calculated distances. @@ -38,7 +38,8 @@ def convert_coord_systems(g1, in_coord_system='EPSG:4326', out_coord_system='EPS project = partial( pyproj.transform, pyproj.Proj(init=in_coord_system), # source coordinate system - pyproj.Proj(init=out_coord_system)) # destination coordinate system + pyproj.Proj(init=out_coord_system), + ) # destination coordinate system g2 = transform(project, g1) # apply projection return g2 @@ -59,15 +60,19 @@ def distance_to_intersection(lat, lon, landward_orientation, beach, line_strings start_point = convert_coord_systems(start_point) distance = 1000 # m look up to 1000m for an intersection - landward_point = Point(start_point.coords.xy[0] + distance * np.cos(np.deg2rad(landward_orientation)), - start_point.coords.xy[1] + distance * np.sin(np.deg2rad(landward_orientation))) + landward_point = Point( + start_point.coords.xy[0] + distance * np.cos(np.deg2rad(landward_orientation)), + start_point.coords.xy[1] + distance * np.sin(np.deg2rad(landward_orientation)), + ) landward_line = LineString([start_point, landward_point]) - seaward_point = Point(start_point.coords.xy[0] - distance * np.cos(np.deg2rad(landward_orientation)), - start_point.coords.xy[1] - distance * np.sin(np.deg2rad(landward_orientation))) + seaward_point = Point( + start_point.coords.xy[0] - distance * np.cos(np.deg2rad(landward_orientation)), + start_point.coords.xy[1] - distance * np.sin(np.deg2rad(landward_orientation)), + ) seaward_line = LineString([start_point, seaward_point]) # Look at relevant line_strings which have the same beach property in order to reduce computation time - line_strings = [s for s, p in zip(line_strings, line_properties) if p['beach'] == beach] + line_strings = [s for s, p in zip(line_strings, line_properties) if p["beach"] == beach] # Check whether profile_line intersects with any lines in line_string. If intersection point is landwards, # consider this negative, otherwise seawards is positive. @@ -99,7 +104,7 @@ def beach_profile_elevation(x_coord, df_profiles, profile_type, site_id): # Get profile df_profile = df_profiles.query('profile_type == "{}" and site_id =="{}"'.format(profile_type, site_id)) - return np.interp(x_coord, df_profile.index.get_level_values('x'), df_profile['z']) + return np.interp(x_coord, df_profile.index.get_level_values("x"), df_profile["z"]) def parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp): @@ -111,51 +116,38 @@ def parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp): # Get site information. Base our profile features on each site df_profile_features = df_sites - features = { - 'dune_crest': - { - 'file': dune_crest_shp - }, - 'dune_toe': - { - 'file': dune_toe_shp - }, - } + features = {"dune_crest": {"file": dune_crest_shp}, "dune_toe": {"file": dune_toe_shp}} # Import our dune crest and toes for feat in features.keys(): - shapes, _, properties = shapes_from_shp(features[feat]['file']) + shapes, _, properties = shapes_from_shp(features[feat]["file"]) shapes = [convert_coord_systems(x) for x in shapes] # Figure out the x coordinates of our crest and toes, by looking at where our beach sections intersect our # shape files. - col_name = '{}_x'.format(feat) - df_profile_features[col_name] = df_profile_features['profile_x_lat_lon'] + \ - df_profile_features.apply(lambda row: - distance_to_intersection( - row['lat'], row['lon'], row['orientation'], - row['beach'], shapes, properties), - axis=1) + col_name = "{}_x".format(feat) + df_profile_features[col_name] = df_profile_features["profile_x_lat_lon"] + df_profile_features.apply( + lambda row: distance_to_intersection( + row["lat"], row["lon"], row["orientation"], row["beach"], shapes, properties + ), + axis=1, + ) # Get the elevations of the crest and toe - col_name = '{}_z'.format(feat) - df_profile_features[col_name] = df_profile_features.apply(lambda row: - beach_profile_elevation( - row['{}_x'.format(feat)], - df_profiles, - 'prestorm', - row.name), - axis=1) - - df_profile_features = df_profile_features.drop(columns=['beach', 'lat', 'lon', 'orientation']) + col_name = "{}_z".format(feat) + df_profile_features[col_name] = df_profile_features.apply( + lambda row: beach_profile_elevation(row["{}_x".format(feat)], df_profiles, "prestorm", row.name), axis=1 + ) + + df_profile_features = df_profile_features.drop(columns=["beach", "lat", "lon", "orientation"]) return df_profile_features -if __name__ == '__main__': - data_folder = './data/interim' - df_sites = pd.read_csv(os.path.join(data_folder, 'sites.csv'), index_col=[0]) - df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0, 1, 2]) +if __name__ == "__main__": + data_folder = "./data/interim" + df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) + df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - dune_crest_shp = './data/raw/profile_features/dune_crests.shp' - dune_toe_shp = './data/raw/profile_features/dune_toes.shp' + dune_crest_shp = "./data/raw/profile_features/dune_crests.shp" + dune_toe_shp = "./data/raw/profile_features/dune_toes.shp" df_profile_features = parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp) - df_profile_features.to_csv('./data/interim/profile_features.csv') + df_profile_features.to_csv("./data/interim/profile_features.csv") From 67b7043ec3abc92b4ef105762e221defd769e636 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:25:49 +1100 Subject: [PATCH 05/65] Update logging config to quiet fiona package --- src/logging.conf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/logging.conf b/src/logging.conf index 4babaa0..5ea7f80 100644 --- a/src/logging.conf +++ b/src/logging.conf @@ -1,5 +1,5 @@ [loggers] -keys=root, matplotlib +keys=root, matplotlib, fiona [handlers] keys=consoleHandler @@ -16,6 +16,11 @@ level=WARNING handlers=consoleHandler qualname=matplotlib +[logger_fiona] +level=WARNING +handlers=consoleHandler +qualname=fiona + [handler_consoleHandler] class=StreamHandler level=DEBUG From 99e036a4cdb97a48621d9a05fbf34878ce9e71ec Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:26:26 +1100 Subject: [PATCH 06/65] Rename mat parsing file and convert to callable CLI commands --- src/data/mat_to_csv.py | 263 ------------------------------- src/data/parse_mat.py | 345 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 345 insertions(+), 263 deletions(-) delete mode 100644 src/data/mat_to_csv.py create mode 100644 src/data/parse_mat.py diff --git a/src/data/mat_to_csv.py b/src/data/mat_to_csv.py deleted file mode 100644 index 0033ea9..0000000 --- a/src/data/mat_to_csv.py +++ /dev/null @@ -1,263 +0,0 @@ -""" -Converts raw .mat files into a flattened .csv structure which can be imported into python pandas. -""" - -import logging.config -from datetime import datetime, timedelta - -import pandas as pd -from mat4py import loadmat -import numpy as np - -logging.config.fileConfig('./src/logging.conf', disable_existing_loggers=False) -logger = logging.getLogger(__name__) - - -def parse_orientations(orientations_mat): - """ - Parses the raw orientations.mat file and returns a pandas dataframe. Note that orientations are the direction - towards land measured in degrees anti-clockwise from east. - :param orientations_mat: - :return: - """ - logger.info('Parsing %s', orientations_mat) - mat_data = loadmat(orientations_mat)['output'] - rows = [] - for i in range(0, len(mat_data['beach'])): - rows.append({ - 'beach': mat_data['beach'][i], - 'orientation': mat_data['orientation'][i], - 'lat_center': mat_data['lat_center'][i], - 'lon_center': mat_data['lon_center'][i], - 'lat_land': mat_data['lat_land'][i], - 'lon_land': mat_data['lon_land'][i], - 'lat_sea': mat_data['lat_sea'][i], - 'lon_sea': mat_data['lon_sea'][i], - }) - - df = pd.DataFrame(rows) - return df - -def combine_sites_and_orientaions(df_sites, df_orientations): - """ - Replaces beach/lat/lon columns with the unique site_id. - :param dfs: - :param df_sites: - :return: - """ - df_merged_sites = df_sites.merge(df_orientations[['beach', 'lat_center', 'lon_center', 'orientation']], - left_on=['beach', 'lat', 'lon'], - right_on=['beach', 'lat_center', 'lon_center']) - - # Check that all our records have a unique site identifier - n_unmatched = len(df_sites) - len(df_merged_sites) - if n_unmatched > 0: - logger.warning('Not all records (%d of %d) matched with an orientation', n_unmatched, len(df_sites)) - - # Drop extra columns - df_merged_sites = df_merged_sites.drop(columns = ['lat_center', 'lon_center']) - - return df_merged_sites - -def specify_lat_lon_profile_center(df_sites, x_val=200): - """ - Specify which x-coordinate in the beach profile cross section the lat/lon corresponds to - :param df_sites: - :return: - """ - df_sites['profile_x_lat_lon'] = x_val - return df_sites - -def parse_waves(waves_mat): - """ - Parses the raw waves.mat file and returns a pandas dataframe - :param waves_mat: - :return: - """ - logger.info('Parsing %s', waves_mat) - mat_data = loadmat(waves_mat)['data'] - rows = [] - for i in range(0, len(mat_data['site'])): - for j in range(0, len(mat_data['dates'][i])): - rows.append({ - 'beach': mat_data['site'][i], - 'lon': mat_data['lon'][i], - 'lat': mat_data['lat'][i], - 'datetime': matlab_datenum_to_datetime(mat_data['dates'][i][j][0]), - 'Hs': mat_data['H'][i][j][0], - 'Hs0': mat_data['Ho'][i][j][0], - 'Tp': mat_data['T'][i][j][0], - 'dir': mat_data['D'][i][j][0], - 'E': mat_data['E'][i][j][0], - 'P': mat_data['P'][i][j][0], - 'Exs': mat_data['Exs'][i][j][0], - 'Pxs': mat_data['Pxs'][i][j][0], - }) - - df = pd.DataFrame(rows) - df['datetime'] = df['datetime'].dt.round('1s') - return df - - -def parse_tides(tides_mat): - """ - Parses the raw tides.mat file and returns a pandas dataframe - :param tides_mat: - :return: - """ - logger.info('Parsing %s', tides_mat) - mat_data = loadmat(tides_mat)['data'] - rows = [] - for i in range(0, len(mat_data['site'])): - for j in range(0, len(mat_data['time'])): - rows.append({ - 'beach': mat_data['site'][i][0], - 'lon': mat_data['lons'][i][0], - 'lat': mat_data['lats'][i][0], - 'datetime': matlab_datenum_to_datetime(mat_data['time'][j][0]), - 'tide': mat_data['tide'][i][j] - }) - - df = pd.DataFrame(rows) - df['datetime'] = df['datetime'].dt.round('1s') - return df - - -def parse_profiles(profiles_mat): - """ - Parses the raw profiles.mat file and returns a pandas dataframe - :param tides_mat: - :return: - """ - logger.info('Parsing %s', profiles_mat) - mat_data = loadmat(profiles_mat)['data'] - rows = [] - for i in range(0, len(mat_data['site'])): - for j in range(0, len(mat_data['pfx'][i])): - for profile_type in ['prestorm', 'poststorm']: - - if profile_type == 'prestorm': - z = mat_data['pf1'][i][j][0] - if profile_type == 'poststorm': - z = mat_data['pf2'][i][j][0] - - rows.append({ - 'beach': mat_data['site'][i], - 'lon': mat_data['lon'][i], - 'lat': mat_data['lat'][i], - 'profile_type': profile_type, - 'x': mat_data['pfx'][i][j][0], - 'z': z, - }) - - df = pd.DataFrame(rows) - return df - -def remove_zeros(df_profiles): - """ - When parsing the pre/post storm profiles, the end of some profiles have constant values of zero. Let's change - these to NaNs for consistancy. Didn't use pandas fillnan because 0 may still be a valid value. - :param df: - :return: - """ - - df_profiles = df_profiles.sort_index() - groups = df_profiles.groupby(level=['site_id','profile_type']) - for key, _ in groups: - logger.debug('Removing zeros from {} profile at {}'.format(key[1], key[0])) - idx_site = (df_profiles.index.get_level_values('site_id') == key[0]) & \ - (df_profiles.index.get_level_values('profile_type') == key[1]) - df_profile = df_profiles[idx_site] - x_last_ele = df_profile[df_profile.z!=0].index.get_level_values('x')[-1] - df_profiles.loc[idx_site & (df_profiles.index.get_level_values('x')>x_last_ele), 'z'] = np.nan - - return df_profiles - -def matlab_datenum_to_datetime(matlab_datenum): - # https://stackoverflow.com/a/13965852 - return datetime.fromordinal(int(matlab_datenum)) + timedelta(days=matlab_datenum % 1) - timedelta( - days=366) - - -def get_unique_sites(dfs, cols=['beach', 'lat', 'lon']): - """ - Generates a dataframe of unique sites based on beach names, lats and lons. Creates a unique site ID for each. - :param dfs: - :param cols: - :return: - """ - - rows = [] - df_all = pd.concat([df[cols] for df in dfs]) - beach_groups = df_all.groupby(['beach']) - for beach_name, beach_group in beach_groups: - site_groups = beach_group.groupby(['lat', 'lon']) - siteNo = 1 - for site_name, site_group in site_groups: - site = '{}{:04d}'.format(beach_name, siteNo) - rows.append({'site_id': site, - 'lat': site_name[0], - 'lon': site_name[1], - 'beach': beach_name}) - siteNo += 1 - - df = pd.DataFrame(rows) - - return df - - -def replace_unique_sites(df, df_sites, cols=['beach', 'lat', 'lon']): - """ - Replaces beach/lat/lon columns with the unique site_id - :param dfs: - :param df_sites: - :return: - """ - - df_merged = df.merge(df_sites, on=cols) - - # Check that all our records have a unique site identifier - n_unmatched = len(df) - len(df_merged) - if n_unmatched > 0: - logger.warning('Not all records (%d of %d) matched with a unique site', n_unmatched, len(df)) - - df_merged = df_merged.drop(columns=cols) - - return df_merged - - -def main(): - df_waves = parse_waves(waves_mat='./data/raw/processed_shorelines/waves.mat') - df_tides = parse_tides(tides_mat='./data/raw/processed_shorelines/tides.mat') - df_profiles = parse_profiles(profiles_mat='./data/raw/processed_shorelines/profiles.mat') - df_sites = get_unique_sites(dfs=[df_waves, df_tides, df_profiles]) - df_orientations = parse_orientations(orientations_mat='./data/raw/processed_shorelines/orientations.mat') - - logger.info('Identifying unique sites') - df_waves = replace_unique_sites(df_waves, df_sites) - df_tides = replace_unique_sites(df_tides, df_sites) - df_profiles = replace_unique_sites(df_profiles, df_sites) - - logger.info('Combine orientations into sites') - df_sites = combine_sites_and_orientaions(df_sites, df_orientations) - df_sites = specify_lat_lon_profile_center(df_sites) - - logger.info('Setting pandas index') - df_profiles.set_index(['site_id', 'profile_type', 'x'], inplace=True) - df_waves.set_index(['site_id', 'datetime'], inplace=True) - df_tides.set_index(['site_id', 'datetime'], inplace=True) - df_sites.set_index(['site_id'], inplace=True) - - logger.info('Nanning profile zero elevations') - df_profiles = remove_zeros(df_profiles) - - logger.info('Outputting .csv files') - df_profiles.to_csv('./data/interim/profiles.csv') - df_tides.to_csv('./data/interim/tides.csv') - df_waves.to_csv('./data/interim/waves.csv') - df_sites.to_csv('./data/interim/sites.csv') - logger.info('Done!') - - -if __name__ == '__main__': - main() diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py new file mode 100644 index 0000000..2e0abda --- /dev/null +++ b/src/data/parse_mat.py @@ -0,0 +1,345 @@ +""" +Converts raw .mat files into a flattened .csv structure which can be imported into python pandas. +""" + +import logging.config +from datetime import datetime, timedelta +import click +import pandas as pd +from mat4py import loadmat +import numpy as np + +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) +logger = logging.getLogger(__name__) + + +def parse_orientations(orientations_mat): + """ + Parses the raw orientations.mat file and returns a pandas dataframe. Note that orientations are the direction + towards land measured in degrees anti-clockwise from east. + :param orientations_mat: + :return: + """ + logger.info("Parsing %s", orientations_mat) + mat_data = loadmat(orientations_mat)["output"] + rows = [] + for i in range(0, len(mat_data["beach"])): + rows.append( + { + "beach": mat_data["beach"][i], + "orientation": mat_data["orientation"][i], + "lat_center": mat_data["lat_center"][i], + "lon_center": mat_data["lon_center"][i], + "lat_land": mat_data["lat_land"][i], + "lon_land": mat_data["lon_land"][i], + "lat_sea": mat_data["lat_sea"][i], + "lon_sea": mat_data["lon_sea"][i], + } + ) + + df = pd.DataFrame(rows) + return df + + +def combine_sites_and_orientaions(df_sites, df_orientations): + """ + Replaces beach/lat/lon columns with the unique site_id. + :param dfs: + :param df_sites: + :return: + """ + df_merged_sites = df_sites.merge( + df_orientations[["beach", "lat_center", "lon_center", "orientation"]], + left_on=["beach", "lat", "lon"], + right_on=["beach", "lat_center", "lon_center"], + ) + + # Check that all our records have a unique site identifier + n_unmatched = len(df_sites) - len(df_merged_sites) + if n_unmatched > 0: + logger.warning("Not all records (%d of %d) matched with an orientation", n_unmatched, len(df_sites)) + + # Drop extra columns + df_merged_sites = df_merged_sites.drop(columns=["lat_center", "lon_center"]) + + return df_merged_sites + + +def specify_lat_lon_profile_center(df_sites, x_val=200): + """ + Specify which x-coordinate in the beach profile cross section the lat/lon corresponds to + :param df_sites: + :return: + """ + df_sites["profile_x_lat_lon"] = x_val + return df_sites + + +def parse_waves(waves_mat): + """ + Parses the raw waves.mat file and returns a pandas dataframe + :param waves_mat: + :return: + """ + logger.info("Parsing %s", waves_mat) + mat_data = loadmat(waves_mat)["data"] + rows = [] + for i in range(0, len(mat_data["site"])): + for j in range(0, len(mat_data["dates"][i])): + rows.append( + { + "beach": mat_data["site"][i], + "lon": mat_data["lon"][i], + "lat": mat_data["lat"][i], + "datetime": matlab_datenum_to_datetime(mat_data["dates"][i][j][0]), + "Hs": mat_data["H"][i][j][0], + "Hs0": mat_data["Ho"][i][j][0], + "Tp": mat_data["T"][i][j][0], + "dir": mat_data["D"][i][j][0], + "E": mat_data["E"][i][j][0], + "P": mat_data["P"][i][j][0], + "Exs": mat_data["Exs"][i][j][0], + "Pxs": mat_data["Pxs"][i][j][0], + } + ) + + df = pd.DataFrame(rows) + df["datetime"] = df["datetime"].dt.round("1s") + return df + + +def parse_tides(tides_mat): + """ + Parses the raw tides.mat file and returns a pandas dataframe + :param tides_mat: + :return: + """ + logger.info("Parsing %s", tides_mat) + mat_data = loadmat(tides_mat)["data"] + rows = [] + for i in range(0, len(mat_data["site"])): + for j in range(0, len(mat_data["time"])): + rows.append( + { + "beach": mat_data["site"][i][0], + "lon": mat_data["lons"][i][0], + "lat": mat_data["lats"][i][0], + "datetime": matlab_datenum_to_datetime(mat_data["time"][j][0]), + "tide": mat_data["tide"][i][j], + } + ) + + df = pd.DataFrame(rows) + df["datetime"] = df["datetime"].dt.round("1s") + return df + + +def parse_profiles(profiles_mat): + """ + Parses the raw profiles.mat file and returns a pandas dataframe + :param tides_mat: + :return: + """ + logger.info("Parsing %s", profiles_mat) + mat_data = loadmat(profiles_mat)["data"] + rows = [] + for i in range(0, len(mat_data["site"])): + for j in range(0, len(mat_data["pfx"][i])): + for profile_type in ["prestorm", "poststorm"]: + + if profile_type == "prestorm": + z = mat_data["pf1"][i][j][0] + if profile_type == "poststorm": + z = mat_data["pf2"][i][j][0] + + rows.append( + { + "beach": mat_data["site"][i], + "lon": mat_data["lon"][i], + "lat": mat_data["lat"][i], + "profile_type": profile_type, + "x": mat_data["pfx"][i][j][0], + "z": z, + } + ) + + df = pd.DataFrame(rows) + return df + + +def remove_zeros(df_profiles): + """ + When parsing the pre/post storm profiles, the end of some profiles have constant values of zero. Let's change + these to NaNs for consistancy. Didn't use pandas fillnan because 0 may still be a valid value. + :param df: + :return: + """ + + df_profiles = df_profiles.sort_index() + groups = df_profiles.groupby(level=["site_id", "profile_type"]) + for key, _ in groups: + logger.debug("Removing zeros from {} profile at {}".format(key[1], key[0])) + idx_site = (df_profiles.index.get_level_values("site_id") == key[0]) & ( + df_profiles.index.get_level_values("profile_type") == key[1] + ) + df_profile = df_profiles[idx_site] + x_last_ele = df_profile[df_profile.z != 0].index.get_level_values("x")[-1] + df_profiles.loc[idx_site & (df_profiles.index.get_level_values("x") > x_last_ele), "z"] = np.nan + + return df_profiles + + +def matlab_datenum_to_datetime(matlab_datenum): + """ + Adapted from https://stackoverflow.com/a/13965852 + :param matlab_datenum: + :return: + """ + return datetime.fromordinal(int(matlab_datenum)) + timedelta(days=matlab_datenum % 1) - timedelta(days=366) + + +def get_unique_sites(dfs, cols=["beach", "lat", "lon"]): + """ + Generates a dataframe of unique sites based on beach names, lats and lons. Creates a unique site ID for each. + :param dfs: + :param cols: + :return: + """ + + rows = [] + df_all = pd.concat([df[cols] for df in dfs]) + beach_groups = df_all.groupby(["beach"]) + for beach_name, beach_group in beach_groups: + site_groups = beach_group.groupby(["lat", "lon"]) + siteNo = 1 + for site_name, site_group in site_groups: + site = "{}{:04d}".format(beach_name, siteNo) + rows.append({"site_id": site, "lat": site_name[0], "lon": site_name[1], "beach": beach_name}) + siteNo += 1 + + df = pd.DataFrame(rows) + + return df + + +def replace_unique_sites(df, df_sites, cols=["lat", "lon"]): + """ + Replaces beach/lat/lon columns with the unique site_id + :param dfs: + :param df_sites: + :return: + """ + # Make the sites index a column, so it can be merged into df + df_sites["site_id"] = df_sites.index.get_level_values("site_id") + + # Merging on a float can lead to subtle bugs. Lets convert lat/lons to integers and merge on that instead + precision = 8 + df_sites["lat_int"] = np.round(df_sites["lat"] * 10 ** precision).astype(np.int64) + df_sites["lon_int"] = np.round(df_sites["lon"] * 10 ** precision).astype(np.int64) + df["lat_int"] = np.round(df["lat"] * 10 ** precision).astype(np.int64) + df["lon_int"] = np.round(df["lon"] * 10 ** precision).astype(np.int64) + + df_merged = df.merge(df_sites, on=["lat_int", "lon_int"]) + + # Check that all our records have a unique site identifier + n_unmatched = len(df) - len(df_merged) + if n_unmatched > 0: + logger.warning("Not all records (%d of %d) matched with a unique site", n_unmatched, len(df)) + + df_merged = df_merged.drop( + columns=[ + "lat_x", + "lon_x", + "lat_int", + "lon_int", + "beach_y", + "beach_x", + "lat_y", + "lon_y", + "orientation", + "profile_x_lat_lon", + ] + ) + + return df_merged + + +@click.command(short_help="create sites.csv") +@click.option("--waves-mat", required=True, help=".mat file containing wave records") +@click.option("--tides-mat", required=True, help=".mat file containing tide records") +@click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") +@click.option("--orientations-mat", required=True, help=".mat file containing orientation of beach profiles") +@click.option("--output-file", required=True, help="where to save sites.csv") +def create_sites_csv(waves_mat, tides_mat, profiles_mat, orientations_mat, output_file): + logger.info("Creating %s", output_file) + df_waves = parse_waves(waves_mat=waves_mat) + df_tides = parse_tides(tides_mat=tides_mat) + df_profiles = parse_profiles(profiles_mat=profiles_mat) + df_orientations = parse_orientations(orientations_mat=orientations_mat) + df_sites = get_unique_sites(dfs=[df_waves, df_tides, df_profiles]) + df_sites = combine_sites_and_orientaions(df_sites, df_orientations) + df_sites = specify_lat_lon_profile_center(df_sites) + df_sites.set_index(["site_id"], inplace=True) + df_sites.to_csv(output_file) + logger.info("Created %s", output_file) + + +@click.command(short_help="create waves.csv") +@click.option("--waves-mat", required=True, help=".mat file containing wave records") +@click.option("--sites-csv", required=True, help=".csv file description of cross section sites") +@click.option("--output-file", required=True, help="where to save waves.csv") +def create_waves_csv(waves_mat, sites_csv, output_file): + logger.info("Creating %s", output_file) + df_waves = parse_waves(waves_mat=waves_mat) + df_sites = pd.read_csv(sites_csv, index_col=[0]) + df_waves = replace_unique_sites(df_waves, df_sites) + df_waves.set_index(["site_id", "datetime"], inplace=True) + df_waves.sort_index(inplace=True) + df_waves.to_csv(output_file) + logger.info("Created %s", output_file) + + +@click.command(short_help="create profiles.csv") +@click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") +@click.option("--sites-csv", required=True, help=".csv file description of cross section sites") +@click.option("--output-file", required=True, help="where to save profiles.csv") +def create_profiles_csv(profiles_mat, sites_csv, output_file): + logger.info("Creating %s", output_file) + df_profiles = parse_profiles(profiles_mat=profiles_mat) + df_sites = pd.read_csv(sites_csv, index_col=[0]) + df_profiles = replace_unique_sites(df_profiles, df_sites) + df_profiles.set_index(["site_id", "profile_type", "x"], inplace=True) + df_profiles.sort_index(inplace=True) + df_profiles.to_csv(output_file) + logger.info("Created %s", output_file) + + +@click.command(short_help="create profiles.csv") +@click.option("--tides-mat", required=True, help=".mat file containing tides") +@click.option("--sites-csv", required=True, help=".csv file description of cross section sites") +@click.option("--output-file", required=True, help="where to save tides.csv") +def create_tides_csv(tides_mat, sites_csv, output_file): + logger.info("Creating %s", output_file) + df_tides = parse_tides(tides_mat=tides_mat) + df_sites = pd.read_csv(sites_csv, index_col=[0]) + df_tides = replace_unique_sites(df_tides, df_sites) + df_tides.set_index(["site_id", "datetime"], inplace=True) + df_tides.sort_index(inplace=True) + df_tides.to_csv(output_file) + logger.info("Created %s", output_file) + + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(create_sites_csv) + cli.add_command(create_waves_csv) + cli.add_command(create_profiles_csv) + cli.add_command(create_tides_csv) + cli() + +pd.set_option("display.precision", 8) +pd.set_option("display.max_columns", None) From 4bba8a3331f823070c05aa65a3eab332789e1cd8 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:26:41 +1100 Subject: [PATCH 07/65] Convert to CLI commands --- src/data/csv_to_shp.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/data/csv_to_shp.py b/src/data/csv_to_shp.py index 6016252..e663a86 100644 --- a/src/data/csv_to_shp.py +++ b/src/data/csv_to_shp.py @@ -7,11 +7,14 @@ import fiona import pandas as pd from fiona.crs import from_epsg from shapely.geometry import Point, mapping +import logging.config +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) +logger = logging.getLogger(__name__) @click.command() -@click.argument('input_csv') -@click.argument('output_shp') +@click.option("--input-csv", required=True, help=".csv file to convert") +@click.option("--output-shp", required=True, help="where to store .shp file") def sites_csv_to_shp(input_csv, output_shp): """ Converts our dataframe of sites to .shp to load in QGis @@ -19,30 +22,22 @@ def sites_csv_to_shp(input_csv, output_shp): :param output_shp: :return: """ + logger.info('Converting %s to %s', input_csv, output_shp) df_sites = pd.read_csv(input_csv, index_col=[0]) - schema = { - 'geometry': 'Point', - 'properties': { - 'beach': 'str', - 'site_id': 'str' - } - } - with fiona.open(output_shp, 'w', crs=from_epsg(4326), driver='ESRI Shapefile', schema=schema) as output: + schema = {"geometry": "Point", "properties": {"beach": "str", "site_id": "str"}} + with fiona.open(output_shp, "w", crs=from_epsg(4326), driver="ESRI Shapefile", schema=schema) as output: for index, row in df_sites.iterrows(): - point = Point(row['lon'], row['lat']) - prop = { - 'beach': row['beach'], - 'site_id': index, - } - output.write({'geometry': mapping(point), 'properties': prop}) - + point = Point(row["lon"], row["lat"]) + prop = {"beach": row["beach"], "site_id": index} + output.write({"geometry": mapping(point), "properties": prop}) + logger.info('Done!') @click.group() def cli(): pass -if __name__ == '__main__': +if __name__ == "__main__": cli.add_command(sites_csv_to_shp) cli() From 03c4655c0557478d799c95d109f341bad098014a Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:27:11 +1100 Subject: [PATCH 08/65] Fix formatting --- README.md | 55 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index fd87bb7..fef7520 100644 --- a/README.md +++ b/README.md @@ -1,56 +1,61 @@ # 2016 Narrabeen Storm EWS Performance -This repository investigates whether the storm impacts (i.e. Sallenger, 2000) of the June 2016 Narrabeen Storm could -have been forecasted in advance. +This repository investigates whether the storm impacts (i.e. Sallenger, 2000) of the June 2016 Narrabeen Storm could +have been forecasted in advance. ## Repository and analysis format -This repository follows the [Cookiecutter Data Science](https://drivendata.github.io/cookiecutter-data-science/) -structure where possible. The analysis is done in python (look at the `/src/` folder) with some interactive, -exploratory notebooks located at `/notebooks`. +This repository follows the [Cookiecutter Data Science](https://drivendata.github.io/cookiecutter-data-science/) +structure where possible. The analysis is done in python (look at the `/src/` folder) with some interactive, +exploratory notebooks located at `/notebooks`. Development is conducted using a [gitflow](https://www.atlassian -.com/git/tutorials/comparing-workflows/gitflow-workflow) approach - mainly the `master` branch stores the official -release history and the `develop` branch serves as an integration branch for features. Other `hotfix` and `feature` +.com/git/tutorials/comparing-workflows/gitflow-workflow) approach - mainly the `master` branch stores the official +release history and the `develop` branch serves as an integration branch for features. Other `hotfix` and `feature` branches should be created and merged as necessary. ## Where to start? +Check .env +Uses pipenv 1. Clone this repository. 2. Pull data from WRL coastal J drive with `make pull-data` -3. Check out jupyter notebook `./notebooks/01_exploration.ipynb` which has an example of how to import the data and -some interactive widgets. +3. Check out jupyter notebook `./notebooks/01_exploration.ipynb` which has an example of how to import the data and +some interactive widgets. ## Requirements The following requirements are needed to run various bits: -- [Python 3.6+](https://conda.io/docs/user-guide/install/windows.html): Used for processing and analysing data. +- [Python 3.6+](https://conda.io/docs/user-guide/install/windows.html): Used for processing and analysing data. Jupyter notebooks are used for exploratory analyis and communication. -- [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and +- [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and extracting dune crests/toes -- [rclone](https://rclone.org/downloads/): Data is not tracked by this repository, but is backed up to a remote -Chris Leaman working directory located on the WRL coastal drive. Rclone is used to sync local and remote copies. +- [rclone](https://rclone.org/downloads/): Data is not tracked by this repository, but is backed up to a remote +Chris Leaman working directory located on the WRL coastal drive. Rclone is used to sync local and remote copies. Ensure rclone.exe is located on your `PATH` environment. - [gnuMake](http://gnuwin32.sourceforge.net/packages/make.htm): A list of commands for processing data is provided in the `./Makefile`. Use gnuMake to launch these commands. Ensure make.exe is located on your `PATH` environment. ## Available data -Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the -repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can +Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the +repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can use to push/pull to, using rclone. In order to get the data, run `make pull-data`. List of data: -- `/data/raw/processed_shorelines`: This data was recieved from Tom Beuzen in October 2018. It consists of pre/post -storm profiles at every 100 m sections along beaches ranging from Dee Why to Nambucca . Profiles are based on raw -aerial LIDAR and were processed by Mitch Harley. Tides and waves (10 m contour and reverse shoaled deepwater) for +- `/data/raw/processed_shorelines`: This data was recieved from Tom Beuzen in October 2018. It consists of pre/post +storm profiles at every 100 m sections along beaches ranging from Dee Why to Nambucca . Profiles are based on raw +aerial LIDAR and were processed by Mitch Harley. Tides and waves (10 m contour and reverse shoaled deepwater) for each individual 100 m section is also provided. -- `/data/raw/raw_lidar`: This is the raw pre/post storm aerial LIDAR which was taken for the June 2016 storm. `.las` -files are the raw files which have been processed into `.tiff` files using `PDAL`. Note that these files have not -been corrected for systematic errors, so actual elevations should be taken from the `processed_shorelines` folder. +- `/data/raw/raw_lidar`: This is the raw pre/post storm aerial LIDAR which was taken for the June 2016 storm. `.las` +files are the raw files which have been processed into `.tiff` files using `PDAL`. Note that these files have not +been corrected for systematic errors, so actual elevations should be taken from the `processed_shorelines` folder. Obtained November 2018 from Mitch Harley from the black external HDD labeled "UNSW LIDAR". -- `/data/raw/profile_features`: Dune toe and crest locations based on prestorm LIDAR. Refer to `/notebooks/qgis.qgz` +- `/data/raw/profile_features`: Dune toe and crest locations based on prestorm LIDAR. Refer to `/notebooks/qgis.qgz` as this shows how they were manually extracted. Note that the shapefiles only show the location (lat/lon) of the dune crest and toe. For actual elevations, these locations need to related to the processed shorelines. ## Notebooks - `/notebooks/01_exploration.ipynb`: Shows how to import processed shorelines, waves and tides. An interactive widget plots the location and cross sections. -- `/notebooks/qgis.qgz`: A QGIS file which is used to explore the aerial LIDAR data in `/data/raw/raw_lidar`. By -examining the pre-strom lidar, dune crest and dune toe lines are manually extracted. These are stored in the -`/data/profile_features/`. +- `/notebooks/qgis.qgz`: A QGIS file which is used to explore the aerial LIDAR data in `/data/raw/raw_lidar`. By +examining the pre-strom lidar, dune crest and dune toe lines are manually extracted. These are stored in the +`/data/profile_features/`. + +## TODO +https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/ \ No newline at end of file From 60f78a4e109dfb1d452003bd56270d0a4b7078d2 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:27:26 +1100 Subject: [PATCH 09/65] Update Makefile --- Makefile | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index eb4019e..d0c690c 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,24 @@ -DATA_BACKUP_DIR = "J:/Coastal/Temp/CKL/nsw_2016_storm_impact/data" +############################### +# Load environment variables + +include .env +export $(shell sed 's/=.*//' .env) +CURRENT_DIR = $(shell pwd) + + +############################### +# Create python virtual environment + +. PHONY: venv_init + +venv-init: ##@environment Setup virtual environment + pip install pipenv + pipenv --python 3.7 + pipenv install -################################################################################# -# PROJECT RULES # -################################################################################# -.PHONY: push-data mat_to_csv sites-csv-to-shp + +############################### +# Get data from network drive push-data: ##@data Copies data from ./data/ to data backup directory rclone copy ./data/ $(DATA_BACKUP_DIR) --exclude "*.las" --progress @@ -12,15 +27,74 @@ pull-data: ##@data Copies data from data backup directory to ./data/ # We probably don't want to pull the raw LIDAR .las files, so lets exclude them rclone copy $(DATA_BACKUP_DIR) ./data/ --exclude "*.las" --progress + +############################### +# Process data +.PHONY: process-mat + +process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/profiles.csv ./data/interim/tides.csv ##@data Process all .mat to .csv + +# Calculates beach orientations at each profile +./data/raw/processed_shorelines/orientations.mat: ./data/raw/processed_shorelines/profiles.mat + $(MATLAB_PATH) -nosplash -r "cd $(CURRENT_DIR); run('./src/data/beach_orientations.m'); quit" + +# Produces a .csv of sites where our beach cross-sections are located +./data/interim/sites.csv: ./data/raw/processed_shorelines/*.mat + pipenv run python ./src/data/parse_mat.py create-sites-csv \ + --waves-mat "./data/raw/processed_shorelines/waves.mat" \ + --tides-mat "./data/raw/processed_shorelines/tides.mat" \ + --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ + --orientations-mat "./data/raw/processed_shorelines/orientations.mat" \ + --output-file "./data/interim/sites.csv" + +# Produces a .csv of waves for each site +./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat ./src/data/parse_mat.py + pipenv run python ./src/data/parse_mat.py create-waves-csv \ + --waves-mat "./data/raw/processed_shorelines/waves.mat" \ + --sites-csv "./data/interim/sites.csv" \ + --output-file "./data/interim/waves.csv" + +# Produces a .csv of profiles for each site +./data/interim/profiles.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/profiles.mat ./src/data/parse_mat.py + pipenv run python ./src/data/parse_mat.py create-profiles-csv \ + --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ + --sites-csv "./data/interim/sites.csv" \ + --output-file "./data/interim/profiles.csv" + +# Produces a .csv of tides for each site +./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat ./src/data/parse_mat.py + pipenv run python ./src/data/parse_mat.py create-tides-csv \ + --tides-mat "./data/raw/processed_shorelines/tides.mat" \ + --sites-csv "./data/interim/sites.csv" \ + --output-file "./data/interim/tides.csv" + +./data/interim/sites.shp : ./data/interim/sites.csv + pipenv run python ./src/data/csv_to_shp.py sites-csv-to-shp \ + --input-csv "./data/interim/sites.csv" \ + --output-shp "./data/interim/sites.shp" + +################################################################################# +# PROJECT RULES # +################################################################################# +.PHONY: push-data parse_mat sites-csv-to-shp + + mat-to-csv: ##@data Converts raw .mat files to .csv for python - cd ./src/data/ && python mat_to_csv.py + cd ./src/data/ && python parse_mat.py sites-csv-to-shp: ##@data Create the sites.shp from sites.csv cd ./src/data && python csv_to_shp.py sites_csv_to_shp "..\..\data\interim\sites.csv" "..\..\data\interim\sites.shp" -################################################################################# -# Self Documenting Commands # -################################################################################# + +############################### +# Misc commands +format: ./src/*.py ##@misc Check python file formatting + pipenv run black --line-length 120 "src/" + + +############################### +# Help command + .DEFAULT_GOAL := help .PHONY: help From 6ddd015a6697cf81faeb48027ca6ab8f6e7b3f9b Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 15:27:52 +1100 Subject: [PATCH 10/65] Include .env file (as an example) --- .env | 13 +++++++++++++ .gitignore | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..08bef7d --- /dev/null +++ b/.env @@ -0,0 +1,13 @@ +# Environment variables go here, these will be automatically read when using "pipenv run python 'file.py'" + +# Location where data is backed up to. Should be able to copy a set of the data from here. +DATA_BACKUP_DIR="J:/Coastal/Temp/CKL/nsw_2016_storm_impact/data" + +# Location where the matlab interpreter is located. Required for a couple of data processing scripts. +MATLAB_PATH="C:/Program Files/MATLAB/R2016b/bin/win64/MATLAB.exe" + + +# The settings below should be left as is unless you know what you're doing. + +# We want to create the pipenv virtualenv in the current folder +PIPENV_VENV_IN_PROJECT=1 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 156fcca..1dadcb9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ *.asv # DotEnv configuration -.env +# .env # Python __pycache__/ From 133a1ace1a46be46215a353ea70ad5fbb0661318 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 16:07:45 +1100 Subject: [PATCH 11/65] Add pyproj requirement --- Pipfile | 1 + Pipfile.lock | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Pipfile b/Pipfile index b77f0b5..5643814 100644 --- a/Pipfile +++ b/Pipfile @@ -16,6 +16,7 @@ black = "*" shapely = "*" fiona = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.7.13-cp37-cp37m-win_amd64.whl"} gdal = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl"} +pyproj = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/pyproj-1.9.5.1-cp37-cp37m-win_amd64.whl"} [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index 2f9b793..e511601 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "b69e9a3b98da8758ee19f86a9f158f31b6538abdbe55c3352ef0cb71cb617b5b" + "sha256": "33595d902a1ea304411921342c1637944162170fafe98ebf510f973a4cba9bb1" }, "pipfile-spec": 6, "requires": { @@ -216,6 +216,14 @@ ], "version": "==2.3.0" }, + "pyproj": { + "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/pyproj-1.9.5.1-cp37-cp37m-win_amd64.whl", + "hashes": [ + "sha256:2b8d0e937e1fa28b65bb351930ab2df9b5bd78e4cc953f7a5a415ff206a3acde" + ], + "index": "pypi", + "version": "==1.9.5.1" + }, "python-dateutil": { "hashes": [ "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", From c6cbee8920ee297852d21ff44fad31a6ecfd6ed4 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 16:08:07 +1100 Subject: [PATCH 12/65] Convert function to CLI command --- src/data/profile_features.py | 37 +++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/data/profile_features.py b/src/data/profile_features.py index db901f3..02ee7d5 100644 --- a/src/data/profile_features.py +++ b/src/data/profile_features.py @@ -1,6 +1,6 @@ import os from functools import partial - +import click import fiona import numpy as np import pandas as pd @@ -8,6 +8,11 @@ import pyproj from shapely.geometry import LineString, Point from shapely.geometry import shape from shapely.ops import transform +import logging.config + + +logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) +logger = logging.getLogger(__name__) def shapes_from_shp(shp_file): @@ -142,12 +147,26 @@ def parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp): return df_profile_features -if __name__ == "__main__": - data_folder = "./data/interim" - df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) - df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - - dune_crest_shp = "./data/raw/profile_features/dune_crests.shp" - dune_toe_shp = "./data/raw/profile_features/dune_toes.shp" +@click.command(short_help='create .csv of dune toe and crest positions') +@click.option("--dune-crest-shp", required=True, help=".csv file to convert") +@click.option("--dune-toe-shp", required=True, help="where to store .shp file") +@click.option("--sites-csv", required=True, help="where to store .shp file") +@click.option("--profiles-csv", required=True, help="where to store .shp file") +@click.option("--output-csv", required=True, help="where to store .shp file") +def create_profile_features(dune_crest_shp, dune_toe_shp, sites_csv, profiles_csv, output_csv): + logger.info("Creating .csv of dune crests and toes") + df_sites = pd.read_csv(sites_csv, index_col=[0]) + df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) df_profile_features = parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp) - df_profile_features.to_csv("./data/interim/profile_features.csv") + df_profile_features.to_csv(output_csv) + logger.info("Done!") + + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(create_profile_features) + cli() From caee3e033ae73f337698f91f6e9708ec8dd523f4 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 16:08:21 +1100 Subject: [PATCH 13/65] Add additional logging --- src/data/csv_to_shp.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/data/csv_to_shp.py b/src/data/csv_to_shp.py index e663a86..39525fa 100644 --- a/src/data/csv_to_shp.py +++ b/src/data/csv_to_shp.py @@ -12,6 +12,7 @@ import logging.config logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) + @click.command() @click.option("--input-csv", required=True, help=".csv file to convert") @click.option("--output-shp", required=True, help="where to store .shp file") @@ -22,7 +23,7 @@ def sites_csv_to_shp(input_csv, output_shp): :param output_shp: :return: """ - logger.info('Converting %s to %s', input_csv, output_shp) + logger.info("Converting %s to %s", input_csv, output_shp) df_sites = pd.read_csv(input_csv, index_col=[0]) schema = {"geometry": "Point", "properties": {"beach": "str", "site_id": "str"}} @@ -31,7 +32,8 @@ def sites_csv_to_shp(input_csv, output_shp): point = Point(row["lon"], row["lat"]) prop = {"beach": row["beach"], "site_id": index} output.write({"geometry": mapping(point), "properties": prop}) - logger.info('Done!') + logger.info("Done!") + @click.group() def cli(): From 88a149590ffa7447c2a02252e9559babe66e3545 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 20 Nov 2018 16:08:35 +1100 Subject: [PATCH 14/65] Add function for creating profile_features.csv --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d0c690c..1dbf142 100644 --- a/Makefile +++ b/Makefile @@ -68,11 +68,20 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/tides.csv" -./data/interim/sites.shp : ./data/interim/sites.csv +# Creates a .shp of our sites to load into QGis +./data/interim/sites.shp: ./data/interim/sites.csv pipenv run python ./src/data/csv_to_shp.py sites-csv-to-shp \ --input-csv "./data/interim/sites.csv" \ --output-shp "./data/interim/sites.shp" +./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv + pipenv run python ./src/data/profile_features.py create-profile-features \ + --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ + --dune-toe-shp "./data/raw/profile_features/dune_toes.shp" \ + --sites-csv "./data/interim/sites.csv" \ + --profiles-csv "./data/interim/profiles.csv" \ + --output-csv "./data/interim/profile_features.csv" + ################################################################################# # PROJECT RULES # ################################################################################# From 70f3ad90be15d56220ec9155f261ec45ae56168f Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 11:48:38 +1100 Subject: [PATCH 15/65] Change default logging level to info --- src/logging.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logging.conf b/src/logging.conf index 5ea7f80..9cb8c0c 100644 --- a/src/logging.conf +++ b/src/logging.conf @@ -23,7 +23,7 @@ qualname=fiona [handler_consoleHandler] class=StreamHandler -level=DEBUG +level=INFO formatter=simpleFormatter args=(sys.stdout,) From 96bb2597550fd89b59f84cb68b9e795202dbd6db Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 12:12:20 +1100 Subject: [PATCH 16/65] Add environment variable for number of cores to use for analysis --- .env | 3 +++ src/analysis/forecast_twl.py | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.env b/.env index 08bef7d..f144aa6 100644 --- a/.env +++ b/.env @@ -6,6 +6,9 @@ DATA_BACKUP_DIR="J:/Coastal/Temp/CKL/nsw_2016_storm_impact/data" # Location where the matlab interpreter is located. Required for a couple of data processing scripts. MATLAB_PATH="C:/Program Files/MATLAB/R2016b/bin/win64/MATLAB.exe" +# Number of threads to use for multi-core processing. Used when calculating time-varying beach slope when estimating +# total water level. +MULTIPROCESS_THREADS=2 # The settings below should be left as is unless you know what you're doing. diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 70f357e..2fe1b0a 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -12,9 +12,17 @@ from src.analysis.runup_models import sto06_individual, sto06 logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) +MULTIPROCESS_THREADS = int(os.environ.get("MULTIPROCESS_THREADS", 4)) + def forecast_twl( - df_tides, df_profiles, df_waves, df_profile_features, runup_function, n_processes=4, slope="foreshore" + df_tides, + df_profiles, + df_waves, + df_profile_features, + runup_function, + n_processes=MULTIPROCESS_THREADS, + slope="foreshore", ): # Use df_waves as a base df_twl = df_waves.copy() From 21b12a34be8a1f61a02cb2d99504f49c2deb1e3e Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 12:12:38 +1100 Subject: [PATCH 17/65] Remove extra pandas options --- src/data/parse_mat.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index 2e0abda..d6f7cb2 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -340,6 +340,3 @@ if __name__ == "__main__": cli.add_command(create_profiles_csv) cli.add_command(create_tides_csv) cli() - -pd.set_option("display.precision", 8) -pd.set_option("display.max_columns", None) From 9879a9d18cf6c9b9b43aa4b5dfe7f7bbabb71752 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 12:12:59 +1100 Subject: [PATCH 18/65] Fix formatting --- src/data/profile_features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/profile_features.py b/src/data/profile_features.py index 02ee7d5..78ba406 100644 --- a/src/data/profile_features.py +++ b/src/data/profile_features.py @@ -147,7 +147,7 @@ def parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp): return df_profile_features -@click.command(short_help='create .csv of dune toe and crest positions') +@click.command(short_help="create .csv of dune toe and crest positions") @click.option("--dune-crest-shp", required=True, help=".csv file to convert") @click.option("--dune-toe-shp", required=True, help="where to store .shp file") @click.option("--sites-csv", required=True, help="where to store .shp file") From fd2508632744c525337e04de54db6ababdae937c Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 12:13:18 +1100 Subject: [PATCH 19/65] Fix issues with PYTHONPATH --- .env | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env b/.env index f144aa6..a71086e 100644 --- a/.env +++ b/.env @@ -13,4 +13,8 @@ MULTIPROCESS_THREADS=2 # The settings below should be left as is unless you know what you're doing. # We want to create the pipenv virtualenv in the current folder -PIPENV_VENV_IN_PROJECT=1 \ No newline at end of file +PIPENV_VENV_IN_PROJECT=1 + +# Need to set pythonpath so that relative imports can be properly used in with pipenv +# Refer to https://stackoverflow.com/q/52986500 and https://stackoverflow.com/a/49797761 +PYTHONPATH=${PWD} \ No newline at end of file From 07046d4686c6206359f3cd42aaa1a432c28bbbbd Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 12:13:44 +1100 Subject: [PATCH 20/65] Update CLI commands --- Makefile | 48 +++++++++++++++++++-- src/analysis/forecast_twl.py | 54 ++++++++++++++++-------- src/analysis/forecasted_storm_impacts.py | 32 ++++++++++---- src/analysis/observed_storm_impacts.py | 41 +++++++++++++++++- 4 files changed, 145 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index 1dbf142..fc7f22b 100644 --- a/Makefile +++ b/Makefile @@ -48,21 +48,21 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --output-file "./data/interim/sites.csv" # Produces a .csv of waves for each site -./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat ./src/data/parse_mat.py +./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat pipenv run python ./src/data/parse_mat.py create-waves-csv \ --waves-mat "./data/raw/processed_shorelines/waves.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/waves.csv" # Produces a .csv of profiles for each site -./data/interim/profiles.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/profiles.mat ./src/data/parse_mat.py +./data/interim/profiles.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/profiles.mat pipenv run python ./src/data/parse_mat.py create-profiles-csv \ --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/profiles.csv" # Produces a .csv of tides for each site -./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat ./src/data/parse_mat.py +./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat pipenv run python ./src/data/parse_mat.py create-tides-csv \ --tides-mat "./data/raw/processed_shorelines/tides.mat" \ --sites-csv "./data/interim/sites.csv" \ @@ -74,6 +74,7 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --input-csv "./data/interim/sites.csv" \ --output-shp "./data/interim/sites.shp" +# Creates a .csv of our dune toe and crest profile features ./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv pipenv run python ./src/data/profile_features.py create-profile-features \ --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ @@ -82,6 +83,47 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --profiles-csv "./data/interim/profiles.csv" \ --output-csv "./data/interim/profile_features.csv" +# Creates a forecast of twl using sto06 and prestorm time varying prestorm foreshore slope +./data/interim/twl_foreshore_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features.csv + pipenv run python ./src/analysis/forecast_twl.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 "foreshore" \ + --output-file "./data/interim/twl_foreshore_slope_sto06.csv" + +# Creates a forecast of twl using sto06 and prestorm mean foreshore slope +./data/interim/twl_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 + pipenv run python ./src/analysis/forecast_twl.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" \ + --output-file "./data/interim/twl_mean_slope_sto06.csv" + +./data/interim/impacts_observed.csv: ./data/interim/profiles.csv ./data/interim/profile_features.csv + pipenv run python ./src/analysis/observed_storm_impacts.py create-observed-impacts \ + --profiles-csv "./data/interim/profiles.csv" \ + --profile-features-csv "./data/interim/profile_features.csv" \ + --output-file "./data/interim/impacts_observed.csv" + +./data/interim/impacts_forecasted_mean_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_mean_slope_sto06.csv + pipenv run python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + --profile-features-csv "./data/interim/profile_features.csv" \ + --forecasted-twl-csv "./data/interim/twl_mean_slope_sto06.csv" \ + --output-file "./data/interim/impacts_forecasted_mean_slope_sto06.csv" + +./data/interim/impacts_forecasted_foreshore_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_foreshore_slope_sto06.csv + pipenv run python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + --profile-features-csv "./data/interim/profile_features.csv" \ + --forecasted-twl-csv "./data/interim/twl_foreshore_slope_sto06.csv" \ + --output-file "./data/interim/impacts_forecasted_foreshore_slope_sto06.csv" + + ################################################################################# # PROJECT RULES # ################################################################################# diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 2fe1b0a..175c887 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -1,13 +1,14 @@ import logging.config import os from multiprocessing import Pool - +import click import numpy as np import numpy.ma as ma import pandas as pd from scipy import stats -from src.analysis.runup_models import sto06_individual, sto06 + +from src.analysis import runup_models logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) @@ -126,7 +127,7 @@ def foreshore_slope_for_site_id(site_id, df_twl, df_profiles): profile_x=profile_x, profile_z=profile_z, tide=row.tide, - runup_function=sto06_individual, + runup_function=runup_models.sto06_individual, Hs0=row.Hs0, Tp=row.Tp, ), @@ -266,25 +267,42 @@ def crossings(profile_x, profile_z, constant_z): return [profile_x[i] - (profile_x[i] - profile_x[i + 1]) / (z[i] - z[i + 1]) * (z[i]) for i in indicies] -if __name__ == "__main__": +@click.command() +@click.option("--waves-csv", required=True, help="") +@click.option("--tides-csv", required=True, help="") +@click.option("--profiles-csv", required=True, help="") +@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("--output-file", required=True, help="") +def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv, runup_function, slope, output_file): + logger.info("Creating forecast of total water levels") logger.info("Importing data") - data_folder = "./data/interim" - df_waves = pd.read_csv(os.path.join(data_folder, "waves.csv"), index_col=[0, 1]) - df_tides = pd.read_csv(os.path.join(data_folder, "tides.csv"), index_col=[0, 1]) - df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) - df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) + df_waves = pd.read_csv(waves_csv, index_col=[0, 1]) + df_tides = pd.read_csv(tides_csv, index_col=[0, 1]) + df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) logger.info("Forecasting TWL") - df_twl_foreshore_slope_sto06 = forecast_twl( - df_tides, df_profiles, df_waves, df_profile_features, runup_function=sto06, slope="foreshore" + df_tides, + df_profiles, + df_waves, + df_profile_features, + runup_function=getattr(runup_models, runup_function), + slope=slope, ) - df_twl_foreshore_slope_sto06.to_csv(os.path.join(data_folder, "twl_foreshore_slope_sto06.csv")) - df_twl_mean_slope_sto06 = forecast_twl( - df_tides, df_profiles, df_waves, df_profile_features, runup_function=sto06, slope="mean" - ) - df_twl_mean_slope_sto06.to_csv(os.path.join(data_folder, "twl_mean_slope_sto06.csv")) + df_twl_foreshore_slope_sto06.to_csv(output_file) + logger.info("Saved to %s", output_file) + logger.info("Done!") - logger.info("Done") + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(create_twl_forecast) + cli() diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index 8e4acbd..d156cb1 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -4,7 +4,7 @@ Estimates the forecasted storm impacts based on the forecasted water level and d import logging.config import os - +import click import pandas as pd logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) @@ -19,7 +19,7 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): :param df_forecasted_twl: :return: """ - logger.info("Getting forecasted storm regimes") + logger.info("Getting forecasted storm impacts") df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index) @@ -67,12 +67,28 @@ def storm_regime(df_forecasted_impacts): return df_forecasted_impacts -if __name__ == "__main__": +@click.command() +@click.option("--profile-features-csv", required=True, help="") +@click.option("--forecasted-twl-csv", required=True, help="") +@click.option("--output-file", required=True, help="") +def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_file): + + logger.info("Creating observed wave impacts") logger.info("Importing existing data") - data_folder = "./data/interim" - df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) - df_forecasted_twl = pd.read_csv(os.path.join(data_folder, "twl_mean_slope_sto06.csv"), index_col=[0, 1]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) + df_forecasted_twl = pd.read_csv(forecasted_twl_csv, index_col=[0, 1]) df_forecasted_impacts = forecasted_impacts(df_profile_features, df_forecasted_twl) - df_forecasted_impacts.to_csv(os.path.join(data_folder, "impacts_forecasted_mean_slope_sto06.csv")) + df_forecasted_impacts.to_csv(output_file) + logger.info("Saved to %s", output_file) + logger.info("Done!") + + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(create_forecasted_impacts) + cli() diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 7666627..7c12d6a 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -1,6 +1,6 @@ import logging.config import os - +import click import numpy as np import pandas as pd from scipy.integrate import simps @@ -143,3 +143,42 @@ if __name__ == "__main__": # Save dataframe to csv df_observed_impacts.to_csv(os.path.join(data_folder, "impacts_observed.csv")) + + +@click.command() +@click.option("--profiles-csv", required=True, help="") +@click.option("--profile-features-csv", required=True, help="") +@click.option("--output-file", required=True, help="") +def create_observed_impacts(profiles_csv, profile_features_csv, output_file): + + logger.info("Creating observed wave impacts") + logger.info("Importing data") + df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) + + logger.info("Creating new dataframe for observed impacts") + df_observed_impacts = pd.DataFrame(index=df_profile_features.index) + + logger.info("Getting pre/post storm volumes") + df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") + df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone="dune_face") + df_observed_impacts = df_observed_impacts.join([df_swash_vol_changes, df_dune_face_vol_changes]) + + # Classify regime based on volume changes + df_observed_impacts = storm_regime(df_observed_impacts) + + # Save dataframe to csv + df_observed_impacts.to_csv(output_file) + + logger.info("Saved to %s", output_file) + logger.info("Done!") + + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(create_observed_impacts) + cli() From 5a8990df60cb222f1a03ad09f84a32182eeb7fad Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 17:08:42 +1100 Subject: [PATCH 21/65] Update jupyter notebook --- notebooks/01_exploration.ipynb | 896 ++++++++++----------------------- 1 file changed, 264 insertions(+), 632 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index fb37d8d..bb0e806 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -10,11 +10,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T00:22:35.172482Z", - "start_time": "2018-11-19T00:22:35.000206Z" + "end_time": "2018-11-21T05:09:17.883914Z", + "start_time": "2018-11-21T05:09:16.981157Z" } }, "outputs": [], @@ -29,11 +29,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T00:22:50.594936Z", - "start_time": "2018-11-19T00:22:35.173486Z" + "end_time": "2018-11-21T05:09:17.891936Z", + "start_time": "2018-11-21T05:09:17.884916Z" }, "scrolled": true }, @@ -49,17 +49,17 @@ "import plotly.graph_objs as go\n", "import plotly.plotly as py\n", "\n", - "from ipywidgets import widgets\n", + "from ipywidgets import widgets, Output\n", "from IPython.display import display, clear_output, Image" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 22, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T00:51:58.002082Z", - "start_time": "2018-11-19T00:51:45.127794Z" + "end_time": "2018-11-21T05:26:30.254784Z", + "start_time": "2018-11-21T05:26:13.523566Z" }, "pixiedust": { "displayParams": {} @@ -78,491 +78,61 @@ } ], "source": [ - "data_folder = '../data/interim'\n", - "df_waves = pd.read_csv(os.path.join(data_folder, 'waves.csv'), index_col=[0,1])\n", - "df_tides = pd.read_csv(os.path.join(data_folder, 'tides.csv'), index_col=[0,1])\n", - "df_profiles = pd.read_csv(os.path.join(data_folder, 'profiles.csv'), index_col=[0,1,2])\n", - "df_sites = pd.read_csv(os.path.join(data_folder, 'sites.csv'),index_col=[0])\n", - "df_profile_features = pd.read_csv(os.path.join(data_folder, 'profile_features.csv'),index_col=[0])\n", - "df_impacts_compared = pd.read_csv(os.path.join(data_folder,'impacts_observed_vs_forecasted_mean_slope_sto06.csv'),index_col=[0])\n", - "df_twl = pd.read_csv(os.path.join(data_folder,'twl_mean_slope_sto06.csv'),index_col=[0,1])" + "def df_from_csv(csv, index_col, data_folder='../data/interim'):\n", + " return pd.read_csv(os.path.join(data_folder,csv), index_col=index_col)\n", + "\n", + "df_waves = df_from_csv('waves.csv', index_col=[0, 1])\n", + "df_tides = df_from_csv('tides.csv', index_col=[0, 1])\n", + "df_profiles = df_from_csv('profiles.csv', index_col=[0, 1, 2])\n", + "df_sites = df_from_csv('sites.csv', index_col=[0])\n", + "df_profile_features = df_from_csv('profile_features.csv', index_col=[0])\n", + "\n", + "# Note that the forecasted data sets should be in the same order for impacts and twls\n", + "impacts = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('impacts_forecasted_foreshore_slope_sto06.csv', index_col=[0]),\n", + " 'mean_slope_sto06': df_from_csv('impacts_forecasted_mean_slope_sto06.csv', index_col=[0]),\n", + " },\n", + " 'observed': df_from_csv('impacts_observed.csv', index_col=[0])\n", + " }\n", + "\n", + "\n", + "twls = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('twl_foreshore_slope_sto06.csv', index_col=[0, 1]),\n", + " 'mean_slope_sto06':df_from_csv('twl_mean_slope_sto06.csv', index_col=[0, 1]),\n", + " }\n", + "}" ] }, { "cell_type": "code", - "execution_count": 60, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T01:46:34.068613Z", - "start_time": "2018-11-19T01:46:34.021932Z" + "end_time": "2018-11-21T04:02:25.614132Z", + "start_time": "2018-11-21T04:02:25.609119Z" } }, - "outputs": [ - { - "data": { - "text/plain": [ - "[1.2632991506198927,\n", - " 1.393768803168096,\n", - " 1.4898137015209056,\n", - " 1.4536075884721669,\n", - " 1.4108238472203196,\n", - " 1.3456902382958191,\n", - " 1.3190526770579034,\n", - " 1.291134623539095,\n", - " 1.2716049325008096,\n", - " 1.234754724771738,\n", - " 1.1825435278076464,\n", - " 1.2252064606390358,\n", - " 1.2640989420800277,\n", - " 1.2757496999030895,\n", - " 1.2958669929936903,\n", - " 1.2951053747668917,\n", - " 1.2997067012745651,\n", - " 1.2927882315939971,\n", - " 1.3309337732401414,\n", - " 1.3193355176891717,\n", - " 1.2844322857877195,\n", - " 1.2628576180893467,\n", - " 1.2097343104491254,\n", - " 1.2013077303201378,\n", - " 1.1993481704538602,\n", - " 1.2198569961855183,\n", - " 1.2984481427280574,\n", - " 1.3698938539307974,\n", - " 1.4269234117912923,\n", - " 1.4452966027439913,\n", - " 1.4230609854421774,\n", - " 1.3842558204110529,\n", - " 1.3450040465222477,\n", - " 1.29724974139755,\n", - " 1.251148426943638,\n", - " 1.2203239982067688,\n", - " 1.1863161021683857,\n", - " 1.1941366924930163,\n", - " 1.1469348307275298,\n", - " 1.1407884178283354,\n", - " 1.1054402354387345,\n", - " 1.0888031069851187,\n", - " 1.052178951137407,\n", - " 1.042391452505114,\n", - " 1.0022582557622686,\n", - " 0.9574583082522315,\n", - " 0.9273904554517179,\n", - " 0.913868938605881,\n", - " 0.8976037333617174,\n", - " 0.8635964508386459,\n", - " 0.8402776741681438,\n", - " 0.7892652851819926,\n", - " 0.7678051621170874,\n", - " 0.7603964513142425,\n", - " 0.7289481969705937,\n", - " 0.7362069163128326,\n", - " 0.7176683538993814,\n", - " 0.7428153798427477,\n", - " 0.7748796353406857,\n", - " 0.7535515003398277,\n", - " 0.7526143754038663,\n", - " 0.7548002343990244,\n", - " 0.7625400619385548,\n", - " 0.7714761024396927,\n", - " 0.7673985468074385,\n", - " 0.8022138592472895,\n", - " 0.8255303844225207,\n", - " 0.8397447444010038,\n", - " 0.8592502248961733,\n", - " 0.8835338840685852,\n", - " 0.9045770363106742,\n", - " 0.8924312148881293,\n", - " 0.8945346312705259,\n", - " 0.9017789065061824,\n", - " 0.8891514495423394,\n", - " 0.8751173253294721,\n", - " 0.8621537225328324,\n", - " 0.8501934225657698,\n", - " 0.8349119752654496,\n", - " 0.810591742829462,\n", - " 0.7951267561730182,\n", - " 0.7740848011611741,\n", - " 0.7364152898039934,\n", - " 0.7292952850398664,\n", - " 0.7093533687829578,\n", - " 0.7107420200968461,\n", - " 0.7187231371409383,\n", - " 0.7422012746928617,\n", - " 0.7970539274139279,\n", - " 0.8664577626991431,\n", - " 1.0115086760302945,\n", - " 1.1813901874116264,\n", - " 1.3193764924013396,\n", - " 1.4249254280401158,\n", - " 1.4599657994127124,\n", - " 1.4479294322109015,\n", - " 1.4030385044912117,\n", - " 1.3446684286012982,\n", - " 1.2925163876887016,\n", - " 1.2446316279829586,\n", - " 1.2098091099724722,\n", - " 1.1892752127476325,\n", - " 1.1481212531393388,\n", - " 1.1348915384977762,\n", - " 1.1098812210017803,\n", - " 1.0795799167381641,\n", - " 1.0345144546173055,\n", - " 0.9861396633770424,\n", - " 0.9570213815015416,\n", - " 0.9151721064493358,\n", - " 0.8871456344025952,\n", - " 0.8603675256610093,\n", - " 0.8314213104683977,\n", - " 0.801556648971357,\n", - " 0.7832473823225398,\n", - " 0.7861917058854403,\n", - " 0.7775335256878051,\n", - " 0.8038717996714059,\n", - " 0.8191247539180629,\n", - " 0.8714685918657985,\n", - " 0.9204031359563352,\n", - " 0.9701470471949544,\n", - " 0.9977216491845194,\n", - " 1.0117019987510287,\n", - " 1.0237014897684666,\n", - " 1.035735908490389,\n", - " 1.029246597670745,\n", - " 1.0279412447982703,\n", - " 1.0089957427104952,\n", - " 1.0177092555323095,\n", - " 1.015186251942808,\n", - " 1.0147341965721186,\n", - " 0.9726202852349026,\n", - " 0.9684820357793321,\n", - " 0.9546084244653746,\n", - " 0.9589759161165068,\n", - " 0.953681813597972,\n", - " 0.9529659427890556,\n", - " 0.9404538077817732,\n", - " 0.9300524814808376,\n", - " 0.9222194873100475,\n", - " 0.9017481517484488,\n", - " 0.9076603621918959,\n", - " 0.8862256995322542,\n", - " 0.8849165795617614,\n", - " 0.8841602602505668,\n", - " 0.8669393270833857,\n", - " 0.8650991391320055,\n", - " 0.8516334480516885,\n", - " 0.8548785794681827,\n", - " 0.8393830912173211,\n", - " 0.8397545090425697,\n", - " 0.8345690679109284,\n", - " 0.8455177640872806,\n", - " 0.8639961015857328,\n", - " 0.8646032495121627,\n", - " 0.8714037641606539,\n", - " 0.8740342223883719,\n", - " 0.8692493396127806,\n", - " 0.8600609911428099,\n", - " 0.8505467167521669,\n", - " 0.8475405142048628,\n", - " 0.8373268648191554,\n", - " 0.8301463580456817,\n", - " 0.8219577852673429,\n", - " 0.8331171378125211,\n", - " 0.8723196585969643,\n", - " 0.9319822903689668,\n", - " 0.9940823004100856,\n", - " 1.0434248912246848,\n", - " 1.101176776862885,\n", - " 1.160202085578775,\n", - " 1.2045316162106758,\n", - " 1.2698189315085562,\n", - " 1.3602329199109748,\n", - " 1.4496415572317367,\n", - " 1.634178668090898,\n", - " 1.869479984114988,\n", - " 2.1080339573236206,\n", - " 2.367410461576668,\n", - " 2.6226928356071317,\n", - " 2.9442015957178884,\n", - " 3.1934689280272237,\n", - " 3.369577640508405,\n", - " 3.363085077734422,\n", - " 3.3308943745259465,\n", - " 3.34345488671094,\n", - " 3.270858263633565,\n", - " 3.2662111341701667,\n", - " 3.2756378275893434,\n", - " 3.3639544916139155,\n", - " 3.3813825931175288,\n", - " 3.473438910554288,\n", - " 3.510285453735353,\n", - " 3.497185388999287,\n", - " 3.5310509729742883,\n", - " 3.5546726349870728,\n", - " 3.5401999948844587,\n", - " 3.5617762613322217,\n", - " 3.6112088114943175,\n", - " 3.7656363854245662,\n", - " 4.014488374401276,\n", - " 4.204022189099045,\n", - " 4.323008132565011,\n", - " 4.55292318924386,\n", - " 4.465660719519098,\n", - " 4.4462713982384505,\n", - " 4.2751386528659046,\n", - " 4.347505168964963,\n", - " 4.502927715648842,\n", - " 4.6885793802285765,\n", - " 4.628199944839338,\n", - " 4.455704001987412,\n", - " 4.317993775686132,\n", - " 4.115695546027388,\n", - " 3.8856856906623976,\n", - " 3.627439800093474,\n", - " 3.502885968925649,\n", - " 3.4164328569002587,\n", - " 3.3596064846507008,\n", - " 3.29411314173578,\n", - " 3.2749124810384576,\n", - " 3.214527754620344,\n", - " 3.17334523565404,\n", - " 3.1107136332898935,\n", - " 3.084373228564107,\n", - " 3.0189640476554875,\n", - " 3.0295228943214165,\n", - " 2.9996571416959896,\n", - " 2.9208446700168778,\n", - " 2.8680589886628094,\n", - " 2.907972334429489,\n", - " 2.861472344420395,\n", - " 2.8474889903361227,\n", - " 2.745248668694825,\n", - " 2.7303053202759995,\n", - " 2.6135951060595994,\n", - " 2.529475789890884,\n", - " 2.4903330472397327,\n", - " 2.439152558030405,\n", - " 2.4368767677687853,\n", - " 2.3475370460575014,\n", - " 2.3556983183736806,\n", - " 2.212536123406467,\n", - " 2.200817615698378,\n", - " 2.13859895332105,\n", - " 2.053540819899654,\n", - " 1.9580330469751663,\n", - " 1.92850392599216,\n", - " 1.8607478131182549,\n", - " 1.8192193348993184,\n", - " 1.739752655683747,\n", - " 1.7529300332032445,\n", - " 1.7285697305855519,\n", - " 1.7209222898565135,\n", - " 1.730323846580886,\n", - " 1.7602226717400549,\n", - " 1.7801514257593374,\n", - " 1.8478191773477528,\n", - " 1.8702440191372558,\n", - " 1.9288889269187404,\n", - " 1.977779637269245,\n", - " 1.974069087436935,\n", - " 1.967943192597384,\n", - " 1.9734792374254413,\n", - " 1.9563175455510269,\n", - " 1.9851023973301751,\n", - " 1.9852429909185416,\n", - " 1.960973516701933,\n", - " 1.9190006772680768,\n", - " 1.8871379330236293,\n", - " 1.8870815530722465,\n", - " 1.906325105157349,\n", - " 1.916718509077828,\n", - " 1.906721247909469,\n", - " 1.8748526018527751,\n", - " 1.8622401861424824,\n", - " 1.8463821096893551,\n", - " 1.8572306486131245,\n", - " 1.8591498672409832,\n", - " 1.8223814374026053,\n", - " 1.8143064584548998,\n", - " 1.786843829088606,\n", - " 1.770264490937835,\n", - " 1.7721429351265074,\n", - " 1.7555363714930243,\n", - " 1.7617766143642997,\n", - " 1.715462916442869,\n", - " 1.7274193576715526,\n", - " 1.7066412454414952,\n", - " 1.7168491132571937,\n", - " 1.6802648723507885,\n", - " 1.6475747104260474,\n", - " 1.6341871129751102,\n", - " 1.6091167908646318,\n", - " 1.5754827235715867,\n", - " 1.566181947942738,\n", - " 1.5473300334508406,\n", - " 1.5344938121808378,\n", - " 1.5791108463484766,\n", - " 1.5633578452614083,\n", - " 1.56291253637572,\n", - " 1.5231738814104063,\n", - " 1.4514498766069597,\n", - " 1.4376627927243346,\n", - " 1.4007086451410151,\n", - " 1.361294300581865,\n", - " 1.3392246803808323,\n", - " 1.2813975364411236,\n", - " 1.2601920400317963,\n", - " 1.209418405100685,\n", - " 1.2137070403515318,\n", - " 1.2049792764137484,\n", - " 1.1859767648774089,\n", - " 1.1682817640426169,\n", - " 1.1813938099398504,\n", - " 1.1216644444786041,\n", - " 1.0775990331361116,\n", - " 1.051008230001901,\n", - " 1.035272409784175,\n", - " 0.9994601153037259,\n", - " 0.9763690428293406,\n", - " 0.9455716397300884,\n", - " 0.9369020938970462,\n", - " 0.9204793767326028,\n", - " 0.914089505316063,\n", - " 0.8960105562010623,\n", - " 0.8934437292918901,\n", - " 0.9031614944756692,\n", - " 0.9588457279651288,\n", - " 1.0479761841513588,\n", - " 1.0475914732050602,\n", - " 1.0412848076668946,\n", - " 1.026783246785745,\n", - " 0.9808911279890768,\n", - " 0.9578515661507389,\n", - " 0.9364803077670656,\n", - " 0.9201806001439652,\n", - " 0.900943185485514,\n", - " 0.9043881333592584,\n", - " 0.9018505116725885,\n", - " 0.8880480709891933,\n", - " 0.8802535371737461,\n", - " 0.8924713481078699,\n", - " 0.9009292063519142,\n", - " 0.8990731179853512,\n", - " 0.9004002302179219,\n", - " 0.9026300674742864,\n", - " 0.9046738352677264,\n", - " 0.904834138707496,\n", - " 0.9067177221688292,\n", - " 0.8875546112442375,\n", - " 0.9010090916934979,\n", - " 0.8906147232150059,\n", - " 0.8760694369978883,\n", - " 0.8846086055607917,\n", - " 0.8732540400123358,\n", - " 0.8519251139287594,\n", - " 0.8569288126630621,\n", - " 0.8885552295624393,\n", - " 0.9078896892061099,\n", - " 0.9399039050339821,\n", - " 1.0325465634873403,\n", - " 1.18424717131601,\n", - " 1.4069828487068947,\n", - " 1.5374548940117276,\n", - " 1.5592208649143704,\n", - " 1.5432838207300614,\n", - " 1.430037758416392,\n", - " 1.4128296280377908,\n", - " 1.3924646086142305,\n", - " 1.2989964522293047,\n", - " 1.3115873758048104,\n", - " 1.2789734650111482,\n", - " 1.2562195218363923,\n", - " 1.2425567241967677,\n", - " 1.2515153481974286,\n", - " 1.2895012340687415,\n", - " 1.3511015057834526,\n", - " 1.2776611393828077,\n", - " 1.2889070757257357,\n", - " 1.2794203522299867,\n", - " 1.2548108180619686,\n", - " 1.2044788147076335,\n", - " 1.1968679971063805,\n", - " 1.1658325726462586,\n", - " 1.1352834921748485,\n", - " 1.1290167340765007,\n", - " 1.1071343580729138,\n", - " 1.0667294091019908,\n", - " 1.0462272327840756,\n", - " 1.0595637432866842,\n", - " 1.0531887583835708,\n", - " 1.00594994025436,\n", - " 1.0256902213209238,\n", - " 1.0057973617929692,\n", - " 0.9815316927612888,\n", - " 0.9694308369279236,\n", - " 0.9745064147967398,\n", - " 0.9642414097281632,\n", - " 0.9454858326097626,\n", - " 0.8915043979945115,\n", - " 0.8921364517144029,\n", - " 0.8938741538636313,\n", - " 0.9006158946503036,\n", - " 0.9038070077671668,\n", - " 0.9029920317337962,\n", - " 0.9168944419741138,\n", - " 0.9060133253634725,\n", - " 0.9234356237212368,\n", - " 0.9636884966733456,\n", - " 0.9755737029064364,\n", - " 0.9702829562843946,\n", - " 0.9718671879151456,\n", - " 0.9828543680939154,\n", - " 0.983976532687876,\n", - " 1.0192056294910876,\n", - " 1.02304570647853,\n", - " 1.0275918776272523,\n", - " 1.02350472267319,\n", - " 1.0363437201913752,\n", - " 1.0228960581536888,\n", - " 1.031773040065624,\n", - " 0.9961028819855686,\n", - " 0.9799407193704522,\n", - " 0.9639080227074568,\n", - " 0.9526042230966292,\n", - " 0.9513024537542358,\n", - " 0.9556460082467124,\n", - " 0.9286465597857544,\n", - " 0.9110140301695694,\n", - " 0.8984138010448336,\n", - " 0.910361202178044]" - ] - }, - "execution_count": 60, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_twl.query(\"site_id=='NARRA0018'\").Hs0.tolist()" - ] + "outputs": [], + "source": [] }, { "cell_type": "code", - "execution_count": 184, + "execution_count": 60, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T04:00:27.734848Z", - "start_time": "2018-11-19T04:00:26.097751Z" + "end_time": "2018-11-21T06:07:17.024328Z", + "start_time": "2018-11-21T06:07:14.488829Z" }, - "code_folding": [ - 277 - ], + "code_folding": [], "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3790264e7f4a4fb6b5838d18c50957dc", + "model_id": "e4413b11f1694a8fb8da0c001aa18344", "version_major": 2, "version_minor": 0 }, @@ -582,34 +152,44 @@ "

\n" ], "text/plain": [ - "VBox(children=(VBox(children=(HTML(value='Filter by observed and predicted impacts:'), HBox(children=(SelectMultiple(description='Forecasted Impacts', index=(0, 1, 2), options=('overwash', 'collision', 'swash'), value=('overwash', 'collision', 'swash')), SelectMultiple(description='Observed Impacts', index=(0, 1), options=('swash', 'collision'), value=('swash', 'collision')))))), 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'),)))), HBox(children=(FigureWidget({\n", + "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), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))))))), VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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'),)))), HBox(children=(FigureWidget({\n", " 'data': [{'name': 'Pre Storm Profile',\n", " 'type': 'scatter',\n", - " 'uid': 'a7ef1527-c36f-4f59-9d62-64928b7b924f',\n", + " 'uid': '391027af-be5a-4413-863d-53385a59391d',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'name': 'Post Storm Profile',\n", " 'type': 'scatter',\n", - " 'uid': '8f93d4ab-7ef5-4798-b76d-ea742faf88a5',\n", + " 'uid': 'a5d7d2e9-d3af-462c-9466-51c2b6f09aa4',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'marker': {'color': 'rgb(17, 157, 255)', 'size': 20},\n", " 'mode': 'markers',\n", " 'name': 'Pre-storm dune crest',\n", " 'type': 'scatter',\n", - " 'uid': 'fd8574f3-f280-4ef6-9792-d1c14df1eb55',\n", + " 'uid': '2eba8b17-45a7-4bcd-b988-31bbb487fb1f',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'marker': {'color': 'rgb(231, 99, 250)', 'size': 20},\n", " 'mode': 'markers',\n", " 'name': 'Pre-storm dune toe',\n", " 'type': 'scatter',\n", - " 'uid': '4e6d2022-7ff2-42e6-9334-d76411906808',\n", + " 'uid': '022f5c93-fc10-4d1d-ac97-e30b8efd28d1',\n", + " 'x': [0],\n", + " 'y': [0]},\n", + " {'name': 'Peak R_high: foreshore_slope_sto06',\n", + " 'type': 'scatter',\n", + " 'uid': '0c93ba4e-2213-4db9-9b13-1227d17f5074',\n", + " 'x': [0],\n", + " 'y': [0]},\n", + " {'name': 'Peak R_high: mean_slope_sto06',\n", + " 'type': 'scatter',\n", + " 'uid': 'dceb5ce7-eb4c-4af6-9a79-cf0b2291e801',\n", " 'x': [0],\n", " 'y': [0]}],\n", " 'layout': {'height': 300,\n", - " 'legend': {'x': 0.5, 'y': 1},\n", - " 'margin': {'b': 50, 'l': 20, 'r': 20, 't': 50},\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", @@ -633,7 +213,7 @@ " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", " 'WAMBE0027'], dtype='Filter by observed and predicted impacts:\",\n", ")\n", "\n", - "observed_impact_select = widgets.SelectMultiple(\n", - " options=df_impacts_compared.storm_regime_observed.dropna().unique(),\n", - " value=df_impacts_compared.storm_regime_observed.dropna().unique().tolist(),\n", - " description='Observed Impacts',\n", - " disabled=False\n", - ")\n", - "\n", - "forecasted_impact_select = widgets.SelectMultiple(\n", - " options=df_impacts_compared.storm_regime_forecasted.dropna().unique(),\n", - " value=df_impacts_compared.storm_regime_forecasted.dropna().unique().tolist(),\n", - " description='Forecasted Impacts',\n", - " disabled=False\n", - ")\n", + "titles = ['Observed Impacts']\n", + "selectboxes = [widgets.SelectMultiple(\n", + " options=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", + " value=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", + " disabled=False)]\n", + "\n", + "# Iterate through each of our forecasted impacts \n", + "for forecast in impacts['forecasted']:\n", + " selectboxes.append(\n", + " widgets.SelectMultiple(\n", + " options=impacts['forecasted'][forecast].storm_regime.dropna().unique().tolist(),\n", + " value=impacts['forecasted'][forecast].storm_regime.dropna().unique().tolist(),\n", + " disabled=False))\n", + " titles.append('Forecasted: {}'.format(forecast))\n", + "\n", + "titles = [widgets.HTML(value=title) for title in titles]\n", + " \n", + "children = widgets.HBox(children=[widgets.VBox(children=[title, box]) for title, box in zip(titles, selectboxes)])\n", + "filter_container = widgets.VBox(children=[filter_title,children])\n", "\n", - "filter_container = widgets.VBox(children=[filter_title,widgets.HBox(children=[forecasted_impact_select,observed_impact_select])])\n", "\n", "\n", "# Create widgets for selecting site_id\n", - "\n", "site_id_title = widgets.HTML(\n", " value=\"Filter by site_id:\",\n", ")\n", @@ -788,11 +375,19 @@ " ),\n", ")\n", "\n", + "forecast_traces = []\n", + "for forecast in impacts['forecasted']:\n", + " forecast_traces.append(go.Scatter(\n", + " x = [0],\n", + " y = [0],\n", + " name = 'Peak R_high: {}'.format(forecast)\n", + " ))\n", + " \n", "layout = go.Layout(\n", " title = 'Bed Profiles',\n", " height=300,\n", - " legend=dict(x=0.5, y=1),\n", - " margin=dict(t=50,b=50,l=20,r=20),\n", + " legend=dict(font={'size':10}),\n", + " margin=dict(t=50,b=50,l=50,r=20),\n", " xaxis=dict(\n", " title = 'x (m)',\n", " autorange=True,\n", @@ -811,7 +406,7 @@ " )\n", ")\n", "\n", - "g1 = go.FigureWidget(data=[trace1, trace2, trace3, trace4],\n", + "g_profiles = go.FigureWidget(data=[trace1, trace2, trace3, trace4]+forecast_traces,\n", " layout=layout)\n", "\n", "\n", @@ -861,7 +456,7 @@ ")\n", "\n", "fig = dict(data=data, layout=layout)\n", - "g2 = go.FigureWidget(data=data,layout=layout)\n", + "g_map = go.FigureWidget(data=data,layout=layout)\n", "\n", "\n", "# Add panel for time series\n", @@ -877,13 +472,18 @@ " name='Tp',\n", " yaxis='y2'\n", ")\n", - "trace_beta = go.Scatter(\n", - " x = [0,3],\n", - " y = [0,3],\n", - " name='beta',\n", - " yaxis='y3'\n", - ")\n", - "data=[trace_Hs0, trace_Tp, trace_beta]\n", + "\n", + "forecast_traces = []\n", + "for forecast in impacts['forecasted']:\n", + " forecast_traces.append(go.Scatter(\n", + " x = [0],\n", + " y = [0],\n", + " name = 'Beta: {}'.format(forecast),\n", + " yaxis='y3'\n", + " ))\n", + "\n", + " \n", + "data=[trace_Hs0, trace_Tp] + forecast_traces\n", "\n", "layout = go.Layout(\n", " title = 'Hydro/Morpho Parameters',\n", @@ -910,27 +510,10 @@ " )\n", ")\n", "\n", - "g3 = go.FigureWidget(data=data, layout=layout)\n", + "g_params = go.FigureWidget(data=data, layout=layout)\n", "\n", "\n", "# Add panel for water level\n", - "\n", - "trace_R_high = go.Scatter(\n", - " x = [0,1],\n", - " y = [0,1],\n", - " name='R High',\n", - " line = dict(\n", - " color = ('rgb(91,220,229)'),\n", - " width = 2)\n", - ")\n", - "trace_R_low = go.Scatter(\n", - " x = [0,2],\n", - " y = [0,2],\n", - " name='R Low',\n", - " line = dict(\n", - " color = ('rgb(13,174,186)'),\n", - " width = 2)\n", - ")\n", "trace_dune_crest = go.Scatter(\n", " x = [0,3],\n", " y = [0,3],\n", @@ -959,7 +542,15 @@ " dash = 'dot')\n", ")\n", "\n", - "data=[trace_R_high, trace_R_low, trace_dune_crest, trace_dune_toe,trace_tide]\n", + "forecast_traces = []\n", + "for forecast in twls['forecasted']:\n", + " forecast_traces.append(go.Scatter(\n", + " x = [0],\n", + " y = [0],\n", + " name = 'R_high: {}'.format(forecast),\n", + " ))\n", + " \n", + "data=[trace_dune_crest, trace_dune_toe,trace_tide] + forecast_traces\n", "\n", "layout = go.Layout(\n", " title = 'Water Level & Dune Toe/Crest',\n", @@ -975,12 +566,17 @@ " ),\n", ")\n", "\n", - "g4 = go.FigureWidget(data=data, layout=layout)\n", + "g_twls = go.FigureWidget(data=data, layout=layout)\n", + "\n", "\n", "\n", "def update_profile(change):\n", " \n", " site_id = site_id_select.value\n", + " \n", + " if site_id is None:\n", + " return \n", + " \n", " site_profile = df_profiles.query('site_id == \"{}\"'.format(site_id))\n", " prestorm_profile = site_profile.query('profile_type == \"prestorm\"')\n", " poststorm_profile = site_profile.query('profile_type == \"poststorm\"')\n", @@ -998,95 +594,128 @@ " dune_toe_z = site_features.dune_toe_z\n", " \n", " # Update beach profile section plots\n", - " with g1.batch_update():\n", - " g1.data[0].x = prestorm_x\n", - " g1.data[0].y = prestorm_z\n", - " g1.data[1].x = poststorm_x\n", - " g1.data[1].y = poststorm_z\n", - " g1.data[2].x = dune_crest_x\n", - " g1.data[2].y = dune_crest_z\n", - " g1.data[3].x = dune_toe_x\n", - " g1.data[3].y = dune_toe_z\n", + " with g_profiles.batch_update():\n", + " g_profiles.data[0].x = prestorm_x\n", + " g_profiles.data[0].y = prestorm_z\n", + " g_profiles.data[1].x = poststorm_x\n", + " g_profiles.data[1].y = poststorm_z\n", + " g_profiles.data[2].x = dune_crest_x\n", + " g_profiles.data[2].y = dune_crest_z\n", + " g_profiles.data[3].x = dune_toe_x\n", + " g_profiles.data[3].y = dune_toe_z\n", + " \n", + " for n, forecast in enumerate(impacts['forecasted']):\n", + " R_high = max(impacts['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id)).R_high)\n", + " g_profiles.data[4+n].x=[200,400]\n", + " g_profiles.data[4+n].y=[R_high, R_high]\n", " \n", " # Relocate plan of satellite imagery\n", " site_coords = df_sites.query('site_id == \"{}\"'.format(site_id))\n", - " with g2.batch_update():\n", - " g2.layout.mapbox['center'] = {\n", + " with g_map.batch_update():\n", + " g_map.layout.mapbox['center'] = {\n", " 'lat': site_coords['lat'].values[0],\n", " 'lon': site_coords['lon'].values[0]\n", " }\n", - " g2.layout.mapbox['zoom'] = 15\n", - " g2.data[1].lat = [site_coords['lat'].values[0]]\n", - " g2.data[1].lon = [site_coords['lon'].values[0]]\n", - " g2.data[1].text = site_coords['lon'].index.get_level_values('site_id').tolist()\n", + " g_map.layout.mapbox['zoom'] = 15\n", + " g_map.data[1].lat = [site_coords['lat'].values[0]]\n", + " g_map.data[1].lon = [site_coords['lon'].values[0]]\n", + " g_map.data[1].text = site_coords['lon'].index.get_level_values('site_id').tolist()\n", "\n", " # Update time series plots \n", - " df_timeseries = df_twl.query(\"site_id=='{}'\".format(site_id))\n", - " times = df_timeseries.index.get_level_values('datetime').tolist()\n", - " with g3.batch_update():\n", - " g3.data[0].x = times\n", - " g3.data[1].x = times\n", - " g3.data[2].x = times\n", - " g3.data[0].y = df_timeseries.Hs0.tolist()\n", - " g3.data[1].y = df_timeseries.Tp.tolist()\n", - " g3.data[2].y = df_timeseries.beta.tolist()\n", + " df_waves_site = df_waves.query(\"site_id=='{}'\".format(site_id))\n", + " times = df_waves_site.index.get_level_values('datetime').tolist()\n", + " Hs0s = df_waves_site.Hs0.tolist()\n", + " Tps = df_waves_site.Tp.tolist()\n", + " with g_params.batch_update():\n", + " g_params.data[0].x = times\n", + " g_params.data[0].y = Hs0s\n", + " g_params.data[1].x = times\n", + " g_params.data[1].y = Tps\n", " \n", + " for n, forecast in enumerate(twls['forecasted']):\n", + " df_twl = twls['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id))\n", + " times = df_twl.index.get_level_values('datetime').tolist()\n", + " beta = df_twl.beta.tolist()\n", + " g_params.data[2+n].x= times\n", + " g_params.data[2+n].y= beta\n", + "\n", + "\n", " # Update water levels plot\n", - " df_timeseries = df_twl.query(\"site_id=='{}'\".format(site_id))\n", - " with g4.batch_update():\n", - " g4.data[0].x = times\n", - " g4.data[1].x = times\n", - " g4.data[2].x = [min(times), max(times)]\n", - " g4.data[3].x = [min(times), max(times)]\n", - " g4.data[4].x = times\n", - " g4.data[0].y = df_timeseries.R_high.tolist()\n", - " g4.data[1].y = df_timeseries.R_low.tolist()\n", - " g4.data[2].y = dune_crest_z.tolist()[0], dune_crest_z.tolist()[0],\n", - " g4.data[3].y = dune_toe_z.tolist()[0], dune_toe_z.tolist()[0],\n", - " g4.data[4].y = df_timeseries.tide.tolist()\n", + " df_tide_site = df_tides.query(\"site_id=='{}'\".format(site_id))\n", + " mask = (df_tide_site.index.get_level_values('datetime') >= min(times)) & (df_tide_site.index.get_level_values('datetime') <= max(times))\n", + " df_tide_site = df_tide_site.loc[mask]\n", + "\n", + " with g_twls.batch_update():\n", + " g_twls.data[0].x = [min(times), max(times)]\n", + " g_twls.data[1].x = [min(times), max(times)]\n", + " g_twls.data[2].x = df_tide_site.index.get_level_values('datetime')\n", + " g_twls.data[0].y = dune_crest_z.tolist()[0], dune_crest_z.tolist()[0],\n", + " g_twls.data[1].y = dune_toe_z.tolist()[0], dune_toe_z.tolist()[0],\n", + " g_twls.data[2].y = df_tide_site.tide.tolist()\n", + " \n", + " for n, forecast in enumerate(twls['forecasted']):\n", + " df_twl = twls['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id))\n", + " times = df_twl.index.get_level_values('datetime').tolist()\n", + " R_high = df_twl.R_high.tolist()\n", + " g_twls.data[3+n].x= times\n", + " g_twls.data[3+n].y= R_high\n", + " \n", " \n", + "site_id_select.observe(update_profile, names=\"value\")\n", + " \n", + " \n", " \n", "def update_filter(change):\n", " \n", - " # Get filtered impacts\n", - " observed_impacts = observed_impact_select.value\n", - " forecasted_impacts = forecasted_impact_select.value\n", + " # Iterate through each box, only keeping site_ids which are not filtered out by each box\n", + " valid_site_ids = impacts['observed'].index.tolist()\n", + " dfs = [impacts['observed']] + [impacts['forecasted'][key] for key in impacts['forecasted']]\n", " \n", - " # Get sites with these impacts \n", - " site_id_select.options = df_impacts_compared.loc[df_impacts_compared.storm_regime_forecasted.isin(forecasted_impacts) & \n", - " df_impacts_compared.storm_regime_observed.isin(observed_impacts),].index.tolist()\n", + " for box, df in zip(selectboxes, dfs):\n", + " valid_site_ids = list(set(valid_site_ids).intersection(set(df[df.storm_regime.isin(box.value)].index.tolist())))\n", + " site_id_select.options = sorted(valid_site_ids)\n", + "\n", + " # TODO Update options in selectboxes with number of observations?\n", " \n", + "# Update the filter if any of the boxes changes\n", + "for box in selectboxes:\n", + " box.observe(update_filter, names=\"value\")\n", " \n", - "site_id_select.observe(update_profile, names=\"value\")\n", - "observed_impact_select.observe(update_filter, names=\"value\")\n", - "forecasted_impact_select.observe(update_filter, names=\"value\")\n", + "# Display our widgets!\n", + "widgets.VBox([filter_container,site_id_container,widgets.HBox([g_profiles,g_map]),g_twls,g_params])\n", + "\n", "\n", - "widgets.VBox([filter_container,site_id_container,widgets.HBox([g1,g2]),g3,g4])" + "\n", + "# For table\n", + "# out = Output()\n", + "# with out:\n", + "# display(df_waves.head(3))\n", + "\n", + "# widgets.VBox([filter_container,site_id_container, out])\n" ] }, { "cell_type": "code", - "execution_count": 178, + "execution_count": 55, "metadata": { "ExecuteTime": { - "end_time": "2018-11-19T03:23:37.582663Z", - "start_time": "2018-11-19T03:23:37.577662Z" + "end_time": "2018-11-21T06:04:27.672922Z", + "start_time": "2018-11-21T06:04:26.098269Z" } }, - "outputs": [ - { - "data": { - "text/plain": [ - "([3.111490610630103, 3.111490610630103],)" - ] - }, - "execution_count": 178, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "g4.data[2].y" + "# print(max(impacts['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018')).R_high))\n", + "# print(max(impacts['forecasted']['mean_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018')).R_high))\n", + "\n", + "# df_twl = twls['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018'))\n", + "\n", + "df_waves_site = df_waves.query(\"site_id=='{}'\".format(\"NARRA0016\"))\n", + "times = df_waves_site.index.get_level_values('datetime').tolist()\n", + "\n", + "\n", + "df_tides_site = df_tides.query(\"{} <= datetime <= {}\".format(min(times), max(times)))\n", + "mask = (df_tides.index.get_level_values('datetime') >= min(times)) & (df_waves_site.index.get_level_values('datetime') <= max(times))" ] } ], @@ -1110,7 +739,10 @@ }, "toc": { "base_numbering": 1, - "nav_menu": {}, + "nav_menu": { + "height": "47px", + "width": "262px" + }, "number_sections": true, "sideBar": true, "skip_h1_title": false, From ca1add7fa7ab165378256fdfedd2e7ef9bd132e7 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Wed, 21 Nov 2018 17:08:55 +1100 Subject: [PATCH 22/65] Remove extra, uneeded comments --- src/analysis/forecast_twl.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 175c887..11ae0ad 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -36,7 +36,6 @@ def forecast_twl( # cross-section profiles once per site. logger.info("Calculating beach slopes") site_ids = df_twl.index.get_level_values("site_id").unique() - # site_ids = [x for x in site_ids if 'NARRA' in x] # todo remove this - for testing narrabeen only if slope == "foreshore": # Process each site_id with a different process and combine results at the end @@ -47,7 +46,6 @@ def forecast_twl( df_twl["beta"] = pd.concat(results) elif slope == "mean": - # todo mean beach profile df_temp = df_twl.join(df_profile_features, how="inner") df_temp["mhw"] = 0.5 with Pool(processes=n_processes) as pool: From 131b3d814c4dd21fcd603d642b24c5b21a791f79 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Thu, 22 Nov 2018 12:27:35 +1100 Subject: [PATCH 23/65] Improve site_id widgets for data exploration --- notebooks/01_exploration.ipynb | 1097 +++++++++++++++++++++++++------- 1 file changed, 860 insertions(+), 237 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index bb0e806..bc63cf3 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -29,11 +29,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 61, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T05:09:17.891936Z", - "start_time": "2018-11-21T05:09:17.884916Z" + "end_time": "2018-11-21T22:54:03.111350Z", + "start_time": "2018-11-21T22:54:03.091796Z" }, "scrolled": true }, @@ -48,6 +48,7 @@ "import plotly\n", "import plotly.graph_objs as go\n", "import plotly.plotly as py\n", + "import plotly.tools as tls\n", "\n", "from ipywidgets import widgets, Output\n", "from IPython.display import display, clear_output, Image" @@ -119,20 +120,23 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 157, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T06:07:17.024328Z", - "start_time": "2018-11-21T06:07:14.488829Z" + "end_time": "2018-11-22T01:22:23.730687Z", + "start_time": "2018-11-22T01:22:19.346920Z" }, - "code_folding": [], + "code_folding": [ + 335, + 430 + ], "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "e4413b11f1694a8fb8da0c001aa18344", + "model_id": "237c6a47bf2d418eb98f0ada3a9b00a2", "version_major": 2, "version_minor": 0 }, @@ -155,36 +159,36 @@ "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), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))))))), VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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'),)))), HBox(children=(FigureWidget({\n", " 'data': [{'name': 'Pre Storm Profile',\n", " 'type': 'scatter',\n", - " 'uid': '391027af-be5a-4413-863d-53385a59391d',\n", + " 'uid': '534bf20e-d5c0-49b0-8f3a-247fc1db8b29',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'name': 'Post Storm Profile',\n", " 'type': 'scatter',\n", - " 'uid': 'a5d7d2e9-d3af-462c-9466-51c2b6f09aa4',\n", + " 'uid': '4da21238-7eab-464a-94e3-374d731a3797',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'marker': {'color': 'rgb(17, 157, 255)', 'size': 20},\n", " 'mode': 'markers',\n", " 'name': 'Pre-storm dune crest',\n", " 'type': 'scatter',\n", - " 'uid': '2eba8b17-45a7-4bcd-b988-31bbb487fb1f',\n", + " 'uid': '1bcb6e22-4d7a-487d-a63f-23086513084e',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'marker': {'color': 'rgb(231, 99, 250)', 'size': 20},\n", " 'mode': 'markers',\n", " 'name': 'Pre-storm dune toe',\n", " 'type': 'scatter',\n", - " 'uid': '022f5c93-fc10-4d1d-ac97-e30b8efd28d1',\n", + " 'uid': '39507d76-af86-4685-812d-03a96960aac9',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'name': 'Peak R_high: foreshore_slope_sto06',\n", " 'type': 'scatter',\n", - " 'uid': '0c93ba4e-2213-4db9-9b13-1227d17f5074',\n", + " 'uid': '64fa5f96-580e-4188-a9f1-95a453763277',\n", " 'x': [0],\n", " 'y': [0]},\n", " {'name': 'Peak R_high: mean_slope_sto06',\n", " 'type': 'scatter',\n", - " 'uid': 'dceb5ce7-eb4c-4af6-9a79-cf0b2291e801',\n", + " 'uid': '65603ac3-721e-428a-8dc3-c94a500fdeeb',\n", " 'x': [0],\n", " 'y': [0]}],\n", " 'layout': {'height': 300,\n", @@ -213,7 +217,7 @@ " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", " 'WAMBE0027'], dtype='= min(times)) & (df_tide_site.index.get_level_values('datetime') <= max(times))\n", + " mask = (df_tide_site.index.get_level_values('datetime') >= min(times)) & (\n", + " df_tide_site.index.get_level_values('datetime') <= max(times))\n", " df_tide_site = df_tide_site.loc[mask]\n", "\n", - " with g_twls.batch_update():\n", - " g_twls.data[0].x = [min(times), max(times)]\n", - " g_twls.data[1].x = [min(times), max(times)]\n", - " g_twls.data[2].x = df_tide_site.index.get_level_values('datetime')\n", - " g_twls.data[0].y = dune_crest_z.tolist()[0], dune_crest_z.tolist()[0],\n", - " g_twls.data[1].y = dune_toe_z.tolist()[0], dune_toe_z.tolist()[0],\n", - " g_twls.data[2].y = df_tide_site.tide.tolist()\n", - " \n", - " for n, forecast in enumerate(twls['forecasted']):\n", + " with g_timeseries.batch_update():\n", + " g_timeseries.data[2].x = [min(times), max(times)]\n", + " g_timeseries.data[3].x = [min(times), max(times)]\n", + " g_timeseries.data[4].x = df_tide_site.index.get_level_values('datetime')\n", + " g_timeseries.data[2].y = dune_crest_z.tolist()[0], dune_crest_z.tolist()[0],\n", + " g_timeseries.data[3].y = dune_toe_z.tolist()[0], dune_toe_z.tolist()[0],\n", + " g_timeseries.data[4].y = df_tide_site.tide.tolist()\n", + "\n", + " # Update rhigh values\n", + " idx_betas = [n for n, x in enumerate(g_timeseries.data) if 'R_high' in x.name]\n", + " for i, forecast in zip(idx_betas,twls['forecasted']):\n", " df_twl = twls['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id))\n", " times = df_twl.index.get_level_values('datetime').tolist()\n", " R_high = df_twl.R_high.tolist()\n", - " g_twls.data[3+n].x= times\n", - " g_twls.data[3+n].y= R_high\n", - " \n", - " \n", + " g_timeseries.data[5+n].x = times\n", + " g_timeseries.data[5+n].y = R_high\n", + "\n", + "\n", "site_id_select.observe(update_profile, names=\"value\")\n", - " \n", - " \n", - " \n", + "\n", + "\n", "def update_filter(change):\n", - " \n", + "\n", " # Iterate through each box, only keeping site_ids which are not filtered out by each box\n", " valid_site_ids = impacts['observed'].index.tolist()\n", - " dfs = [impacts['observed']] + [impacts['forecasted'][key] for key in impacts['forecasted']]\n", - " \n", + " dfs = [impacts['observed']] + [impacts['forecasted'][key]\n", + " for key in impacts['forecasted']]\n", + "\n", " for box, df in zip(selectboxes, dfs):\n", - " valid_site_ids = list(set(valid_site_ids).intersection(set(df[df.storm_regime.isin(box.value)].index.tolist())))\n", + " valid_site_ids = list(set(valid_site_ids).intersection(\n", + " set(df[df.storm_regime.isin(box.value)].index.tolist())))\n", " site_id_select.options = sorted(valid_site_ids)\n", "\n", " # TODO Update options in selectboxes with number of observations?\n", - " \n", + "\n", + "\n", "# Update the filter if any of the boxes changes\n", "for box in selectboxes:\n", " box.observe(update_filter, names=\"value\")\n", - " \n", - "# Display our widgets!\n", - "widgets.VBox([filter_container,site_id_container,widgets.HBox([g_profiles,g_map]),g_twls,g_params])\n", "\n", + "# Display our widgets!ore forecast i\n", + "widgets.VBox([filter_container, site_id_container,\n", + " widgets.HBox([g_profiles, g_map]), g_timeseries])\n", + "# widgets.VBox([filter_container,site_id_container,widgets.HBox([g_profiles,g_map]),g_twls,g_params])\n", "\n", "\n", "# For table\n", @@ -691,31 +878,467 @@ "# with out:\n", "# display(df_waves.head(3))\n", "\n", - "# widgets.VBox([filter_container,site_id_container, out])\n" + "# widgets.VBox([filter_container,site_id_container, out])" ] }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 164, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T06:04:27.672922Z", - "start_time": "2018-11-21T06:04:26.098269Z" + "end_time": "2018-11-22T01:26:00.955120Z", + "start_time": "2018-11-22T01:26:00.904958Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['2016-05-28 00:00:00',\n", + " '2016-05-28 01:00:00',\n", + " '2016-05-28 02:00:00',\n", + " '2016-05-28 03:00:00',\n", + " '2016-05-28 04:00:00',\n", + " '2016-05-28 05:00:00',\n", + " '2016-05-28 06:00:00',\n", + " '2016-05-28 07:00:00',\n", + " '2016-05-28 08:00:00',\n", + " '2016-05-28 09:00:00',\n", + " '2016-05-28 10:00:00',\n", + " '2016-05-28 11:00:00',\n", + " '2016-05-28 12:00:00',\n", + " '2016-05-28 13:00:00',\n", + " '2016-05-28 14:00:00',\n", + " '2016-05-28 15:00:00',\n", + " '2016-05-28 16:00:00',\n", + " '2016-05-28 17:00:00',\n", + " '2016-05-28 18:00:00',\n", + " '2016-05-28 19:00:00',\n", + " '2016-05-28 20:00:00',\n", + " '2016-05-28 21:00:00',\n", + " '2016-05-28 22:00:00',\n", + " '2016-05-28 23:00:00',\n", + " '2016-05-29 00:00:00',\n", + " '2016-05-29 01:00:00',\n", + " '2016-05-29 02:00:00',\n", + " '2016-05-29 03:00:00',\n", + " '2016-05-29 04:00:00',\n", + " '2016-05-29 05:00:00',\n", + " '2016-05-29 06:00:00',\n", + " '2016-05-29 07:00:00',\n", + " '2016-05-29 08:00:00',\n", + " '2016-05-29 09:00:00',\n", + " '2016-05-29 10:00:00',\n", + " '2016-05-29 11:00:00',\n", + " '2016-05-29 12:00:00',\n", + " '2016-05-29 13:00:00',\n", + " '2016-05-29 14:00:00',\n", + " '2016-05-29 15:00:00',\n", + " '2016-05-29 16:00:00',\n", + " '2016-05-29 17:00:00',\n", + " '2016-05-29 18:00:00',\n", + " '2016-05-29 19:00:00',\n", + " '2016-05-29 20:00:00',\n", + " '2016-05-29 21:00:00',\n", + " '2016-05-29 22:00:00',\n", + " '2016-05-29 23:00:00',\n", + " '2016-05-30 00:00:00',\n", + " '2016-05-30 01:00:00',\n", + " '2016-05-30 02:00:00',\n", + " '2016-05-30 03:00:00',\n", + " '2016-05-30 04:00:00',\n", + " '2016-05-30 05:00:00',\n", + " '2016-05-30 06:00:00',\n", + " '2016-05-30 07:00:00',\n", + " '2016-05-30 08:00:00',\n", + " '2016-05-30 09:00:00',\n", + " '2016-05-30 10:00:00',\n", + " '2016-05-30 11:00:00',\n", + " '2016-05-30 12:00:00',\n", + " '2016-05-30 13:00:00',\n", + " '2016-05-30 14:00:00',\n", + " '2016-05-30 15:00:00',\n", + " '2016-05-30 16:00:00',\n", + " '2016-05-30 17:00:00',\n", + " '2016-05-30 18:00:00',\n", + " '2016-05-30 19:00:00',\n", + " '2016-05-30 20:00:00',\n", + " '2016-05-30 21:00:00',\n", + " '2016-05-30 22:00:00',\n", + " '2016-05-30 23:00:00',\n", + " '2016-05-31 00:00:00',\n", + " '2016-05-31 01:00:00',\n", + " '2016-05-31 02:00:00',\n", + " '2016-05-31 03:00:00',\n", + " '2016-05-31 04:00:00',\n", + " '2016-05-31 05:00:00',\n", + " '2016-05-31 06:00:00',\n", + " '2016-05-31 07:00:00',\n", + " '2016-05-31 08:00:00',\n", + " '2016-05-31 09:00:00',\n", + " '2016-05-31 10:00:00',\n", + " '2016-05-31 11:00:00',\n", + " '2016-05-31 12:00:00',\n", + " '2016-05-31 13:00:00',\n", + " '2016-05-31 14:00:00',\n", + " '2016-05-31 15:00:00',\n", + " '2016-05-31 16:00:00',\n", + " '2016-05-31 17:00:00',\n", + " '2016-05-31 18:00:00',\n", + " '2016-05-31 19:00:00',\n", + " '2016-05-31 20:00:00',\n", + " '2016-05-31 21:00:00',\n", + " '2016-05-31 22:00:00',\n", + " '2016-05-31 23:00:00',\n", + " '2016-06-01 00:00:00',\n", + " '2016-06-01 01:00:00',\n", + " '2016-06-01 02:00:00',\n", + " '2016-06-01 03:00:00',\n", + " '2016-06-01 04:00:00',\n", + " '2016-06-01 05:00:00',\n", + " '2016-06-01 06:00:00',\n", + " '2016-06-01 07:00:00',\n", + " '2016-06-01 08:00:00',\n", + " '2016-06-01 09:00:00',\n", + " '2016-06-01 10:00:00',\n", + " '2016-06-01 11:00:00',\n", + " '2016-06-01 12:00:00',\n", + " '2016-06-01 13:00:00',\n", + " '2016-06-01 14:00:00',\n", + " '2016-06-01 15:00:00',\n", + " '2016-06-01 16:00:00',\n", + " '2016-06-01 17:00:00',\n", + " '2016-06-01 18:00:00',\n", + " '2016-06-01 19:00:00',\n", + " '2016-06-01 20:00:00',\n", + " '2016-06-01 21:00:00',\n", + " '2016-06-01 22:00:00',\n", + " '2016-06-01 23:00:00',\n", + " '2016-06-02 00:00:00',\n", + " '2016-06-02 01:00:00',\n", + " '2016-06-02 02:00:00',\n", + " '2016-06-02 03:00:00',\n", + " '2016-06-02 04:00:00',\n", + " '2016-06-02 05:00:00',\n", + " '2016-06-02 06:00:00',\n", + " '2016-06-02 07:00:00',\n", + " '2016-06-02 08:00:00',\n", + " '2016-06-02 09:00:00',\n", + " '2016-06-02 10:00:00',\n", + " '2016-06-02 11:00:00',\n", + " '2016-06-02 12:00:00',\n", + " '2016-06-02 13:00:00',\n", + " '2016-06-02 14:00:00',\n", + " '2016-06-02 15:00:00',\n", + " '2016-06-02 16:00:00',\n", + " '2016-06-02 17:00:00',\n", + " '2016-06-02 18:00:00',\n", + " '2016-06-02 19:00:00',\n", + " '2016-06-02 20:00:00',\n", + " '2016-06-02 21:00:00',\n", + " '2016-06-02 22:00:00',\n", + " '2016-06-02 23:00:00',\n", + " '2016-06-03 00:00:00',\n", + " '2016-06-03 01:00:00',\n", + " '2016-06-03 02:00:00',\n", + " '2016-06-03 03:00:00',\n", + " '2016-06-03 04:00:00',\n", + " '2016-06-03 05:00:00',\n", + " '2016-06-03 06:00:00',\n", + " '2016-06-03 07:00:00',\n", + " '2016-06-03 08:00:00',\n", + " '2016-06-03 09:00:00',\n", + " '2016-06-03 10:00:00',\n", + " '2016-06-03 11:00:00',\n", + " '2016-06-03 12:00:00',\n", + " '2016-06-03 13:00:00',\n", + " '2016-06-03 14:00:00',\n", + " '2016-06-03 15:00:00',\n", + " '2016-06-03 16:00:00',\n", + " '2016-06-03 17:00:00',\n", + " '2016-06-03 18:00:00',\n", + " '2016-06-03 19:00:00',\n", + " '2016-06-03 20:00:00',\n", + " '2016-06-03 21:00:00',\n", + " '2016-06-03 22:00:00',\n", + " '2016-06-03 23:00:00',\n", + " '2016-06-04 00:00:00',\n", + " '2016-06-04 01:00:00',\n", + " '2016-06-04 02:00:00',\n", + " '2016-06-04 03:00:00',\n", + " '2016-06-04 04:00:00',\n", + " '2016-06-04 05:00:00',\n", + " '2016-06-04 06:00:00',\n", + " '2016-06-04 07:00:00',\n", + " '2016-06-04 08:00:00',\n", + " '2016-06-04 09:00:00',\n", + " '2016-06-04 10:00:00',\n", + " '2016-06-04 11:00:00',\n", + " '2016-06-04 12:00:00',\n", + " '2016-06-04 13:00:00',\n", + " '2016-06-04 14:00:00',\n", + " '2016-06-04 15:00:00',\n", + " '2016-06-04 16:00:00',\n", + " '2016-06-04 17:00:00',\n", + " '2016-06-04 18:00:00',\n", + " '2016-06-04 19:00:00',\n", + " '2016-06-04 20:00:00',\n", + " '2016-06-04 21:00:00',\n", + " '2016-06-04 22:00:00',\n", + " '2016-06-04 23:00:00',\n", + " '2016-06-05 00:00:00',\n", + " '2016-06-05 01:00:00',\n", + " '2016-06-05 02:00:00',\n", + " '2016-06-05 03:00:00',\n", + " '2016-06-05 04:00:00',\n", + " '2016-06-05 05:00:00',\n", + " '2016-06-05 06:00:00',\n", + " '2016-06-05 07:00:00',\n", + " '2016-06-05 08:00:00',\n", + " '2016-06-05 09:00:00',\n", + " '2016-06-05 10:00:00',\n", + " '2016-06-05 11:00:00',\n", + " '2016-06-05 12:00:00',\n", + " '2016-06-05 13:00:00',\n", + " '2016-06-05 14:00:00',\n", + " '2016-06-05 15:00:00',\n", + " '2016-06-05 16:00:00',\n", + " '2016-06-05 17:00:00',\n", + " '2016-06-05 18:00:00',\n", + " '2016-06-05 19:00:00',\n", + " '2016-06-05 20:00:00',\n", + " '2016-06-05 21:00:00',\n", + " '2016-06-05 22:00:00',\n", + " '2016-06-05 23:00:00',\n", + " '2016-06-06 00:00:00',\n", + " '2016-06-06 01:00:00',\n", + " '2016-06-06 02:00:00',\n", + " '2016-06-06 03:00:00',\n", + " '2016-06-06 04:00:00',\n", + " '2016-06-06 05:00:00',\n", + " '2016-06-06 06:00:00',\n", + " '2016-06-06 07:00:00',\n", + " '2016-06-06 08:00:00',\n", + " '2016-06-06 09:00:00',\n", + " '2016-06-06 10:00:00',\n", + " '2016-06-06 11:00:00',\n", + " '2016-06-06 12:00:00',\n", + " '2016-06-06 13:00:00',\n", + " '2016-06-06 14:00:00',\n", + " '2016-06-06 15:00:00',\n", + " '2016-06-06 16:00:00',\n", + " '2016-06-06 17:00:00',\n", + " '2016-06-06 18:00:00',\n", + " '2016-06-06 19:00:00',\n", + " '2016-06-06 20:00:00',\n", + " '2016-06-06 21:00:00',\n", + " '2016-06-06 22:00:00',\n", + " '2016-06-06 23:00:00',\n", + " '2016-06-07 00:00:00',\n", + " '2016-06-07 01:00:00',\n", + " '2016-06-07 02:00:00',\n", + " '2016-06-07 03:00:00',\n", + " '2016-06-07 04:00:00',\n", + " '2016-06-07 05:00:00',\n", + " '2016-06-07 06:00:00',\n", + " '2016-06-07 07:00:00',\n", + " '2016-06-07 08:00:00',\n", + " '2016-06-07 09:00:00',\n", + " '2016-06-07 10:00:00',\n", + " '2016-06-07 11:00:00',\n", + " '2016-06-07 12:00:00',\n", + " '2016-06-07 13:00:00',\n", + " '2016-06-07 14:00:00',\n", + " '2016-06-07 15:00:00',\n", + " '2016-06-07 16:00:00',\n", + " '2016-06-07 17:00:00',\n", + " '2016-06-07 18:00:00',\n", + " '2016-06-07 19:00:00',\n", + " '2016-06-07 20:00:00',\n", + " '2016-06-07 21:00:00',\n", + " '2016-06-07 22:00:00',\n", + " '2016-06-07 23:00:00',\n", + " '2016-06-08 00:00:00',\n", + " '2016-06-08 01:00:00',\n", + " '2016-06-08 02:00:00',\n", + " '2016-06-08 03:00:00',\n", + " '2016-06-08 04:00:00',\n", + " '2016-06-08 05:00:00',\n", + " '2016-06-08 06:00:00',\n", + " '2016-06-08 07:00:00',\n", + " '2016-06-08 08:00:00',\n", + " '2016-06-08 09:00:00',\n", + " '2016-06-08 10:00:00',\n", + " '2016-06-08 11:00:00',\n", + " '2016-06-08 12:00:00',\n", + " '2016-06-08 13:00:00',\n", + " '2016-06-08 14:00:00',\n", + " '2016-06-08 15:00:00',\n", + " '2016-06-08 16:00:00',\n", + " '2016-06-08 17:00:00',\n", + " '2016-06-08 18:00:00',\n", + " '2016-06-08 19:00:00',\n", + " '2016-06-08 20:00:00',\n", + " '2016-06-08 21:00:00',\n", + " '2016-06-08 22:00:00',\n", + " '2016-06-08 23:00:00',\n", + " '2016-06-09 00:00:00',\n", + " '2016-06-09 01:00:00',\n", + " '2016-06-09 02:00:00',\n", + " '2016-06-09 03:00:00',\n", + " '2016-06-09 04:00:00',\n", + " '2016-06-09 05:00:00',\n", + " '2016-06-09 06:00:00',\n", + " '2016-06-09 07:00:00',\n", + " '2016-06-09 08:00:00',\n", + " '2016-06-09 09:00:00',\n", + " '2016-06-09 10:00:00',\n", + " '2016-06-09 11:00:00',\n", + " '2016-06-09 12:00:00',\n", + " '2016-06-09 13:00:00',\n", + " '2016-06-09 14:00:00',\n", + " '2016-06-09 15:00:00',\n", + " '2016-06-09 16:00:00',\n", + " '2016-06-09 17:00:00',\n", + " '2016-06-09 18:00:00',\n", + " '2016-06-09 19:00:00',\n", + " '2016-06-09 20:00:00',\n", + " '2016-06-09 21:00:00',\n", + " '2016-06-09 22:00:00',\n", + " '2016-06-09 23:00:00',\n", + " '2016-06-10 00:00:00',\n", + " '2016-06-10 01:00:00',\n", + " '2016-06-10 02:00:00',\n", + " '2016-06-10 03:00:00',\n", + " '2016-06-10 04:00:00',\n", + " '2016-06-10 05:00:00',\n", + " '2016-06-10 06:00:00',\n", + " '2016-06-10 07:00:00',\n", + " '2016-06-10 08:00:00',\n", + " '2016-06-10 09:00:00',\n", + " '2016-06-10 10:00:00',\n", + " '2016-06-10 11:00:00',\n", + " '2016-06-10 12:00:00',\n", + " '2016-06-10 13:00:00',\n", + " '2016-06-10 14:00:00',\n", + " '2016-06-10 15:00:00',\n", + " '2016-06-10 16:00:00',\n", + " '2016-06-10 17:00:00',\n", + " '2016-06-10 18:00:00',\n", + " '2016-06-10 19:00:00',\n", + " '2016-06-10 20:00:00',\n", + " '2016-06-10 21:00:00',\n", + " '2016-06-10 22:00:00',\n", + " '2016-06-10 23:00:00',\n", + " '2016-06-11 00:00:00',\n", + " '2016-06-11 01:00:00',\n", + " '2016-06-11 02:00:00',\n", + " '2016-06-11 03:00:00',\n", + " '2016-06-11 04:00:00',\n", + " '2016-06-11 05:00:00',\n", + " '2016-06-11 06:00:00',\n", + " '2016-06-11 07:00:00',\n", + " '2016-06-11 08:00:00',\n", + " '2016-06-11 09:00:00',\n", + " '2016-06-11 10:00:00',\n", + " '2016-06-11 11:00:00',\n", + " '2016-06-11 12:00:00',\n", + " '2016-06-11 13:00:00',\n", + " '2016-06-11 14:00:00',\n", + " '2016-06-11 15:00:00',\n", + " '2016-06-11 16:00:00',\n", + " '2016-06-11 17:00:00',\n", + " '2016-06-11 18:00:00',\n", + " '2016-06-11 19:00:00',\n", + " '2016-06-11 20:00:00',\n", + " '2016-06-11 21:00:00',\n", + " '2016-06-11 22:00:00',\n", + " '2016-06-11 23:00:00',\n", + " '2016-06-12 00:00:00',\n", + " '2016-06-12 01:00:00',\n", + " '2016-06-12 02:00:00',\n", + " '2016-06-12 03:00:00',\n", + " '2016-06-12 04:00:00',\n", + " '2016-06-12 05:00:00',\n", + " '2016-06-12 06:00:00',\n", + " '2016-06-12 07:00:00',\n", + " '2016-06-12 08:00:00',\n", + " '2016-06-12 09:00:00',\n", + " '2016-06-12 10:00:00',\n", + " '2016-06-12 11:00:00',\n", + " '2016-06-12 12:00:00',\n", + " '2016-06-12 13:00:00',\n", + " '2016-06-12 14:00:00',\n", + " '2016-06-12 15:00:00',\n", + " '2016-06-12 16:00:00',\n", + " '2016-06-12 17:00:00',\n", + " '2016-06-12 18:00:00',\n", + " '2016-06-12 19:00:00',\n", + " '2016-06-12 20:00:00',\n", + " '2016-06-12 21:00:00',\n", + " '2016-06-12 22:00:00',\n", + " '2016-06-12 23:00:00',\n", + " '2016-06-13 00:00:00',\n", + " '2016-06-13 01:00:00',\n", + " '2016-06-13 02:00:00',\n", + " '2016-06-13 03:00:00',\n", + " '2016-06-13 04:00:00',\n", + " '2016-06-13 05:00:00',\n", + " '2016-06-13 06:00:00',\n", + " '2016-06-13 07:00:00',\n", + " '2016-06-13 08:00:00',\n", + " '2016-06-13 09:00:00',\n", + " '2016-06-13 10:00:00',\n", + " '2016-06-13 11:00:00',\n", + " '2016-06-13 12:00:00',\n", + " '2016-06-13 13:00:00',\n", + " '2016-06-13 14:00:00',\n", + " '2016-06-13 15:00:00',\n", + " '2016-06-13 16:00:00',\n", + " '2016-06-13 17:00:00',\n", + " '2016-06-13 18:00:00',\n", + " '2016-06-13 19:00:00',\n", + " '2016-06-13 20:00:00',\n", + " '2016-06-13 21:00:00',\n", + " '2016-06-13 22:00:00',\n", + " '2016-06-13 23:00:00',\n", + " '2016-06-14 00:00:00',\n", + " '2016-06-14 01:00:00',\n", + " '2016-06-14 02:00:00',\n", + " '2016-06-14 03:00:00',\n", + " '2016-06-14 04:00:00',\n", + " '2016-06-14 05:00:00',\n", + " '2016-06-14 06:00:00',\n", + " '2016-06-14 07:00:00',\n", + " '2016-06-14 08:00:00',\n", + " '2016-06-14 09:00:00',\n", + " '2016-06-14 10:00:00',\n", + " '2016-06-14 11:00:00',\n", + " '2016-06-14 12:00:00',\n", + " '2016-06-14 13:00:00',\n", + " '2016-06-14 14:00:00',\n", + " '2016-06-14 15:00:00',\n", + " '2016-06-14 16:00:00',\n", + " '2016-06-14 17:00:00',\n", + " '2016-06-14 18:00:00',\n", + " '2016-06-14 19:00:00',\n", + " '2016-06-14 20:00:00',\n", + " '2016-06-14 21:00:00',\n", + " '2016-06-14 22:00:00',\n", + " '2016-06-14 23:00:00',\n", + " '2016-06-15 00:00:00']" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# print(max(impacts['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018')).R_high))\n", - "# print(max(impacts['forecasted']['mean_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018')).R_high))\n", - "\n", - "# df_twl = twls['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018'))\n", - "\n", - "df_waves_site = df_waves.query(\"site_id=='{}'\".format(\"NARRA0016\"))\n", - "times = df_waves_site.index.get_level_values('datetime').tolist()\n", - "\n", - "\n", - "df_tides_site = df_tides.query(\"{} <= datetime <= {}\".format(min(times), max(times)))\n", - "mask = (df_tides.index.get_level_values('datetime') >= min(times)) & (df_waves_site.index.get_level_values('datetime') <= max(times))" + "g_timeseries.data\n", + "df_twl = twls['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018'))\n", + "times = df_twl.index.get_level_values('datetime').tolist()\n", + "times" ] } ], From c9e665ded3f2ffd04cb63bc855ddf897f6822f38 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 09:51:02 +1100 Subject: [PATCH 24/65] Update packages --- Pipfile | 8 +- Pipfile.lock | 452 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 455 insertions(+), 5 deletions(-) diff --git a/Pipfile b/Pipfile index 5643814..0e234e9 100644 --- a/Pipfile +++ b/Pipfile @@ -14,9 +14,15 @@ click = "*" mat4py = "*" black = "*" shapely = "*" -fiona = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.7.13-cp37-cp37m-win_amd64.whl"} +fiona = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.8.2-cp37-cp37m-win_amd64.whl"} gdal = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl"} pyproj = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/pyproj-1.9.5.1-cp37-cp37m-win_amd64.whl"} +colorlover = "*" +ipykernel = "*" +jupyter = "*" +plotly = "*" +jupyter-contrib-nbextensions = "*" +jupyter-nbextensions-configurator = "*" [requires] python_version = "3.7" diff --git a/Pipfile.lock b/Pipfile.lock index e511601..5359b48 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "33595d902a1ea304411921342c1637944162170fafe98ebf510f973a4cba9bb1" + "sha256": "d1086c407632a2c2f9a8e1b657d7e0703ac8929bb3aa41f68ea364448c47cb33" }, "pipfile-spec": 6, "requires": { @@ -30,6 +30,13 @@ ], "version": "==18.2.0" }, + "backcall": { + "hashes": [ + "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", + "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2" + ], + "version": "==0.1.0" + }, "black": { "hashes": [ "sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", @@ -38,6 +45,27 @@ "index": "pypi", "version": "==18.9b0" }, + "bleach": { + "hashes": [ + "sha256:48d39675b80a75f6d1c3bdbffec791cf0bbbab665cf01e20da701c77de278718", + "sha256:73d26f018af5d5adcdabf5c1c974add4361a9c76af215fe32fdec8a6fc5fb9b9" + ], + "version": "==3.0.2" + }, + "certifi": { + "hashes": [ + "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", + "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" + ], + "version": "==2018.10.15" + }, + "chardet": { + "hashes": [ + "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", + "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" + ], + "version": "==3.0.4" + }, "click": { "hashes": [ "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", @@ -61,6 +89,21 @@ ], "version": "==0.5.0" }, + "colorama": { + "hashes": [ + "sha256:a3d89af5db9e9806a779a50296b5fdb466e281147c2c235e8225ecc6dbf7bbf3", + "sha256:c9b54bebe91a6a803e0772c8561d53f2926bfeb17cd141fbabcb08424086595c" + ], + "markers": "sys_platform == 'win32'", + "version": "==0.4.0" + }, + "colorlover": { + "hashes": [ + "sha256:f12a091ca2bca29e0e9294a072693bc70d2fafc573bb7c0fc8070099b5de9cb2" + ], + "index": "pypi", + "version": "==0.2.1" + }, "cycler": { "hashes": [ "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", @@ -68,13 +111,34 @@ ], "version": "==0.10.0" }, + "decorator": { + "hashes": [ + "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", + "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + ], + "version": "==4.3.0" + }, + "defusedxml": { + "hashes": [ + "sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4", + "sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20" + ], + "version": "==0.5.0" + }, + "entrypoints": { + "hashes": [ + "sha256:10ad569bb245e7e2ba425285b9fa3e8178a0dc92fc53b1e1c553805e15a8825b", + "sha256:d2d587dde06f99545fb13a383d2cd336a8ff1f359c5839ce3a64c917d10c029f" + ], + "version": "==0.2.3" + }, "fiona": { - "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.7.13-cp37-cp37m-win_amd64.whl", + "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.8.2-cp37-cp37m-win_amd64.whl", "hashes": [ - "sha256:425a98dcf87c06a481e256803c8c68d7d4cd04f5e4505c4ab32a13571a3cc57a" + "sha256:ea6f9f7914fe25e7e9945cabf628edb94c483702f8181d9b868b6bfffec2db25" ], "index": "pypi", - "version": "==1.7.13" + "version": "==1.8.2" }, "gdal": { "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl", @@ -84,6 +148,130 @@ "index": "pypi", "version": "==2.3.2" }, + "idna": { + "hashes": [ + "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", + "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" + ], + "version": "==2.7" + }, + "ipykernel": { + "hashes": [ + "sha256:0aeb7ec277ac42cc2b59ae3d08b10909b2ec161dc6908096210527162b53675d", + "sha256:0fc0bf97920d454102168ec2008620066878848fcfca06c22b669696212e292f" + ], + "index": "pypi", + "version": "==5.1.0" + }, + "ipython": { + "hashes": [ + "sha256:a5781d6934a3341a1f9acb4ea5acdc7ea0a0855e689dbe755d070ca51e995435", + "sha256:b10a7ddd03657c761fc503495bc36471c8158e3fc948573fb9fe82a7029d8efd" + ], + "markers": "python_version >= '3.3'", + "version": "==7.1.1" + }, + "ipython-genutils": { + "hashes": [ + "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", + "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" + ], + "version": "==0.2.0" + }, + "ipywidgets": { + "hashes": [ + "sha256:0f2b5cde9f272cb49d52f3f0889fdd1a7ae1e74f37b48dac35a83152780d2b7b", + "sha256:a3e224f430163f767047ab9a042fc55adbcab0c24bbe6cf9f306c4f89fdf0ba3" + ], + "version": "==7.4.2" + }, + "jedi": { + "hashes": [ + "sha256:0191c447165f798e6a730285f2eee783fff81b0d3df261945ecb80983b5c3ca7", + "sha256:b7493f73a2febe0dc33d51c99b474547f7f6c0b2c8fb2b21f453eef204c12148" + ], + "version": "==0.13.1" + }, + "jinja2": { + "hashes": [ + "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", + "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + ], + "version": "==2.10" + }, + "jsonschema": { + "hashes": [ + "sha256:3ae8afd6f4ca6417f14bf43ef61341311598f14234cdb4174fe43d42b236a3c8", + "sha256:dfd8426040892c8d0ef6da574085f282569f189cb24b70091a66c21c12d6705e" + ], + "version": "==3.0.0a3" + }, + "jupyter": { + "hashes": [ + "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", + "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", + "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f" + ], + "index": "pypi", + "version": "==1.0.0" + }, + "jupyter-client": { + "hashes": [ + "sha256:27befcf0446b01e29853014d6a902dd101ad7d7f94e2252b1adca17c3466b761", + "sha256:59e6d791e22a8002ad0e80b78c6fd6deecab4f9e1b1aa1a22f4213de271b29ea" + ], + "version": "==5.2.3" + }, + "jupyter-console": { + "hashes": [ + "sha256:308ce876354924fb6c540b41d5d6d08acfc946984bf0c97777c1ddcb42e0b2f5", + "sha256:cc80a97a5c389cbd30252ffb5ce7cefd4b66bde98219edd16bf5cb6f84bb3568" + ], + "version": "==6.0.0" + }, + "jupyter-contrib-core": { + "hashes": [ + "sha256:1ec81e275a8f5858d56b0c4c6cd85335aa8e915001b8657fe51c620c3cdde50f", + "sha256:e65bc0e932ff31801003cef160a4665f2812efe26a53801925a634735e9a5794" + ], + "version": "==0.3.3" + }, + "jupyter-contrib-nbextensions": { + "hashes": [ + "sha256:40eba9492d22302599d0a8f29d1297efb06e233677fe2d6f4d224e7c3e373872", + "sha256:f4893d99fed6be6587cd2c722ef8841556283a697a482288b621b514beda2405" + ], + "index": "pypi", + "version": "==0.5.0" + }, + "jupyter-core": { + "hashes": [ + "sha256:927d713ffa616ea11972534411544589976b2493fc7e09ad946e010aa7eb9970", + "sha256:ba70754aa680300306c699790128f6fbd8c306ee5927976cbe48adacf240c0b7" + ], + "version": "==4.4.0" + }, + "jupyter-highlight-selected-word": { + "hashes": [ + "sha256:9545dfa9cb057eebe3a5795604dcd3a5294ea18637e553f61a0b67c1b5903c58", + "sha256:9fa740424859a807950ca08d2bfd28a35154cd32dd6d50ac4e0950022adc0e7b" + ], + "version": "==0.2.0" + }, + "jupyter-latex-envs": { + "hashes": [ + "sha256:b0a83e0cda2d33e61c4b2da94365d2de4dfcdc1ed67abdba3cbe390872cf5231" + ], + "version": "==1.4.4" + }, + "jupyter-nbextensions-configurator": { + "hashes": [ + "sha256:778f36a0996e622c224589327405583f4a539d183fa2fdaeecbc4397c1af9991", + "sha256:e2cea15dde24c9090104cf3ebedd6bcd354004cbea5e858b3776372ad50b7d46" + ], + "index": "pypi", + "version": "==0.4.0" + }, "kiwisolver": { "hashes": [ "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3", @@ -117,6 +305,47 @@ ], "version": "==1.0.1" }, + "lxml": { + "hashes": [ + "sha256:02bc220d61f46e9b9d5a53c361ef95e9f5e1d27171cd461dddb17677ae2289a5", + "sha256:22f253b542a342755f6cfc047fe4d3a296515cf9b542bc6e261af45a80b8caf6", + "sha256:2f31145c7ff665b330919bfa44aacd3a0211a76ca7e7b441039d2a0b0451e415", + "sha256:36720698c29e7a9626a0dc802ef8885f8f0239bfd1689628ecd459a061f2807f", + "sha256:438a1b0203545521f6616132bfe0f4bca86f8a401364008b30e2b26ec408ce85", + "sha256:4815892904c336bbaf73dafd54f45f69f4021c22b5bad7332176bbf4fb830568", + "sha256:5be031b0f15ad63910d8e5038b489d95a79929513b3634ad4babf77100602588", + "sha256:5c93ae37c3c588e829b037fdfbd64a6e40c901d3f93f7beed6d724c44829a3ad", + "sha256:60842230678674cdac4a1cf0f707ef12d75b9a4fc4a565add4f710b5fcf185d5", + "sha256:62939a8bb6758d1bf923aa1c13f0bcfa9bf5b2fc0f5fa917a6e25db5fe0cfa4e", + "sha256:75830c06a62fe7b8fe3bbb5f269f0b308f19f3949ac81cfd40062f47c1455faf", + "sha256:81992565b74332c7c1aff6a913a3e906771aa81c9d0c68c68113cffcae45bc53", + "sha256:8c892fb0ee52c594d9a7751c7d7356056a9682674b92cc1c4dc968ff0f30c52f", + "sha256:9d862e3cf4fc1f2837dedce9c42269c8c76d027e49820a548ac89fdcee1e361f", + "sha256:a623965c086a6e91bb703d4da62dabe59fe88888e82c4117d544e11fd74835d6", + "sha256:a7783ab7f6a508b0510490cef9f857b763d796ba7476d9703f89722928d1e113", + "sha256:aab09fbe8abfa3b9ce62aaf45aca2d28726b1b9ee44871dbe644050a2fff4940", + "sha256:abf181934ac3ef193832fb973fd7f6149b5c531903c2ec0f1220941d73eee601", + "sha256:ae07fa0c115733fce1e9da96a3ac3fa24801742ca17e917e0c79d63a01eeb843", + "sha256:b9c78242219f674ab645ec571c9a95d70f381319a23911941cd2358a8e0521cf", + "sha256:bccb267678b870d9782c3b44d0cefe3ba0e329f9af8c946d32bf3778e7a4f271", + "sha256:c4df4d27f4c93b2cef74579f00b1d3a31a929c7d8023f870c4b476f03a274db4", + "sha256:caf0e50b546bb60dfa99bb18dfa6748458a83131ecdceaf5c071d74907e7e78a", + "sha256:d3266bd3ac59ac4edcd5fa75165dee80b94a3e5c91049df5f7c057ccf097551c", + "sha256:db0d213987bcd4e6d41710fb4532b22315b0d8fb439ff901782234456556aed1", + "sha256:dbbd5cf7690a40a9f0a9325ab480d0fccf46d16b378eefc08e195d84299bfae1", + "sha256:e16e07a0ec3a75b5ee61f2b1003c35696738f937dc8148fbda9fe2147ccb6e61", + "sha256:e175a006725c7faadbe69e791877d09936c0ef2cf49d01b60a6c1efcb0e8be6f", + "sha256:edd9c13a97f6550f9da2236126bb51c092b3b1ce6187f2bd966533ad794bbb5e", + "sha256:fa39ea60d527fbdd94215b5e5552f1c6a912624521093f1384a491a8ad89ad8b" + ], + "version": "==4.2.5" + }, + "markupsafe": { + "hashes": [ + "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1" + ], + "version": "==1.1.0" + }, "mat4py": { "hashes": [ "sha256:8272ce80747120ff44200b1fde341c657595813e1adf61262e44b52642c10dbe" @@ -143,12 +372,40 @@ "index": "pypi", "version": "==3.0.2" }, + "mistune": { + "hashes": [ + "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e", + "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4" + ], + "version": "==0.8.4" + }, "munch": { "hashes": [ "sha256:6ae3d26b837feacf732fb8aa5b842130da1daf221f5af9f9d4b2a0a6414b0d51" ], "version": "==2.3.2" }, + "nbconvert": { + "hashes": [ + "sha256:08d21cf4203fabafd0d09bbd63f06131b411db8ebeede34b0fd4be4548351779", + "sha256:a8a2749f972592aa9250db975304af6b7337f32337e523a2c995cc9e12c07807" + ], + "version": "==5.4.0" + }, + "nbformat": { + "hashes": [ + "sha256:b9a0dbdbd45bb034f4f8893cafd6f652ea08c8c1674ba83f2dc55d3955743b0b", + "sha256:f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402" + ], + "version": "==4.4.0" + }, + "notebook": { + "hashes": [ + "sha256:661341909008d1e7bfa1541904006f9789fa3de1cbec8379d2879819454cc04b", + "sha256:91705b109fc785198faed892489cddb233265564d5e2dad5e4f7974af05ee8dd" + ], + "version": "==5.7.2" + }, "numpy": { "hashes": [ "sha256:0df89ca13c25eaa1621a3f09af4c8ba20da849692dcae184cb55e80952c453fb", @@ -209,6 +466,54 @@ "index": "pypi", "version": "==0.23.4" }, + "pandocfilters": { + "hashes": [ + "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9" + ], + "version": "==1.4.2" + }, + "parso": { + "hashes": [ + "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + ], + "version": "==0.3.1" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "plotly": { + "hashes": [ + "sha256:53c647fdb28590de838678029f7d8fdc42f5ba4643d13c2afd2c4e4d56e18426", + "sha256:5dc85bde91bc80fa05f0d89e9f3a8eaee735b2b404047266874e0ff9c104407f" + ], + "index": "pypi", + "version": "==3.4.1" + }, + "prometheus-client": { + "hashes": [ + "sha256:046cb4fffe75e55ff0e6dfd18e2ea16e54d86cc330f369bebcc683475c8b68a9" + ], + "version": "==0.4.2" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", + "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", + "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" + ], + "version": "==2.0.7" + }, + "pygments": { + "hashes": [ + "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", + "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + ], + "version": "==2.2.0" + }, "pyparsing": { "hashes": [ "sha256:40856e74d4987de5d01761a22d1621ae1c7f8774585acae358aa5c5936c6c90b", @@ -224,6 +529,12 @@ "index": "pypi", "version": "==1.9.5.1" }, + "pyrsistent": { + "hashes": [ + "sha256:05910b7ff43cec0a853c15da0bfaf2867faa95f29b08e71f5846a195f1f38c75" + ], + "version": "==0.14.7" + }, "python-dateutil": { "hashes": [ "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", @@ -238,6 +549,73 @@ ], "version": "==2018.7" }, + "pywinpty": { + "hashes": [ + "sha256:79f2b4584111e36826e587d33eb4e7416a12ae1d6c094cb554e873c5c162fa5f" + ], + "markers": "os_name == 'nt'", + "version": "==0.5.4" + }, + "pyyaml": { + "hashes": [ + "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", + "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", + "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", + "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", + "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" + ], + "version": "==4.2b4" + }, + "pyzmq": { + "hashes": [ + "sha256:25a0715c8f69cf72f67cfe5a68a3f3ed391c67c063d2257bec0fe7fc2c7f08f8", + "sha256:2bab63759632c6b9e0d5bf19cc63c3b01df267d660e0abcf230cf0afaa966349", + "sha256:30ab49d99b24bf0908ebe1cdfa421720bfab6f93174e4883075b7ff38cc555ba", + "sha256:32c7ca9fc547a91e3c26fc6080b6982e46e79819e706eb414dd78f635a65d946", + "sha256:41219ae72b3cc86d97557fe5b1ef5d1adc1057292ec597b50050874a970a39cf", + "sha256:4b8c48a9a13cea8f1f16622f9bd46127108af14cd26150461e3eab71e0de3e46", + "sha256:55724997b4a929c0d01b43c95051318e26ddbae23565018e138ae2dc60187e59", + "sha256:65f0a4afae59d4fc0aad54a917ab599162613a761b760ba167d66cc646ac3786", + "sha256:6f88591a8b246f5c285ee6ce5c1bf4f6bd8464b7f090b1333a446b6240a68d40", + "sha256:75022a4c60dcd8765bb9ca32f6de75a0ec83b0d96e0309dc479f4c7b21f26cb7", + "sha256:76ea493bfab18dcb090d825f3662b5612e2def73dffc196d51a5194b0294a81d", + "sha256:7b60c045b80709e4e3c085bab9b691e71761b44c2b42dbb047b8b498e7bc16b3", + "sha256:8e6af2f736734aef8ed6f278f9f552ec7f37b1a6b98e59b887484a840757f67d", + "sha256:9ac2298e486524331e26390eac14e4627effd3f8e001d4266ed9d8f1d2d31cce", + "sha256:9ba650f493a9bc1f24feca1d90fce0e5dd41088a252ac9840131dfbdbf3815ca", + "sha256:a02a4a385e394e46012dc83d2e8fd6523f039bb52997c1c34a2e0dd49ed839c1", + "sha256:a3ceee84114d9f5711fa0f4db9c652af0e4636c89eabc9b7f03a3882569dd1ed", + "sha256:a72b82ac1910f2cf61a49139f4974f994984475f771b0faa730839607eeedddf", + "sha256:ab136ac51027e7c484c53138a0fab4a8a51e80d05162eb7b1585583bcfdbad27", + "sha256:c095b224300bcac61e6c445e27f9046981b1ac20d891b2f1714da89d34c637c8", + "sha256:c5cc52d16c06dc2521340d69adda78a8e1031705924e103c0eb8fc8af861d810", + "sha256:d612e9833a89e8177f8c1dc68d7b4ff98d3186cd331acd616b01bbdab67d3a7b", + "sha256:e828376a23c66c6fe90dcea24b4b72cd774f555a6ee94081670872918df87a19", + "sha256:e9767c7ab2eb552796440168d5c6e23a99ecaade08dda16266d43ad461730192", + "sha256:ebf8b800d42d217e4710d1582b0c8bff20cdcb4faad7c7213e52644034300924" + ], + "version": "==17.1.2" + }, + "qtconsole": { + "hashes": [ + "sha256:1ac4a65e81a27b0838330a6d351c2f8435d4013d98a95373e8a41119b2968390", + "sha256:bc1ba15f50c29ed50f1268ad823bb6543be263c18dd093b80495e9df63b003ac" + ], + "version": "==4.4.3" + }, + "requests": { + "hashes": [ + "sha256:65b3a120e4329e33c9889db89c80976c5272f56ea92d3e74da8a463992e3ff54", + "sha256:ea881206e59f41dbd0bd445437d792e43906703fff75ca8ff43ccdb11f33f263" + ], + "version": "==2.20.1" + }, + "retrying": { + "hashes": [ + "sha256:08c039560a6da2fe4f2c426d0766e284d3b736e355f8dd24b37367b0bb41973b" + ], + "version": "==1.3.3" + }, "scipy": { "hashes": [ "sha256:0611ee97296265af4a21164a5323f8c1b4e8e15c582d3dfa7610825900136bb7", @@ -272,6 +650,13 @@ "index": "pypi", "version": "==1.1.0" }, + "send2trash": { + "hashes": [ + "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2", + "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b" + ], + "version": "==1.5.0" + }, "shapely": { "hashes": [ "sha256:045e991636787c22bf3e18b57cdaa200681acc0e5db0720123643909d99ad32b", @@ -297,12 +682,71 @@ ], "version": "==1.11.0" }, + "terminado": { + "hashes": [ + "sha256:55abf9ade563b8f9be1f34e4233c7b7bde726059947a593322e8a553cc4c067a", + "sha256:65011551baff97f5414c67018e908110693143cfbaeb16831b743fe7cad8b927" + ], + "version": "==0.8.1" + }, + "testpath": { + "hashes": [ + "sha256:46c89ebb683f473ffe2aab0ed9f12581d4d078308a3cb3765d79c6b2317b0109", + "sha256:b694b3d9288dbd81685c5d2e7140b81365d46c29f5db4bc659de5aa6b98780f8" + ], + "version": "==0.4.2" + }, "toml": { "hashes": [ "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" ], "version": "==0.10.0" + }, + "tornado": { + "hashes": [ + "sha256:0662d28b1ca9f67108c7e3b77afabfb9c7e87bde174fbda78186ecedc2499a9d", + "sha256:4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409", + "sha256:732e836008c708de2e89a31cb2fa6c0e5a70cb60492bee6f1ea1047500feaf7f", + "sha256:8154ec22c450df4e06b35f131adc4f2f3a12ec85981a203301d310abf580500f", + "sha256:8e9d728c4579682e837c92fdd98036bd5cdefa1da2aaf6acf26947e6dd0c01c5", + "sha256:d4b3e5329f572f055b587efc57d29bd051589fb5a43ec8898c77a47ec2fa2bbb", + "sha256:e5f2585afccbff22390cddac29849df463b252b711aa2ce7c5f3f342a5b3b444" + ], + "version": "==5.1.1" + }, + "traitlets": { + "hashes": [ + "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", + "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9" + ], + "version": "==4.3.2" + }, + "urllib3": { + "hashes": [ + "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", + "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + ], + "version": "==1.24.1" + }, + "wcwidth": { + "hashes": [ + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + ], + "version": "==0.1.7" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" + ], + "version": "==0.5.1" + }, + "widgetsnbextension": { + "hashes": [ + "sha256:14b2c65f9940c9a7d3b70adbe713dbd38b5ec69724eebaba034d1036cf3d4740", + "sha256:fa618be8435447a017fd1bf2c7ae922d0428056cfc7449f7a8641edf76b48265" + ], + "version": "==3.4.2" } }, "develop": {} From a49d98c4e48c9c4697045428bd76942123aefbc1 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 09:51:16 +1100 Subject: [PATCH 25/65] Update todos --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fef7520..155ea25 100644 --- a/README.md +++ b/README.md @@ -58,4 +58,7 @@ examining the pre-strom lidar, dune crest and dune toe lines are manually extrac `/data/profile_features/`. ## TODO -https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/ \ No newline at end of file +- [ ] Setup precomit hook for automatic code formatting using [black](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/). +- [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. +- [ ] Estimate max TWL from elevation where pre storm and post storm profiles are the same. +- [ ] Mitch updated the raw profiles.mat to include more information about the survey time. Our data scripts should be updated to parse this new information and include it in our dataframes. \ No newline at end of file From 8b75cced6935b56ef4c343cc341d44c605944275 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 09:52:14 +1100 Subject: [PATCH 26/65] Update notebook --- notebooks/01_exploration.ipynb | 1083 ++++++-------------------------- 1 file changed, 181 insertions(+), 902 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index bc63cf3..81e42ab 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -10,11 +10,11 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T05:09:17.883914Z", - "start_time": "2018-11-21T05:09:16.981157Z" + "end_time": "2018-11-22T22:48:17.973982Z", + "start_time": "2018-11-22T22:48:17.825797Z" } }, "outputs": [], @@ -29,11 +29,10 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T22:54:03.111350Z", - "start_time": "2018-11-21T22:54:03.091796Z" + "start_time": "2018-11-22T22:48:17.826Z" }, "scrolled": true }, @@ -50,34 +49,24 @@ "import plotly.plotly as py\n", "import plotly.tools as tls\n", "\n", + "import colorlover as cl\n", + "\n", "from ipywidgets import widgets, Output\n", - "from IPython.display import display, clear_output, Image" + "from IPython.display import display, clear_output, Image, HTML" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T05:26:30.254784Z", - "start_time": "2018-11-21T05:26:13.523566Z" + "start_time": "2018-11-22T22:48:17.829Z" }, "pixiedust": { "displayParams": {} } }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", - "\n", - "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "def df_from_csv(csv, index_col, data_folder='../data/interim'):\n", " return pd.read_csv(os.path.join(data_folder,csv), index_col=index_col)\n", @@ -111,216 +100,28 @@ "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-21T04:02:25.614132Z", - "start_time": "2018-11-21T04:02:25.609119Z" + "start_time": "2018-11-22T22:48:17.832Z" } }, "outputs": [], - "source": [] + "source": [ + "tables = [Output() for x in range(len(impacts['forecasted']) + 1)]\n", + "tables" + ] }, { "cell_type": "code", - "execution_count": 157, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-22T01:22:23.730687Z", - "start_time": "2018-11-22T01:22:19.346920Z" + "start_time": "2018-11-22T22:48:17.835Z" }, "code_folding": [ - 335, - 430 + 408 ], "scrolled": false }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "237c6a47bf2d418eb98f0ada3a9b00a2", - "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), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))))))), VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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'),)))), HBox(children=(FigureWidget({\n", - " 'data': [{'name': 'Pre Storm Profile',\n", - " 'type': 'scatter',\n", - " 'uid': '534bf20e-d5c0-49b0-8f3a-247fc1db8b29',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'name': 'Post Storm Profile',\n", - " 'type': 'scatter',\n", - " 'uid': '4da21238-7eab-464a-94e3-374d731a3797',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgb(17, 157, 255)', 'size': 20},\n", - " 'mode': 'markers',\n", - " 'name': 'Pre-storm dune crest',\n", - " 'type': 'scatter',\n", - " 'uid': '1bcb6e22-4d7a-487d-a63f-23086513084e',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'marker': {'color': 'rgb(231, 99, 250)', 'size': 20},\n", - " 'mode': 'markers',\n", - " 'name': 'Pre-storm dune toe',\n", - " 'type': 'scatter',\n", - " 'uid': '39507d76-af86-4685-812d-03a96960aac9',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'name': 'Peak R_high: foreshore_slope_sto06',\n", - " 'type': 'scatter',\n", - " 'uid': '64fa5f96-580e-4188-a9f1-95a453763277',\n", - " 'x': [0],\n", - " 'y': [0]},\n", - " {'name': 'Peak R_high: mean_slope_sto06',\n", - " 'type': 'scatter',\n", - " 'uid': '65603ac3-721e-428a-8dc3-c94a500fdeeb',\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.46381539, -33.46301835, -33.46221051, ..., -33.4279646 ,\n", - " -33.42732743, -33.42671036]),\n", - " 'lon': array([151.43639576, 151.43690633, 151.43738179, ..., 151.4501613 ,\n", - " 151.45092222, 151.45170635]),\n", - " 'marker': {'size': 10},\n", - " 'mode': 'markers',\n", - " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", - " 'WAMBE0027'], dtype='{}
\".format(observed_regime)\n", + " \n", + " for forecast in impacts['forecasted']:\n", + " regime = impacts['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id)).storm_regime.values[0]\n", + " site_id_impacts.value += '{}: {}
'.format(forecast, regime)\n", + " \n", + " # Update our tables\n", + " \n", "site_id_select.observe(update_profile, names=\"value\")\n", "\n", "\n", @@ -867,478 +582,42 @@ "for box in selectboxes:\n", " box.observe(update_filter, names=\"value\")\n", "\n", - "# Display our widgets!ore forecast i\n", - "widgets.VBox([filter_container, site_id_container,\n", - " widgets.HBox([g_profiles, g_map]), g_timeseries])\n", - "# widgets.VBox([filter_container,site_id_container,widgets.HBox([g_profiles,g_map]),g_twls,g_params])\n", - "\n", + " \n", "\n", - "# For table\n", - "# out = Output()\n", - "# with out:\n", - "# display(df_waves.head(3))\n", "\n", - "# widgets.VBox([filter_container,site_id_container, out])" + "# Display our widgets!\n", + "widgets.VBox([filter_container, site_id_container,\n", + " widgets.HBox([g_profiles, g_map]), g_timeseries, tables_container])\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 164, + "execution_count": null, "metadata": { "ExecuteTime": { - "end_time": "2018-11-22T01:26:00.955120Z", - "start_time": "2018-11-22T01:26:00.904958Z" - } + "start_time": "2018-11-22T22:48:17.837Z" + }, + "scrolled": true }, - "outputs": [ - { - "data": { - "text/plain": [ - "['2016-05-28 00:00:00',\n", - " '2016-05-28 01:00:00',\n", - " '2016-05-28 02:00:00',\n", - " '2016-05-28 03:00:00',\n", - " '2016-05-28 04:00:00',\n", - " '2016-05-28 05:00:00',\n", - " '2016-05-28 06:00:00',\n", - " '2016-05-28 07:00:00',\n", - " '2016-05-28 08:00:00',\n", - " '2016-05-28 09:00:00',\n", - " '2016-05-28 10:00:00',\n", - " '2016-05-28 11:00:00',\n", - " '2016-05-28 12:00:00',\n", - " '2016-05-28 13:00:00',\n", - " '2016-05-28 14:00:00',\n", - " '2016-05-28 15:00:00',\n", - " '2016-05-28 16:00:00',\n", - " '2016-05-28 17:00:00',\n", - " '2016-05-28 18:00:00',\n", - " '2016-05-28 19:00:00',\n", - " '2016-05-28 20:00:00',\n", - " '2016-05-28 21:00:00',\n", - " '2016-05-28 22:00:00',\n", - " '2016-05-28 23:00:00',\n", - " '2016-05-29 00:00:00',\n", - " '2016-05-29 01:00:00',\n", - " '2016-05-29 02:00:00',\n", - " '2016-05-29 03:00:00',\n", - " '2016-05-29 04:00:00',\n", - " '2016-05-29 05:00:00',\n", - " '2016-05-29 06:00:00',\n", - " '2016-05-29 07:00:00',\n", - " '2016-05-29 08:00:00',\n", - " '2016-05-29 09:00:00',\n", - " '2016-05-29 10:00:00',\n", - " '2016-05-29 11:00:00',\n", - " '2016-05-29 12:00:00',\n", - " '2016-05-29 13:00:00',\n", - " '2016-05-29 14:00:00',\n", - " '2016-05-29 15:00:00',\n", - " '2016-05-29 16:00:00',\n", - " '2016-05-29 17:00:00',\n", - " '2016-05-29 18:00:00',\n", - " '2016-05-29 19:00:00',\n", - " '2016-05-29 20:00:00',\n", - " '2016-05-29 21:00:00',\n", - " '2016-05-29 22:00:00',\n", - " '2016-05-29 23:00:00',\n", - " '2016-05-30 00:00:00',\n", - " '2016-05-30 01:00:00',\n", - " '2016-05-30 02:00:00',\n", - " '2016-05-30 03:00:00',\n", - " '2016-05-30 04:00:00',\n", - " '2016-05-30 05:00:00',\n", - " '2016-05-30 06:00:00',\n", - " '2016-05-30 07:00:00',\n", - " '2016-05-30 08:00:00',\n", - " '2016-05-30 09:00:00',\n", - " '2016-05-30 10:00:00',\n", - " '2016-05-30 11:00:00',\n", - " '2016-05-30 12:00:00',\n", - " '2016-05-30 13:00:00',\n", - " '2016-05-30 14:00:00',\n", - " '2016-05-30 15:00:00',\n", - " '2016-05-30 16:00:00',\n", - " '2016-05-30 17:00:00',\n", - " '2016-05-30 18:00:00',\n", - " '2016-05-30 19:00:00',\n", - " '2016-05-30 20:00:00',\n", - " '2016-05-30 21:00:00',\n", - " '2016-05-30 22:00:00',\n", - " '2016-05-30 23:00:00',\n", - " '2016-05-31 00:00:00',\n", - " '2016-05-31 01:00:00',\n", - " '2016-05-31 02:00:00',\n", - " '2016-05-31 03:00:00',\n", - " '2016-05-31 04:00:00',\n", - " '2016-05-31 05:00:00',\n", - " '2016-05-31 06:00:00',\n", - " '2016-05-31 07:00:00',\n", - " '2016-05-31 08:00:00',\n", - " '2016-05-31 09:00:00',\n", - " '2016-05-31 10:00:00',\n", - " '2016-05-31 11:00:00',\n", - " '2016-05-31 12:00:00',\n", - " '2016-05-31 13:00:00',\n", - " '2016-05-31 14:00:00',\n", - " '2016-05-31 15:00:00',\n", - " '2016-05-31 16:00:00',\n", - " '2016-05-31 17:00:00',\n", - " '2016-05-31 18:00:00',\n", - " '2016-05-31 19:00:00',\n", - " '2016-05-31 20:00:00',\n", - " '2016-05-31 21:00:00',\n", - " '2016-05-31 22:00:00',\n", - " '2016-05-31 23:00:00',\n", - " '2016-06-01 00:00:00',\n", - " '2016-06-01 01:00:00',\n", - " '2016-06-01 02:00:00',\n", - " '2016-06-01 03:00:00',\n", - " '2016-06-01 04:00:00',\n", - " '2016-06-01 05:00:00',\n", - " '2016-06-01 06:00:00',\n", - " '2016-06-01 07:00:00',\n", - " '2016-06-01 08:00:00',\n", - " '2016-06-01 09:00:00',\n", - " '2016-06-01 10:00:00',\n", - " '2016-06-01 11:00:00',\n", - " '2016-06-01 12:00:00',\n", - " '2016-06-01 13:00:00',\n", - " '2016-06-01 14:00:00',\n", - " '2016-06-01 15:00:00',\n", - " '2016-06-01 16:00:00',\n", - " '2016-06-01 17:00:00',\n", - " '2016-06-01 18:00:00',\n", - " '2016-06-01 19:00:00',\n", - " '2016-06-01 20:00:00',\n", - " '2016-06-01 21:00:00',\n", - " '2016-06-01 22:00:00',\n", - " '2016-06-01 23:00:00',\n", - " '2016-06-02 00:00:00',\n", - " '2016-06-02 01:00:00',\n", - " '2016-06-02 02:00:00',\n", - " '2016-06-02 03:00:00',\n", - " '2016-06-02 04:00:00',\n", - " '2016-06-02 05:00:00',\n", - " '2016-06-02 06:00:00',\n", - " '2016-06-02 07:00:00',\n", - " '2016-06-02 08:00:00',\n", - " '2016-06-02 09:00:00',\n", - " '2016-06-02 10:00:00',\n", - " '2016-06-02 11:00:00',\n", - " '2016-06-02 12:00:00',\n", - " '2016-06-02 13:00:00',\n", - " '2016-06-02 14:00:00',\n", - " '2016-06-02 15:00:00',\n", - " '2016-06-02 16:00:00',\n", - " '2016-06-02 17:00:00',\n", - " '2016-06-02 18:00:00',\n", - " '2016-06-02 19:00:00',\n", - " '2016-06-02 20:00:00',\n", - " '2016-06-02 21:00:00',\n", - " '2016-06-02 22:00:00',\n", - " '2016-06-02 23:00:00',\n", - " '2016-06-03 00:00:00',\n", - " '2016-06-03 01:00:00',\n", - " '2016-06-03 02:00:00',\n", - " '2016-06-03 03:00:00',\n", - " '2016-06-03 04:00:00',\n", - " '2016-06-03 05:00:00',\n", - " '2016-06-03 06:00:00',\n", - " '2016-06-03 07:00:00',\n", - " '2016-06-03 08:00:00',\n", - " '2016-06-03 09:00:00',\n", - " '2016-06-03 10:00:00',\n", - " '2016-06-03 11:00:00',\n", - " '2016-06-03 12:00:00',\n", - " '2016-06-03 13:00:00',\n", - " '2016-06-03 14:00:00',\n", - " '2016-06-03 15:00:00',\n", - " '2016-06-03 16:00:00',\n", - " '2016-06-03 17:00:00',\n", - " '2016-06-03 18:00:00',\n", - " '2016-06-03 19:00:00',\n", - " '2016-06-03 20:00:00',\n", - " '2016-06-03 21:00:00',\n", - " '2016-06-03 22:00:00',\n", - " '2016-06-03 23:00:00',\n", - " '2016-06-04 00:00:00',\n", - " '2016-06-04 01:00:00',\n", - " '2016-06-04 02:00:00',\n", - " '2016-06-04 03:00:00',\n", - " '2016-06-04 04:00:00',\n", - " '2016-06-04 05:00:00',\n", - " '2016-06-04 06:00:00',\n", - " '2016-06-04 07:00:00',\n", - " '2016-06-04 08:00:00',\n", - " '2016-06-04 09:00:00',\n", - " '2016-06-04 10:00:00',\n", - " '2016-06-04 11:00:00',\n", - " '2016-06-04 12:00:00',\n", - " '2016-06-04 13:00:00',\n", - " '2016-06-04 14:00:00',\n", - " '2016-06-04 15:00:00',\n", - " '2016-06-04 16:00:00',\n", - " '2016-06-04 17:00:00',\n", - " '2016-06-04 18:00:00',\n", - " '2016-06-04 19:00:00',\n", - " '2016-06-04 20:00:00',\n", - " '2016-06-04 21:00:00',\n", - " '2016-06-04 22:00:00',\n", - " '2016-06-04 23:00:00',\n", - " '2016-06-05 00:00:00',\n", - " '2016-06-05 01:00:00',\n", - " '2016-06-05 02:00:00',\n", - " '2016-06-05 03:00:00',\n", - " '2016-06-05 04:00:00',\n", - " '2016-06-05 05:00:00',\n", - " '2016-06-05 06:00:00',\n", - " '2016-06-05 07:00:00',\n", - " '2016-06-05 08:00:00',\n", - " '2016-06-05 09:00:00',\n", - " '2016-06-05 10:00:00',\n", - " '2016-06-05 11:00:00',\n", - " '2016-06-05 12:00:00',\n", - " '2016-06-05 13:00:00',\n", - " '2016-06-05 14:00:00',\n", - " '2016-06-05 15:00:00',\n", - " '2016-06-05 16:00:00',\n", - " '2016-06-05 17:00:00',\n", - " '2016-06-05 18:00:00',\n", - " '2016-06-05 19:00:00',\n", - " '2016-06-05 20:00:00',\n", - " '2016-06-05 21:00:00',\n", - " '2016-06-05 22:00:00',\n", - " '2016-06-05 23:00:00',\n", - " '2016-06-06 00:00:00',\n", - " '2016-06-06 01:00:00',\n", - " '2016-06-06 02:00:00',\n", - " '2016-06-06 03:00:00',\n", - " '2016-06-06 04:00:00',\n", - " '2016-06-06 05:00:00',\n", - " '2016-06-06 06:00:00',\n", - " '2016-06-06 07:00:00',\n", - " '2016-06-06 08:00:00',\n", - " '2016-06-06 09:00:00',\n", - " '2016-06-06 10:00:00',\n", - " '2016-06-06 11:00:00',\n", - " '2016-06-06 12:00:00',\n", - " '2016-06-06 13:00:00',\n", - " '2016-06-06 14:00:00',\n", - " '2016-06-06 15:00:00',\n", - " '2016-06-06 16:00:00',\n", - " '2016-06-06 17:00:00',\n", - " '2016-06-06 18:00:00',\n", - " '2016-06-06 19:00:00',\n", - " '2016-06-06 20:00:00',\n", - " '2016-06-06 21:00:00',\n", - " '2016-06-06 22:00:00',\n", - " '2016-06-06 23:00:00',\n", - " '2016-06-07 00:00:00',\n", - " '2016-06-07 01:00:00',\n", - " '2016-06-07 02:00:00',\n", - " '2016-06-07 03:00:00',\n", - " '2016-06-07 04:00:00',\n", - " '2016-06-07 05:00:00',\n", - " '2016-06-07 06:00:00',\n", - " '2016-06-07 07:00:00',\n", - " '2016-06-07 08:00:00',\n", - " '2016-06-07 09:00:00',\n", - " '2016-06-07 10:00:00',\n", - " '2016-06-07 11:00:00',\n", - " '2016-06-07 12:00:00',\n", - " '2016-06-07 13:00:00',\n", - " '2016-06-07 14:00:00',\n", - " '2016-06-07 15:00:00',\n", - " '2016-06-07 16:00:00',\n", - " '2016-06-07 17:00:00',\n", - " '2016-06-07 18:00:00',\n", - " '2016-06-07 19:00:00',\n", - " '2016-06-07 20:00:00',\n", - " '2016-06-07 21:00:00',\n", - " '2016-06-07 22:00:00',\n", - " '2016-06-07 23:00:00',\n", - " '2016-06-08 00:00:00',\n", - " '2016-06-08 01:00:00',\n", - " '2016-06-08 02:00:00',\n", - " '2016-06-08 03:00:00',\n", - " '2016-06-08 04:00:00',\n", - " '2016-06-08 05:00:00',\n", - " '2016-06-08 06:00:00',\n", - " '2016-06-08 07:00:00',\n", - " '2016-06-08 08:00:00',\n", - " '2016-06-08 09:00:00',\n", - " '2016-06-08 10:00:00',\n", - " '2016-06-08 11:00:00',\n", - " '2016-06-08 12:00:00',\n", - " '2016-06-08 13:00:00',\n", - " '2016-06-08 14:00:00',\n", - " '2016-06-08 15:00:00',\n", - " '2016-06-08 16:00:00',\n", - " '2016-06-08 17:00:00',\n", - " '2016-06-08 18:00:00',\n", - " '2016-06-08 19:00:00',\n", - " '2016-06-08 20:00:00',\n", - " '2016-06-08 21:00:00',\n", - " '2016-06-08 22:00:00',\n", - " '2016-06-08 23:00:00',\n", - " '2016-06-09 00:00:00',\n", - " '2016-06-09 01:00:00',\n", - " '2016-06-09 02:00:00',\n", - " '2016-06-09 03:00:00',\n", - " '2016-06-09 04:00:00',\n", - " '2016-06-09 05:00:00',\n", - " '2016-06-09 06:00:00',\n", - " '2016-06-09 07:00:00',\n", - " '2016-06-09 08:00:00',\n", - " '2016-06-09 09:00:00',\n", - " '2016-06-09 10:00:00',\n", - " '2016-06-09 11:00:00',\n", - " '2016-06-09 12:00:00',\n", - " '2016-06-09 13:00:00',\n", - " '2016-06-09 14:00:00',\n", - " '2016-06-09 15:00:00',\n", - " '2016-06-09 16:00:00',\n", - " '2016-06-09 17:00:00',\n", - " '2016-06-09 18:00:00',\n", - " '2016-06-09 19:00:00',\n", - " '2016-06-09 20:00:00',\n", - " '2016-06-09 21:00:00',\n", - " '2016-06-09 22:00:00',\n", - " '2016-06-09 23:00:00',\n", - " '2016-06-10 00:00:00',\n", - " '2016-06-10 01:00:00',\n", - " '2016-06-10 02:00:00',\n", - " '2016-06-10 03:00:00',\n", - " '2016-06-10 04:00:00',\n", - " '2016-06-10 05:00:00',\n", - " '2016-06-10 06:00:00',\n", - " '2016-06-10 07:00:00',\n", - " '2016-06-10 08:00:00',\n", - " '2016-06-10 09:00:00',\n", - " '2016-06-10 10:00:00',\n", - " '2016-06-10 11:00:00',\n", - " '2016-06-10 12:00:00',\n", - " '2016-06-10 13:00:00',\n", - " '2016-06-10 14:00:00',\n", - " '2016-06-10 15:00:00',\n", - " '2016-06-10 16:00:00',\n", - " '2016-06-10 17:00:00',\n", - " '2016-06-10 18:00:00',\n", - " '2016-06-10 19:00:00',\n", - " '2016-06-10 20:00:00',\n", - " '2016-06-10 21:00:00',\n", - " '2016-06-10 22:00:00',\n", - " '2016-06-10 23:00:00',\n", - " '2016-06-11 00:00:00',\n", - " '2016-06-11 01:00:00',\n", - " '2016-06-11 02:00:00',\n", - " '2016-06-11 03:00:00',\n", - " '2016-06-11 04:00:00',\n", - " '2016-06-11 05:00:00',\n", - " '2016-06-11 06:00:00',\n", - " '2016-06-11 07:00:00',\n", - " '2016-06-11 08:00:00',\n", - " '2016-06-11 09:00:00',\n", - " '2016-06-11 10:00:00',\n", - " '2016-06-11 11:00:00',\n", - " '2016-06-11 12:00:00',\n", - " '2016-06-11 13:00:00',\n", - " '2016-06-11 14:00:00',\n", - " '2016-06-11 15:00:00',\n", - " '2016-06-11 16:00:00',\n", - " '2016-06-11 17:00:00',\n", - " '2016-06-11 18:00:00',\n", - " '2016-06-11 19:00:00',\n", - " '2016-06-11 20:00:00',\n", - " '2016-06-11 21:00:00',\n", - " '2016-06-11 22:00:00',\n", - " '2016-06-11 23:00:00',\n", - " '2016-06-12 00:00:00',\n", - " '2016-06-12 01:00:00',\n", - " '2016-06-12 02:00:00',\n", - " '2016-06-12 03:00:00',\n", - " '2016-06-12 04:00:00',\n", - " '2016-06-12 05:00:00',\n", - " '2016-06-12 06:00:00',\n", - " '2016-06-12 07:00:00',\n", - " '2016-06-12 08:00:00',\n", - " '2016-06-12 09:00:00',\n", - " '2016-06-12 10:00:00',\n", - " '2016-06-12 11:00:00',\n", - " '2016-06-12 12:00:00',\n", - " '2016-06-12 13:00:00',\n", - " '2016-06-12 14:00:00',\n", - " '2016-06-12 15:00:00',\n", - " '2016-06-12 16:00:00',\n", - " '2016-06-12 17:00:00',\n", - " '2016-06-12 18:00:00',\n", - " '2016-06-12 19:00:00',\n", - " '2016-06-12 20:00:00',\n", - " '2016-06-12 21:00:00',\n", - " '2016-06-12 22:00:00',\n", - " '2016-06-12 23:00:00',\n", - " '2016-06-13 00:00:00',\n", - " '2016-06-13 01:00:00',\n", - " '2016-06-13 02:00:00',\n", - " '2016-06-13 03:00:00',\n", - " '2016-06-13 04:00:00',\n", - " '2016-06-13 05:00:00',\n", - " '2016-06-13 06:00:00',\n", - " '2016-06-13 07:00:00',\n", - " '2016-06-13 08:00:00',\n", - " '2016-06-13 09:00:00',\n", - " '2016-06-13 10:00:00',\n", - " '2016-06-13 11:00:00',\n", - " '2016-06-13 12:00:00',\n", - " '2016-06-13 13:00:00',\n", - " '2016-06-13 14:00:00',\n", - " '2016-06-13 15:00:00',\n", - " '2016-06-13 16:00:00',\n", - " '2016-06-13 17:00:00',\n", - " '2016-06-13 18:00:00',\n", - " '2016-06-13 19:00:00',\n", - " '2016-06-13 20:00:00',\n", - " '2016-06-13 21:00:00',\n", - " '2016-06-13 22:00:00',\n", - " '2016-06-13 23:00:00',\n", - " '2016-06-14 00:00:00',\n", - " '2016-06-14 01:00:00',\n", - " '2016-06-14 02:00:00',\n", - " '2016-06-14 03:00:00',\n", - " '2016-06-14 04:00:00',\n", - " '2016-06-14 05:00:00',\n", - " '2016-06-14 06:00:00',\n", - " '2016-06-14 07:00:00',\n", - " '2016-06-14 08:00:00',\n", - " '2016-06-14 09:00:00',\n", - " '2016-06-14 10:00:00',\n", - " '2016-06-14 11:00:00',\n", - " '2016-06-14 12:00:00',\n", - " '2016-06-14 13:00:00',\n", - " '2016-06-14 14:00:00',\n", - " '2016-06-14 15:00:00',\n", - " '2016-06-14 16:00:00',\n", - " '2016-06-14 17:00:00',\n", - " '2016-06-14 18:00:00',\n", - " '2016-06-14 19:00:00',\n", - " '2016-06-14 20:00:00',\n", - " '2016-06-14 21:00:00',\n", - " '2016-06-14 22:00:00',\n", - " '2016-06-14 23:00:00',\n", - " '2016-06-15 00:00:00']" - ] - }, - "execution_count": 164, - "metadata": {}, - "output_type": "execute_result" + "outputs": [], + "source": [ + "titles[0].observe" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "start_time": "2018-11-22T22:48:17.840Z" } - ], + }, + "outputs": [], "source": [ - "g_timeseries.data\n", - "df_twl = twls['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format('NARRA0018'))\n", - "times = df_twl.index.get_level_values('datetime').tolist()\n", - "times" + "# impacts['observed'].query(\"site_id=='{}'\".format(\"NARRA0018\")).T\n", + "impacts['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format(\"NARRA0018\")).T\n", + "\n" ] } ], From 2a64c17353f4dfa70344d58e4ee02cd937bff721 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 10:11:07 +1100 Subject: [PATCH 27/65] Fix bug with how observed storm impacts are were calculated --- src/analysis/observed_storm_impacts.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 7c12d6a..0aadbbe 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -85,6 +85,10 @@ def volume_change(df_profiles, df_profile_features, zone): x_max=x_max, ) + # No point keeping so many decimal places, let's round them + prestorm_vol = np.round(prestorm_vol, 2) + poststorm_vol = np.round(poststorm_vol, 2) + df_vol_changes.loc[site_id, "prestorm_{}_vol".format(zone)] = prestorm_vol df_vol_changes.loc[site_id, "poststorm_{}_vol".format(zone)] = poststorm_vol df_vol_changes.loc[site_id, "{}_vol_change".format(zone)] = prestorm_vol - poststorm_vol @@ -119,8 +123,8 @@ def storm_regime(df_observed_impacts): :return: """ logger.info("Getting observed storm regimes") - df_observed_impacts.loc[df_observed_impacts.swash_vol_change < 3, "storm_regime"] = "swash" - df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change > 3, "storm_regime"] = "collision" + df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change <= 5, "storm_regime"] = "swash" + df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change > 5, "storm_regime"] = "collision" return df_observed_impacts From 16b36fa71f96bcf7b711ceab56046d547f694f3e Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 13:37:56 +1100 Subject: [PATCH 28/65] Update README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 155ea25..9cd58f0 100644 --- a/README.md +++ b/README.md @@ -61,4 +61,5 @@ examining the pre-strom lidar, dune crest and dune toe lines are manually extrac - [ ] Setup precomit hook for automatic code formatting using [black](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/). - [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. - [ ] Estimate max TWL from elevation where pre storm and post storm profiles are the same. -- [ ] Mitch updated the raw profiles.mat to include more information about the survey time. Our data scripts should be updated to parse this new information and include it in our dataframes. \ No newline at end of file +- [ ] Mitch updated the raw profiles.mat to include more information about the survey time. Our data scripts should be updated to parse this new information and include it in our dataframes. +- [ ] Implement (bayesian change detection algorithm)[https://github.com/hildensia/bayesian_changepoint_detection] to help detect dune crests and toes from profiles \ No newline at end of file From 209a023d96af9e58a490a3d0648fea2d0cc6ae2c Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 16:46:18 +1100 Subject: [PATCH 29/65] Improve iterative calculation of prestorm foreshore slope --- src/analysis/forecast_twl.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 11ae0ad..e15df6e 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -152,9 +152,11 @@ def foreshore_slope_from_profile(profile_x, profile_z, tide, runup_function, **k return None # Initalize estimates - max_number_iterations = 20 + max_number_iterations = 30 iteration_count = 0 - min_accuracy = 0.001 + averaged_accuracy = 0.03 # if slopes within this amount, average after max number of iterations + acceptable_accuracy = 0.01 # if slopes within this amount, accept after max number of iterations + preferred_accuracy = 0.001 # if slopes within this amount, accept beta = 0.05 while True: @@ -173,12 +175,17 @@ def foreshore_slope_from_profile(profile_x, profile_z, tide, runup_function, **k return None # If slopes do not change much between interactions, return the slope - if abs(beta_new - beta) < min_accuracy: + if abs(beta_new - beta) < preferred_accuracy: return beta # If we can't converge a solution, return None if iteration_count > max_number_iterations: - return None + if abs(beta_new - beta) < acceptable_accuracy: + return beta + elif abs(beta_new - beta) < averaged_accuracy: + return (beta_new + beta) / 2 + else: + return None beta = beta_new iteration_count += 1 @@ -230,7 +237,7 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho return -(z_top - z_btm) / (x_top - x_btm) elif method == "least_squares": - profile_mask = [True if end_points["top"]["x"] < pts < end_points["btm"]["x"] else False for pts in x] + profile_mask = [True if end_points["top"]["x"] < pts < end_points["btm"]["x"] else False for pts in profile_x] slope_x = np.array(profile_x)[profile_mask].tolist() slope_z = np.array(profile_z)[profile_mask].tolist() slope, _, _, _, _ = stats.linregress(slope_x, slope_z) From f54af8656ac355ebeea1e945947d29ab06598f82 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 16:46:27 +1100 Subject: [PATCH 30/65] Update README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 9cd58f0..261f86b 100644 --- a/README.md +++ b/README.md @@ -62,4 +62,5 @@ examining the pre-strom lidar, dune crest and dune toe lines are manually extrac - [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. - [ ] Estimate max TWL from elevation where pre storm and post storm profiles are the same. - [ ] Mitch updated the raw profiles.mat to include more information about the survey time. Our data scripts should be updated to parse this new information and include it in our dataframes. -- [ ] Implement (bayesian change detection algorithm)[https://github.com/hildensia/bayesian_changepoint_detection] to help detect dune crests and toes from profiles \ No newline at end of file +- [ ] Implement (bayesian change detection algorithm)[https://github.com/hildensia/bayesian_changepoint_detection] to help detect dune crests and toes from profiles +- [ ] Implement dune impact calculations \ No newline at end of file From 3047700323eee3cba70bb5461066029bc38ee88d Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 23 Nov 2018 16:47:01 +1100 Subject: [PATCH 31/65] Improve jupyter notebook --- notebooks/01_exploration.ipynb | 968 +++++++++++++++++++++++++++------ 1 file changed, 792 insertions(+), 176 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 81e42ab..18c5b6f 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -29,10 +29,11 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 232, "metadata": { "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.826Z" + "end_time": "2018-11-23T01:45:39.791501Z", + "start_time": "2018-11-23T01:45:39.780471Z" }, "scrolled": true }, @@ -48,25 +49,50 @@ "import plotly.graph_objs as go\n", "import plotly.plotly as py\n", "import plotly.tools as tls\n", + "import plotly.figure_factory as ff\n", "\n", + "import matplotlib\n", + "from matplotlib import cm\n", "import colorlover as cl\n", "\n", "from ipywidgets import widgets, Output\n", - "from IPython.display import display, clear_output, Image, HTML" + "from IPython.display import display, clear_output, Image, HTML\n", + "\n", + "from sklearn.metrics import confusion_matrix" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Import our data into pandas Dataframes for the analysis. Data files are `.csv` files which are stored in the `./data/interim/` folder." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 273, "metadata": { "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.829Z" + "end_time": "2018-11-23T02:59:30.467706Z", + "start_time": "2018-11-23T02:59:17.099702Z" }, "pixiedust": { "displayParams": {} - } + }, + "scrolled": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", + "\n", + "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "\n" + ] + } + ], "source": [ "def df_from_csv(csv, index_col, data_folder='../data/interim'):\n", " return pd.read_csv(os.path.join(data_folder,csv), index_col=index_col)\n", @@ -96,106 +122,293 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": { - "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.832Z" - } - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "tables = [Output() for x in range(len(impacts['forecasted']) + 1)]\n", - "tables" + "The following interactive data explorer displays information on a per `site_id` basis. It can be used to examine pre/post storm cross-sections, water level time series and observed/predicted storm impacts." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 276, "metadata": { "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.835Z" + "end_time": "2018-11-23T03:07:46.410476Z", + "start_time": "2018-11-23T03:07:43.154124Z" }, "code_folding": [ 408 ], + "hide_input": false, "scrolled": false }, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "cc4ab9cdf0cb422f8870d6ba906e538a", + "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), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))))))), HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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': '2618ab16-1e96-4273-8141-bd4b6bdc9c83',\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': '3872fe91-a2e2-4762-aa61-c0e01b271cdd',\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': '93c17c28-b6f2-4c12-8a4b-b7683362ece4',\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': '9b2cb05f-3f32-4a07-84fb-24e79e745a47',\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': '1f12592c-7294-4735-8bda-b9bdf30f32c4',\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': '711f34f8-0dd7-4d38-9bcc-67636d7ed2a5',\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.46381539, -33.46301835, -33.46221051, ..., -33.4279646 ,\n", + " -33.42732743, -33.42671036]),\n", + " 'lon': array([151.43639576, 151.43690633, 151.43738179, ..., 151.4501613 ,\n", + " 151.45092222, 151.45170635]),\n", + " 'marker': {'size': 10},\n", + " 'mode': 'markers',\n", + " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", + " 'WAMBE0027'], dtype='Filter by observed and predicted impacts:\",\n", - ")\n", + " value=\"Filter by observed and predicted impacts:\", )\n", "\n", "titles = ['Observed Impacts']\n", - "selectboxes = [widgets.SelectMultiple(\n", - " options=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", - " value=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", - " disabled=False)]\n", + "selectboxes = [\n", + " widgets.SelectMultiple(\n", + " options=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", + " value=impacts['observed'].storm_regime.dropna().unique().tolist(),\n", + " disabled=False)\n", + "]\n", "\n", "# Iterate through each of our forecasted impacts\n", "for forecast in impacts['forecasted']:\n", " selectboxes.append(\n", " widgets.SelectMultiple(\n", - " options=impacts['forecasted'][forecast].storm_regime.dropna(\n", - " ).unique().tolist(),\n", - " value=impacts['forecasted'][forecast].storm_regime.dropna(\n", - " ).unique().tolist(),\n", + " options=impacts['forecasted'][\n", + " forecast].storm_regime.dropna().unique().tolist(),\n", + " value=impacts['forecasted'][forecast].storm_regime.dropna()\n", + " .unique().tolist(),\n", " disabled=False))\n", " titles.append('Forecasted: {}'.format(forecast))\n", "\n", "titles = [widgets.HTML(value=title) for title in titles]\n", "\n", - "children = widgets.HBox(children=[widgets.VBox(\n", - " children=[title, box]) for title, box in zip(titles, selectboxes)])\n", + "children = widgets.HBox(children=[\n", + " widgets.VBox(children=[title, box])\n", + " for title, box in zip(titles, selectboxes)\n", + "])\n", "filter_container = widgets.VBox(children=[filter_title, children])\n", "\n", - "\n", "# Create widgets for selecting site_id\n", - "site_id_title = widgets.HTML(\n", - " value=\"Filter by site_id:\",\n", - ")\n", + "site_id_title = widgets.HTML(value=\"Filter by site_id:\", )\n", "\n", "site_id_select = widgets.Dropdown(\n", " description='site_id: ',\n", " value='NARRA0001',\n", - " options=df_profiles.index.get_level_values(\n", - " 'site_id').unique().sort_values().tolist()\n", - ")\n", + " options=df_profiles.index.get_level_values('site_id').unique()\n", + " .sort_values().tolist())\n", "\n", - "site_id_impacts = widgets.HTML(\n", - " value=\"\",\n", - ")\n", + "site_id_impacts = widgets.HTML(value=\"\", )\n", "\n", "site_id_container = widgets.HBox(children=[\n", - " widgets.VBox(children=[site_id_title, widgets.HBox(children=[site_id_select])]),\n", - " site_id_impacts\n", + " widgets.VBox(\n", + " children=[site_id_title,\n", + " widgets.HBox(children=[site_id_select])]), site_id_impacts\n", "])\n", "\n", - "\n", - "\n", - "\n", "# Build colors for each of our forecasts\n", - "colors = list(reversed(cl.scales[str(max(len(impacts['forecasted']), 3))]['seq']['YlGnBu']))\n", + "colors = list(\n", + " reversed(cl.scales[str(max(len(impacts['forecasted']),\n", + " 3))]['seq']['YlGnBu']))\n", "\n", "# Add panel for pre/post storm profiles\n", "trace1 = go.Scatter(\n", " x=[0],\n", " y=[0],\n", " name='Pre Storm Profile',\n", - " line=dict(\n", - " color=('rgb(51,160,44)'),\n", - " width=2)\n", - ")\n", + " line=dict(color=('rgb(51,160,44)'), width=2))\n", "trace2 = go.Scatter(\n", " x=[0],\n", " y=[0],\n", " name='Post Storm Profile',\n", - " line=dict(\n", - " color=('rgb(255,127,0)'),\n", - " width=2)\n", - ")\n", + " line=dict(color=('rgb(255,127,0)'), width=2))\n", "trace3 = go.Scatter(\n", " x=[0],\n", " y=[0],\n", @@ -204,11 +417,7 @@ " marker=dict(\n", " color='rgba(255,255,255,0)',\n", " size=10,\n", - " line=dict(\n", - " color='rgba(106,61,154, 1)',\n", - " width=2\n", - " )\n", - " ),\n", + " line=dict(color='rgba(106,61,154, 1)', width=2)),\n", ")\n", "trace4 = go.Scatter(\n", " x=[0],\n", @@ -218,25 +427,21 @@ " marker=dict(\n", " color='rgba(255,255,255,0)',\n", " size=10,\n", - " line=dict(\n", - " color='rgba(202,178,214,1)',\n", - " width=2\n", - " )\n", - " ),\n", + " line=dict(color='rgba(202,178,214,1)', width=2)),\n", ")\n", "\n", "forecast_traces = []\n", "for forecast, color in zip(impacts['forecasted'], colors):\n", - " forecast_traces.append(go.Scatter(\n", - " x=[0],\n", - " y=[0],\n", - " name='Peak R_high: {}'.format(forecast),\n", - " mode='lines',\n", - " line=dict(\n", - " color=color,\n", - " width=4,)\n", - "\n", - " ))\n", + " forecast_traces.append(\n", + " go.Scatter(\n", + " x=[0],\n", + " y=[0],\n", + " name='Peak R_high: {}'.format(forecast),\n", + " mode='lines',\n", + " line=dict(\n", + " color=color,\n", + " width=4,\n", + " )))\n", "\n", "layout = go.Layout(\n", " title='Bed Profiles',\n", @@ -249,21 +454,17 @@ " showgrid=True,\n", " zeroline=True,\n", " showline=True,\n", - " range=[0, 200]\n", - " ),\n", + " range=[0, 200]),\n", " yaxis=dict(\n", " title='z (m)',\n", " autorange=False,\n", " showgrid=True,\n", " zeroline=True,\n", " showline=True,\n", - " range=[-1, 20]\n", - " )\n", - ")\n", - "\n", - "g_profiles = go.FigureWidget(data=[trace1, trace2, trace3, trace4]+forecast_traces,\n", - " layout=layout)\n", + " range=[-1, 20]))\n", "\n", + "g_profiles = go.FigureWidget(\n", + " data=[trace1, trace2, trace3, trace4] + forecast_traces, layout=layout)\n", "\n", "# Add panel for google maps\n", "mapbox_access_token = 'pk.eyJ1IjoiY2hyaXNsZWFtYW4iLCJhIjoiY2pvNTY1MzZpMDc2OTN2bmw5MGsycHp5bCJ9.U2dwFg2c7RFjUNSayERUiw'\n", @@ -273,9 +474,7 @@ " lat=df_sites['lat'],\n", " lon=df_sites['lon'],\n", " mode='markers',\n", - " marker=dict(\n", - " size=10\n", - " ),\n", + " marker=dict(size=10),\n", " text=df_sites.index.get_level_values('site_id'),\n", " ),\n", " go.Scattermapbox(\n", @@ -300,20 +499,15 @@ " mapbox=dict(\n", " accesstoken=mapbox_access_token,\n", " bearing=0,\n", - " center=dict(\n", - " lat=-33.7,\n", - " lon=151.3\n", - " ),\n", + " center=dict(lat=-33.7, lon=151.3),\n", " pitch=0,\n", " zoom=12,\n", - " style='satellite-streets'\n", - " ),\n", + " style='satellite-streets'),\n", ")\n", "\n", "fig = dict(data=data, layout=layout)\n", "g_map = go.FigureWidget(data=data, layout=layout)\n", "\n", - "\n", "subplot = tls.make_subplots(3, 1, print_grid=False, shared_xaxes=True)\n", "g_timeseries = go.FigureWidget(subplot)\n", "\n", @@ -346,12 +540,9 @@ " y=[0, 3],\n", " name='Dune Crest',\n", " mode='lines',\n", - " line=dict(\n", - " color=('rgb(214, 117, 14)'),\n", - " width=2,\n", - " dash='dot')\n", - " ), row=1, col=1)\n", - "\n", + " line=dict(color=('rgb(214, 117, 14)'), width=2, dash='dot')),\n", + " row=1,\n", + " col=1)\n", "\n", "g_timeseries.add_trace(\n", " go.Scatter(\n", @@ -359,22 +550,18 @@ " y=[0, 3],\n", " name='Dune Toe',\n", " mode='lines',\n", - " line=dict(\n", - " color=('rgb(142, 77, 8)'),\n", - " width=2,\n", - " dash='dash')\n", - " ), row=1, col=1)\n", + " line=dict(color=('rgb(142, 77, 8)'), width=2, dash='dash')),\n", + " row=1,\n", + " col=1)\n", "\n", "g_timeseries.add_trace(\n", " go.Scatter(\n", " x=[0, 3],\n", " y=[0, 3],\n", " name='Tide+Surge WL',\n", - " line=dict(\n", - " color=('rgb(8,51,137)'),\n", - " width=2,\n", - " dash='dot')\n", - " ), row=1, col=1)\n", + " line=dict(color=('rgb(8,51,137)'), width=2, dash='dot')),\n", + " row=1,\n", + " col=1)\n", "\n", "for forecast, color in zip(twls['forecasted'], colors):\n", " g_timeseries.add_trace(\n", @@ -382,26 +569,22 @@ " x=[0],\n", " y=[0],\n", " name='R_high: {}'.format(forecast),\n", - " line=dict(\n", - " color=color,\n", - " width=3)), row=1, col=1)\n", - "\n", + " line=dict(color=color, width=3)),\n", + " row=1,\n", + " col=1)\n", "\n", "# Add trace for each forecasted beta term\n", - "for forecast, color in zip(impacts['forecasted'],colors):\n", + "for forecast, color in zip(impacts['forecasted'], colors):\n", " g_timeseries.add_trace(\n", " go.Scatter(\n", " x=[0, 1],\n", " y=[0, 1],\n", " name='Beta: {}'.format(forecast),\n", - " line=dict(\n", - " color=color,\n", - " width=3)),\n", + " line=dict(color=color, width=3)),\n", " row=2,\n", " col=1,\n", " )\n", "\n", - "\n", "# Create axis for Tp on same plot as Hs\n", "g_timeseries['layout']['yaxis4'] = {'overlaying': 'y3', 'side': 'right'}\n", "g_timeseries.data[1]['yaxis'] = 'y4'\n", @@ -417,33 +600,38 @@ "g_timeseries['layout'].update(height=400, legend=dict(font={'size': 10}))\n", "g_timeseries['layout'].update(margin=dict(t=20, l=50, r=20, b=100))\n", "\n", - "\n", - "\n", "# Add panel for some tables\n", "titles = ['observed'] + [forecast for forecast in impacts['forecasted']]\n", "titles = [widgets.HTML(value=\"{}\".format(title)) for title in titles]\n", "\n", + "\n", "def get_observed_impacts_table(site_id):\n", - " display(impacts['observed'].query(\"site_id=='{}'\".format(site_id)).T)\n", + " display(impacts['observed'].query(\"site_id=='{}'\".format(site_id)).T)\n", "\n", "\n", - "def get_forecasted_impacts_table(site_id,forecast):\n", - " display(impacts['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id)).T)\n", + "def get_forecasted_impacts_table(site_id, forecast):\n", + " display(impacts['forecasted'][forecast].query(\n", + " \"site_id=='{}'\".format(site_id)).T)\n", "\n", - " \n", - "impacts_table_observed = widgets.interactive_output(get_observed_impacts_table, {'site_id': site_id_select})\n", + "\n", + "impacts_table_observed = widgets.interactive_output(\n", + " get_observed_impacts_table, {'site_id': site_id_select})\n", "forecasted_impacts_tables = []\n", "for forecast, title in zip(impacts['forecasted'], titles[1:]):\n", - " forecasted_impacts_tables.append(widgets.interactive_output(get_forecasted_impacts_table, {'site_id': site_id_select, 'forecast':title}))\n", + " forecasted_impacts_tables.append(\n", + " widgets.interactive_output(get_forecasted_impacts_table, {\n", + " 'site_id': site_id_select,\n", + " 'forecast': title\n", + " }))\n", "\n", "tables = [impacts_table_observed] + forecasted_impacts_tables\n", "\n", - "title_tables=[widgets.VBox(children=[title,table]) for title,table in zip(titles,tables)]\n", - " \n", - "tables_container= widgets.HBox(children=[*title_tables])\n", - "\n", - "\n", + "title_tables = [\n", + " widgets.VBox(children=[title, table])\n", + " for title, table in zip(titles, tables)\n", + "]\n", "\n", + "tables_container = widgets.HBox(children=[*title_tables])\n", "\n", "\n", "def update_profile(change):\n", @@ -484,8 +672,8 @@ " for n, forecast in enumerate(impacts['forecasted']):\n", " R_high = max(impacts['forecasted'][forecast].query(\n", " \"site_id=='{}'\".format(site_id)).R_high)\n", - " g_profiles.data[4+n].x = [200, 400]\n", - " g_profiles.data[4+n].y = [R_high, R_high]\n", + " g_profiles.data[4 + n].x = [200, 400]\n", + " g_profiles.data[4 + n].y = [R_high, R_high]\n", "\n", " # Relocate plan of satellite imagery\n", " site_coords = df_sites.query('site_id == \"{}\"'.format(site_id))\n", @@ -505,6 +693,12 @@ " times = df_waves_site.index.get_level_values('datetime').tolist()\n", " Hs0s = df_waves_site.Hs0.tolist()\n", " Tps = df_waves_site.Tp.tolist()\n", + "\n", + " df_tide_site = df_tides.query(\"site_id=='{}'\".format(site_id))\n", + " mask = (df_tide_site.index.get_level_values('datetime') >= min(times)) & (\n", + " df_tide_site.index.get_level_values('datetime') <= max(times))\n", + " df_tide_site = df_tide_site.loc[mask]\n", + "\n", " with g_timeseries.batch_update():\n", " g_timeseries.data[0].x = times\n", " g_timeseries.data[0].y = Hs0s\n", @@ -512,8 +706,9 @@ " g_timeseries.data[1].y = Tps\n", "\n", " # Update beta values\n", - " idx_betas = [n for n, x in enumerate(\n", - " g_timeseries.data) if 'Beta' in x.name]\n", + " idx_betas = [\n", + " n for n, x in enumerate(g_timeseries.data) if 'Beta' in x.name\n", + " ]\n", " for i, forecast in zip(idx_betas, twls['forecasted']):\n", " df_twl = twls['forecasted'][forecast].query(\n", " \"site_id=='{}'\".format(site_id))\n", @@ -522,26 +717,20 @@ " g_timeseries.data[i].x = times\n", " g_timeseries.data[i].y = beta\n", "\n", - " # Update water levels plot\n", - " df_tide_site = df_tides.query(\"site_id=='{}'\".format(site_id))\n", - " mask = (df_tide_site.index.get_level_values('datetime') >= min(times)) & (\n", - " df_tide_site.index.get_level_values('datetime') <= max(times))\n", - " df_tide_site = df_tide_site.loc[mask]\n", - "\n", - " with g_timeseries.batch_update():\n", " g_timeseries.data[2].x = [min(times), max(times)]\n", " g_timeseries.data[3].x = [min(times), max(times)]\n", " g_timeseries.data[4].x = df_tide_site.index.get_level_values(\n", " 'datetime')\n", - " g_timeseries.data[2].y = dune_crest_z.tolist()[0], dune_crest_z.tolist()[\n", - " 0],\n", + " g_timeseries.data[2].y = dune_crest_z.tolist()[\n", + " 0], dune_crest_z.tolist()[0],\n", " g_timeseries.data[3].y = dune_toe_z.tolist()[0], dune_toe_z.tolist()[\n", " 0],\n", " g_timeseries.data[4].y = df_tide_site.tide.tolist()\n", "\n", " # Update rhigh values\n", - " idx_betas = [n for n, x in enumerate(\n", - " g_timeseries.data) if 'R_high' in x.name]\n", + " idx_betas = [\n", + " n for n, x in enumerate(g_timeseries.data) if 'R_high' in x.name\n", + " ]\n", " for i, forecast in zip(idx_betas, twls['forecasted']):\n", " df_twl = twls['forecasted'][forecast].query(\n", " \"site_id=='{}'\".format(site_id))\n", @@ -551,15 +740,18 @@ " g_timeseries.data[i].y = R_high\n", "\n", " # Update site id impacts\n", - " observed_regime = impacts['observed'].query(\"site_id=='{}'\".format(site_id)).storm_regime.values[0]\n", - " site_id_impacts.value = \"Observed: {}
\".format(observed_regime)\n", - " \n", + " observed_regime = impacts['observed'].query(\n", + " \"site_id=='{}'\".format(site_id)).storm_regime.values[0]\n", + " site_id_impacts.value = \"Observed: {}
\".format(\n", + " observed_regime)\n", + "\n", " for forecast in impacts['forecasted']:\n", - " regime = impacts['forecasted'][forecast].query(\"site_id=='{}'\".format(site_id)).storm_regime.values[0]\n", - " site_id_impacts.value += '{}: {}
'.format(forecast, regime)\n", - " \n", - " # Update our tables\n", - " \n", + " regime = impacts['forecasted'][forecast].query(\n", + " \"site_id=='{}'\".format(site_id)).storm_regime.values[0]\n", + " site_id_impacts.value += '{}: {}
'.format(\n", + " forecast, regime)\n", + "\n", + "\n", "site_id_select.observe(update_profile, names=\"value\")\n", "\n", "\n", @@ -567,12 +759,13 @@ "\n", " # Iterate through each box, only keeping site_ids which are not filtered out by each box\n", " valid_site_ids = impacts['observed'].index.tolist()\n", - " dfs = [impacts['observed']] + [impacts['forecasted'][key]\n", - " for key in impacts['forecasted']]\n", + " dfs = [impacts['observed']\n", + " ] + [impacts['forecasted'][key] for key in impacts['forecasted']]\n", "\n", " for box, df in zip(selectboxes, dfs):\n", - " valid_site_ids = list(set(valid_site_ids).intersection(\n", - " set(df[df.storm_regime.isin(box.value)].index.tolist())))\n", + " valid_site_ids = list(\n", + " set(valid_site_ids).intersection(\n", + " set(df[df.storm_regime.isin(box.value)].index.tolist())))\n", " site_id_select.options = sorted(valid_site_ids)\n", "\n", " # TODO Update options in selectboxes with number of observations?\n", @@ -582,42 +775,465 @@ "for box in selectboxes:\n", " box.observe(update_filter, names=\"value\")\n", "\n", - " \n", - "\n", - "\n", "# Display our widgets!\n", - "widgets.VBox([filter_container, site_id_container,\n", - " widgets.HBox([g_profiles, g_map]), g_timeseries, tables_container])\n", - "\n" + "widgets.VBox([\n", + " filter_container, site_id_container,\n", + " widgets.HBox([g_profiles, g_map]), g_timeseries, tables_container\n", + "])" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": { "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.837Z" + "end_time": "2018-11-22T22:52:36.039701Z", + "start_time": "2018-11-22T22:52:36.035189Z" }, "scrolled": true }, - "outputs": [], "source": [ - "titles[0].observe" + "This visualization looks at how well the storm impact predictions performed. " + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "metadata": { + "ExecuteTime": { + "end_time": "2018-11-23T01:57:05.476410Z", + "start_time": "2018-11-23T01:57:04.925795Z" + }, + "code_folding": [], + "hide_input": false, + "scrolled": false + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1dfce0ba4b744e9190093562d5c339d3", + "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': 'da32f419-5d2d-4e09-af0f-eed69182a269',\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': 200,\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': 'da440529-b797-40e9-abc3-f0485d6df152',\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': 200,\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", + "})))))))" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create colorscale\n", + "rdylgr_cmap = matplotlib.cm.get_cmap('RdYlGn')\n", + "\n", + "norm = matplotlib.colors.Normalize(vmin=0, vmax=255)\n", + "\n", + "def matplotlib_to_plotly(cmap, pl_entries):\n", + " h = 1.0/(pl_entries-1)\n", + " pl_colorscale = []\n", + "\n", + " for k in range(pl_entries):\n", + " C = list(map(np.uint8, np.array(cmap(k*h)[:3])*255))\n", + " pl_colorscale.append([k*h, 'rgb'+str((C[0], C[1], C[2]))])\n", + "\n", + " return pl_colorscale\n", + "rdylgr = matplotlib_to_plotly(magma_cmap, 255)\n", + "\n", + "\n", + "\n", + "# Create widget for list of beaches.\n", + "beaches = df_sites.beach.unique().tolist()\n", + "\n", + "beach_title = widgets.HTML(value=\"Filter by beach:\", )\n", + "\n", + "beach_select = widgets.SelectMultiple(\n", + " options=beaches, value=beaches, disabled=False)\n", + "\n", + "beach_container = widgets.VBox([beach_title, beach_select])\n", + "\n", + "# Create confusion matrix for each forecasted impact data set\n", + "heatmaps = []\n", + "for forecast in impacts['forecasted']:\n", + "\n", + " z = [[.1, .3, .5, 2], [1.0, .8, .6, 1], [1.4, .28, 1.6, .21],\n", + " [.6, .4, .2, 3]]\n", + "\n", + " x = ['swash', 'collision', 'overwash', 'inundation']\n", + " y = list(reversed(x))\n", + "\n", + " z_text = z\n", + "\n", + " fig = ff.create_annotated_heatmap(z, x=x, y=y, annotation_text=z_text, colorscale=rdylgr)\n", + " heatmap = go.FigureWidget(data=fig.data, layout=fig.layout)\n", + "\n", + " heatmap.layout.update(\n", + " height=200, margin=go.layout.Margin(l=100, r=100, b=40, t=40, pad=0))\n", + " heatmap.layout.xaxis.update(title='Predicted')\n", + " heatmap.layout.yaxis.update(title='Observed')\n", + " heatmap_title = widgets.HTML(value=\"{}\".format(forecast) )\n", + " heatmaps.append(widgets.VBox([heatmap_title, heatmap]))\n", + "\n", + " \n", + "def update_heatmaps(change):\n", + " \n", + " for forecast, heatmap in zip(impacts['forecasted'], heatmaps):\n", + " selected_site_ids = df_sites[df_sites.beach.isin(beach_select.value)].index.tolist()\n", + "\n", + " df_ob = impacts['observed']\n", + " df_fo = impacts['forecasted'][forecast]\n", + "\n", + " observed_regimes = df_ob[df_ob.index.isin(selected_site_ids)].storm_regime.dropna().rename(\"observed_regime\")\n", + " forecasted_regimes = df_fo[df_fo.index.isin(selected_site_ids)].storm_regime.dropna().rename(\"forecasted_regime\")\n", + "\n", + " if any([observed_regimes.empty, forecasted_regimes.empty]):\n", + " return\n", + " \n", + " df_compare = pd.concat([observed_regimes, forecasted_regimes], axis='columns', names=['a','b'], sort=True)\n", + " df_compare.dropna(axis='index',inplace=True)\n", + "\n", + " z = confusion_matrix(df_compare.observed_regime.tolist(), df_compare.forecasted_regime.tolist(), labels = ['swash','collision','overwash','inundation'])\n", + " z = np.flip(z,axis=0)\n", + " z_list = list(reversed(z.tolist()))\n", + " \n", + " # Make incorrect values negative, so they get assigned a different color.\n", + " # Better for visualization\n", + " z_neg_incorrect = np.flip(np.identity(4),axis=0)\n", + " z_neg_incorrect[z_neg_incorrect==0]= -1\n", + " z_neg_incorrect = (z * z_neg_incorrect).tolist()\n", + " \n", + " fig = ff.create_annotated_heatmap(z_neg_incorrect, x=x, y=y, annotation_text=z)\n", + " heatmap.children[1].data[0].z = z_neg_incorrect\n", + " heatmap.children[1].layout.annotations = fig.layout.annotations\n", + "\n", + "# Hook changes to beach filter to update confusion heatmaps\n", + "beach_select.observe(update_heatmaps, names=\"value\")\n", + "\n", + "# Display our widgets\n", + "widgets.VBox([beach_container, widgets.VBox(heatmaps)])" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 224, "metadata": { "ExecuteTime": { - "start_time": "2018-11-22T22:48:17.840Z" + "end_time": "2018-11-23T01:32:36.864786Z", + "start_time": "2018-11-23T01:32:36.833701Z" } }, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[[-0.0, -0.0, -0.0, 0.0],\n", + " [-0.0, -0.0, 0.0, -0.0],\n", + " [-11.0, 9.0, -0.0, -0.0],\n", + " [12.0, -0.0, -2.0, -0.0]]" + ] + }, + "execution_count": 224, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# impacts['observed'].query(\"site_id=='{}'\".format(\"NARRA0018\")).T\n", - "impacts['forecasted']['foreshore_slope_sto06'].query(\"site_id=='{}'\".format(\"NARRA0018\")).T\n", - "\n" + "selected_site_ids = df_sites[df_sites.beach.isin(beach_select.value)].index.tolist()\n", + "\n", + "df_ob = impacts['observed']\n", + "df_fo = impacts['forecasted']['foreshore_slope_sto06']\n", + "\n", + "observed_regimes = df_ob[df_ob.index.isin(selected_site_ids)].storm_regime.dropna().rename(\"observed_regime\")\n", + "forecasted_regimes = df_fo[df_fo.index.isin(selected_site_ids)].storm_regime.dropna().rename(\"forecasted_regime\")\n", + "\n", + "df_compare = pd.concat([observed_regimes, forecasted_regimes], axis='columns', names=['a','b'], sort=True)\n", + "df_compare.dropna(axis='index',inplace=True)\n", + "\n", + "z = confusion_matrix(df_compare.observed_regime.tolist(), df_compare.forecasted_regime.tolist(), labels = ['swash','collision','overwash','inundation'])\n", + "z = np.flip(z,axis=0)\n", + "z_list = list(reversed(z.tolist()))\n", + "\n", + "# Make incorrect values negative, so they get assigned a different color.\n", + "# Better for visualization\n", + "z_neg_incorrect = np.flip(np.identity(4),axis=0)\n", + "z_neg_incorrect[z_neg_incorrect==0]= -1\n", + "z_neg_incorrect = (z * z_neg_incorrect).tolist()\n", + "z_neg_incorrect" ] } ], From 2cfe20606d3db44e00f1a8aa6ab1716a460436b8 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 26 Nov 2018 09:55:33 +1100 Subject: [PATCH 32/65] Update README.md, notebook and qgis --- README.md | 65 ++++++++-------------- notebooks/01_exploration.ipynb | 97 ++++++++++++++------------------- notebooks/qgis.qgz | Bin 12721 -> 22181 bytes 3 files changed, 65 insertions(+), 97 deletions(-) diff --git a/README.md b/README.md index 261f86b..341ff13 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,47 @@ # 2016 Narrabeen Storm EWS Performance -This repository investigates whether the storm impacts (i.e. Sallenger, 2000) of the June 2016 Narrabeen Storm could -have been forecasted in advance. +This repository investigates whether the storm impacts (i.e. Sallenger, 2000) f the June 2016 Narrabeen Storm could have been forecasted in advance. ## Repository and analysis format This repository follows the [Cookiecutter Data Science](https://drivendata.github.io/cookiecutter-data-science/) -structure where possible. The analysis is done in python (look at the `/src/` folder) with some interactive, -exploratory notebooks located at `/notebooks`. +structure where possible. The analysis is done in python (look at the `/src/` folder) with some interactive,exploratory notebooks located at `/notebooks`. -Development is conducted using a [gitflow](https://www.atlassian -.com/git/tutorials/comparing-workflows/gitflow-workflow) approach - mainly the `master` branch stores the official -release history and the `develop` branch serves as an integration branch for features. Other `hotfix` and `feature` -branches should be created and merged as necessary. +Development is conducted using a [gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) approach. The `master` branch stores the officialrelease history and the `develop` branch serves as an integration branch for features. Other `hotfix` and `feature` branches should be created and merged as necessary. ## Where to start? Check .env Uses pipenv 1. Clone this repository. 2. Pull data from WRL coastal J drive with `make pull-data` -3. Check out jupyter notebook `./notebooks/01_exploration.ipynb` which has an example of how to import the data and -some interactive widgets. +3. Check out jupyter notebook `./notebooks/01_exploration.ipynb` which has an example of how to import the data and some interactive widgets. ## Requirements The following requirements are needed to run various bits: -- [Python 3.6+](https://conda.io/docs/user-guide/install/windows.html): Used for processing and analysing data. -Jupyter notebooks are used for exploratory analyis and communication. -- [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and -extracting dune crests/toes -- [rclone](https://rclone.org/downloads/): Data is not tracked by this repository, but is backed up to a remote -Chris Leaman working directory located on the WRL coastal drive. Rclone is used to sync local and remote copies. -Ensure rclone.exe is located on your `PATH` environment. -- [gnuMake](http://gnuwin32.sourceforge.net/packages/make.htm): A list of commands for processing data is provided in - the `./Makefile`. Use gnuMake to launch these commands. Ensure make.exe is located on your `PATH` environment. +- [Python 3.6+](https://conda.io/docs/user-guide/install/windows.html): Used for processing and analysing data. Jupyter notebooks are used for exploratory analyis and communication. +- [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and extracting dune crests/toes +- [rclone](https://rclone.org/downloads/): Data is not tracked by this repository, but is backed up to a remote Chris Leaman working directory located on the WRL coastal drive. Rclone is used to sync local and remote copies. Ensure rclone.exe is located on your `PATH` environment. +- [gnuMake](http://gnuwin32.sourceforge.net/packages/make.htm): A list of commands for processing data is provided in the `./Makefile`. Use gnuMake to launch these commands. Ensure make.exe is located on your `PATH` environment. ## Available data -Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the -repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can +Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can use to push/pull to, using rclone. In order to get the data, run `make pull-data`. List of data: -- `/data/raw/processed_shorelines`: This data was recieved from Tom Beuzen in October 2018. It consists of pre/post -storm profiles at every 100 m sections along beaches ranging from Dee Why to Nambucca . Profiles are based on raw -aerial LIDAR and were processed by Mitch Harley. Tides and waves (10 m contour and reverse shoaled deepwater) for -each individual 100 m section is also provided. -- `/data/raw/raw_lidar`: This is the raw pre/post storm aerial LIDAR which was taken for the June 2016 storm. `.las` -files are the raw files which have been processed into `.tiff` files using `PDAL`. Note that these files have not -been corrected for systematic errors, so actual elevations should be taken from the `processed_shorelines` folder. -Obtained November 2018 from Mitch Harley from the black external HDD labeled "UNSW LIDAR". -- `/data/raw/profile_features`: Dune toe and crest locations based on prestorm LIDAR. Refer to `/notebooks/qgis.qgz` -as this shows how they were manually extracted. Note that the shapefiles only show the location (lat/lon) of the dune - crest and toe. For actual elevations, these locations need to related to the processed shorelines. +- `/data/raw/processed_shorelines`: This data was recieved from Tom Beuzen in October 2018. It consists of pre/poststorm profiles at every 100 m sections along beaches ranging from Dee Why to Nambucca . Profiles are based on raw +aerial LIDAR and were processed by Mitch Harley. Tides and waves (10 m contour and reverse shoaled deepwater) for each individual 100 m section is also provided. +- `/data/raw/raw_lidar`: This is the raw pre/post storm aerial LIDAR which was taken for the June 2016 storm. `.las` files are the raw files which have been processed into `.tiff` files using `PDAL`. Note that these files have not +been corrected for systematic errors, so actual elevations should be taken from the `processed_shorelines` folder. Obtained November 2018 from Mitch Harley from the black external HDD labeled "UNSW LIDAR". +- `/data/raw/profile_features`: Dune toe and crest locations based on prestorm LIDAR. Refer to `/notebooks/qgis.qgz` as this shows how they were manually extracted. Note that the shapefiles only show the location (lat/lon) of the dune crest and toe. For actual elevations, these locations need to related to the processed shorelines. ## Notebooks -- `/notebooks/01_exploration.ipynb`: Shows how to import processed shorelines, waves and tides. An interactive widget - plots the location and cross sections. -- `/notebooks/qgis.qgz`: A QGIS file which is used to explore the aerial LIDAR data in `/data/raw/raw_lidar`. By -examining the pre-strom lidar, dune crest and dune toe lines are manually extracted. These are stored in the -`/data/profile_features/`. +- `/notebooks/01_exploration.ipynb`: Shows how to import processed shorelines, waves and tides. An interactive widget plots the location and cross sections. +- `/notebooks/qgis.qgz`: A QGIS file which is used to explore the aerial LIDAR data in `/data/raw/raw_lidar`. Byexamining the pre-strom lidar, dune crest and dune toe lines are manually extracted. These are stored in the `/data/profile_features/`. ## TODO -- [ ] Setup precomit hook for automatic code formatting using [black](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/). -- [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. -- [ ] Estimate max TWL from elevation where pre storm and post storm profiles are the same. - [ ] Mitch updated the raw profiles.mat to include more information about the survey time. Our data scripts should be updated to parse this new information and include it in our dataframes. -- [ ] Implement (bayesian change detection algorithm)[https://github.com/hildensia/bayesian_changepoint_detection] to help detect dune crests and toes from profiles -- [ ] Implement dune impact calculations \ No newline at end of file +- [ ] Setup precomit hook for automatic code formatting using [black](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/). Low priority as can run black using the command `make format`. +- [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. +- [ ] 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. +- [ ] Investigate using [modin](https://github.com/modin-project/modin) to help speed up analysis. \ No newline at end of file diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 18c5b6f..03189fd 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -13,8 +13,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2018-11-22T22:48:17.973982Z", - "start_time": "2018-11-22T22:48:17.825797Z" + "end_time": "2018-11-25T21:56:41.533322Z", + "start_time": "2018-11-25T21:56:41.362045Z" } }, "outputs": [], @@ -29,11 +29,11 @@ }, { "cell_type": "code", - "execution_count": 232, + "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2018-11-23T01:45:39.791501Z", - "start_time": "2018-11-23T01:45:39.780471Z" + "end_time": "2018-11-25T21:57:10.456785Z", + "start_time": "2018-11-25T21:56:41.534324Z" }, "scrolled": true }, @@ -70,11 +70,11 @@ }, { "cell_type": "code", - "execution_count": 273, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2018-11-23T02:59:30.467706Z", - "start_time": "2018-11-23T02:59:17.099702Z" + "end_time": "2018-11-25T21:57:33.969096Z", + "start_time": "2018-11-25T21:57:10.456785Z" }, "pixiedust": { "displayParams": {} @@ -130,11 +130,11 @@ }, { "cell_type": "code", - "execution_count": 276, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2018-11-23T03:07:46.410476Z", - "start_time": "2018-11-23T03:07:43.154124Z" + "end_time": "2018-11-25T22:27:09.754717Z", + "start_time": "2018-11-25T22:27:06.633214Z" }, "code_folding": [ 408 @@ -146,7 +146,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "cc4ab9cdf0cb422f8870d6ba906e538a", + "model_id": "9bf50bbca81147ee9d37120a32bed4ea", "version_major": 2, "version_minor": 0 }, @@ -166,45 +166,45 @@ "

\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), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('collision', 'swash', 'overwash'), value=('collision', 'swash', 'overwash')))))))), HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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", + "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), options=('swash', 'collision', 'overwash'), value=('swash', 'collision', 'overwash')))))))), HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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': '2618ab16-1e96-4273-8141-bd4b6bdc9c83',\n", + " 'uid': 'c8ea5f67-a68e-492f-a718-c6d2b6a1a3ab',\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': '3872fe91-a2e2-4762-aa61-c0e01b271cdd',\n", + " 'uid': 'ac860cf0-1e87-4a16-b5a1-ef914032c675',\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': '93c17c28-b6f2-4c12-8a4b-b7683362ece4',\n", + " 'uid': '6d629f5f-ecdb-4a38-b5da-9390e53902c4',\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': '9b2cb05f-3f32-4a07-84fb-24e79e745a47',\n", + " 'uid': '7caff243-2d24-4b71-9eea-a037a121f7ff',\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': '1f12592c-7294-4735-8bda-b9bdf30f32c4',\n", + " 'uid': '0797ed89-9dd1-4b71-bbb9-dde65ce0e010',\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': '711f34f8-0dd7-4d38-9bcc-67636d7ed2a5',\n", + " 'uid': '6db4b49a-049d-4182-b307-f14deeb8af01',\n", " 'x': [0],\n", " 'y': [0]}],\n", " 'layout': {'height': 300,\n", @@ -233,7 +233,7 @@ " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", " 'WAMBE0027'], dtype='~b@m|3f2mg09PXsl14KEZ#QkoS^9Z=rTvQTy}>VGjzt^68VKxur9cqq*}% z&zajsdm7VA*BzGCljfH7MH1znygFh0g)UvH^WIl_H@dAZNi@``5F1yQn+3{9>-cw} zBhH!R3xt4TsVEjQ>eL~oV((OO^o*g0!JJ>=kwyM~FE8WI{@tF-ucO1JK<~TDn@L;+ zufJ{``Uda(gfnTDyi&MLgk%WHiP9~b9>Gc)>aY+f|T*x7-Zx>pB61%owKSz52s2j@V}poiQx{9j`l`d zUglp<1}Td3xb6_d@*e!MsMm&_l4^+GXP?b@FW&D@2DSb4MgNe`kWxsB-o29p=*#EM zGeTquQKqjhvL~WtxK(#4`M-HPKfamY@uJa^n>wX3QEOEC#qS6To`p68&U>`R0yrU+qCfmQIZ6;b$c&;kc8-hja>=B2SuAq?f6> zwbV|WQ-j&_-nVyZY_q11$DfGqWvKUr?kqajr+mQL}%%;fE>| zYM%8(*(-Ca1w`T_v8GuH4S0x2a+hjGaVHs}n`2C9W|ib5?q{nDE2{QSxOAHBQs1@c z%A1M4cUBeiDo-imAjmgz?{Y`bN{jR3!+e!T5Xp&?Fya_7P#w|saGmQwu5BAH+XjC` z6}J6SA(r1{wQ?0o&U^a0?R@sP_-%a-OVN1zPN$WLgF+6fi^TLu&dzypwb%sev2Z5v z`*f$6w`F+ZFwiW1?R{dE4}OGz`5RppFg>{&8wqzd?qO3Swsm4BOG1&7kPxpFBa%6S z1*60-gBL%VfiX3N7s*l%R5T~jg4-rh3C6%~s}q*mR1a3zJVjF;72D%LR>7IPfgetZ zOXfC8`DB)y5(i_F6j`V4-x_%F4GX8r^-R-(z{9|kqkv#N3630<1{ARf=D2TN#>45EvG|!cQmTcL$(~YG3?eS>le)Ph~5114c7*s>Hi&HJV z6FxqT^ni?5C|VeT;gHg~zMmM8k`dS32_Q$QAsTqfJLgo$dTDNmvmD6<8F93# zC*E`*CGOl(Bsfk_m2x3@yHv|UJjA4A$fry=Abryi15JLxVTGF{CVWMvl)H}KDFc5{ zaidT2i*!;^GI6~&3a*P5g*tg$&BHr+JaZyhF)+rBQFCcZW1t;5!aAraB4srvJn-j9 z`T#wN<4#`ruM2LTu84b9dLwUt$ALfQzaq`5C`!^|k*T|k-)XYs=wpfJ= zn_}v~C`2r6vp8WSh9(X^x;nGuf5?n1%Ghnt}F$ zP@f^>HOweatKW-bGi(bCD zls8syqhP9t{virJwJv zRxNuinEyI9CN=G!qJbuSvTC#$$Bv?hhgBc_dWadR*IIcN4^EZFBVSfb-5wl}dziJ( z^3TrbpO5bzu3n6qa=s}ex2OL6RWtuv1ZhdEJ^pO>-mBvU$+@r!QhO|1Wvo zz+#JMCznEBcG=FZG}60onvY*d@Y|E=2TglLR|eZqDKaa8qY$nL$TSDxn35x!LWKK1 ziGc`#l~^?Y#e|zcVqw=9A$2?X&Xj{wv>c0DYjW-8qeB4yG=!7(@-3xx$v~cCRiX0i z(K~you2Ex;$z%4xYt(Di`OHDEqL!fZRoZpS%s#o3Sz(H9Fw)Atl0m#0C&i0UvAN)=|b(PitjkYtso zlPhPY0b%XF7mB~ehBW-4w}AB-Ni?nMx~|+EJl5Ye@?e8&(ZpI;Xt@;KFHyHfWG;M( zL~@5~&>YcnY@Cb6&plyGNpKovBGydEART{S|DPAvXMP?eL1!zk_rx)aL4g9@4U}bXl2%FYNMj%u7ei%g9{*79!$S8&4^5aoI*(vugY76L3cMMRnHCvze1t09B^ zk<2{2j@g5lZQS1)Rv@C5DX{43YaWbZ0&`(tF|n-aT+=IHj_0*d`JMlW=nJK6AJVD7 zx%~vjhDYG&+VST;ng{;cv>~&O9>@Ox zOI&?&hHM>VeJ$X+{>v1vQ?hj7#Htpdf?3Iiy?o)3stWgRh2-Ftg2tIQn50c=X>q>S zbVgB5$*jTn)t23{DvLhOa5J~F3)uYhV9hMpV^r1F{br!)c(_ZywE5B0>Ya-%+|p8< zdt<-@)5r{~I-F9*e-7O29B!nq7`WOj8{hPn8vPRM>m|=8e8cr_KKl(z^<_?j`;pbg z)W6MNYxH2H!qc}EG&ypPrg}9qD&AYZtuxYQE2ReC`s#MbY_V~w70;YCYR8%GyOp-} zbUpS&pajGue=1(ijnDCU(q1`|xsRp;;zwN3yY{R_yJC+*`G)?J0ZxGe(pR z-#6o!;?05UmQUG%%h-LjmU0!2c{n$|A`~Y08IMptX0yTXE)})Fr!P(=kKuX#Req%* zfp6KdcSJb(YQ_2%^Q)j&{&>9qCatS$z9`ww7`_GHv*T#khV5*s&*+yPC&T^lQL{74 z_^z-C1DB}%SJ$*RkFoe|1?^e4%?2i?vtWvyI(Hj|khf!^;ydn9qB91A1D~;{Gw#%2 z5^q~3zdJt@ffh%&m+!7^_t9~|K7D?T0!IzA+wW}vI0kc$OHJzMq(zdQ;`sK9NqYqs zA6F}R(A-FFLB{4@!bmzMRa8LG@gD-y8`}F?#)k%EG6ieD_?D%hX_yw)R|^M{Egi2S^QmY#3TB5zv8%J%GdW9{88EoXEHcnvu0J8+l=~a9884U` z+L*M-_pS5zRG^y?j{TPn~OOAVO2e z?JmC@$#d({y)%DSWJGC6b`jkD(X464OkHK=OHZ;nVcYhslU7dIScqOlwyoZob6;bi z@usISo^=tj2z%ht1dhgEd|A`u@vh#X#Wf8c{gM_>fT#0!ZRSR?GFF8#X~jx}jSlIY z+Sd}|V;;$Xb;GzU8o5J@V7`~P69f+ZIf6&|{QP^>Wp6q)ddKEeUPSTUM4t5#BA}}y zrn`&6V|l1xWiWlQ5#CIvO74W~&rVIsXXsyFUbdm<2+&sh|Bws@+w4ZgLv3V>MV2A(eds6&bbgom~&# zl4mOT0p3oFj4m3MC!&F0<5fPYd;hj)6nm|n^Z@}TpKvl1Dm9CFe=%grl5M`#^lCA= zBtGQJm|S9=TJUE2m*<`neeY1tSN5mlIPmNoGwf9-q4!fiwbCN#To%?tJxklwLY*u4 z;ea#9zDkt6F~7z|Lom3&3#l_|IQq$kAP5lOyLD5hiv4=sgetU^!AWX6leuAbToK#= z=e6F;ba=Hh9lw9)dINI4nRpvB?98jmCRTsRK@t1Y(`|0V*SLRf1%czzL@w;DZOWJR zV3o@NG-UVBwoe@?;?-z+2DmlWwY7$kii2mZoxjKq2b4>t1$j~3hCV4(u6}B8t z%j7XGYP{qkmiu%v30G7OD-}FEs1na4@%(;iOt(w3BKL4f$m|lT#1W#9>o=aIQ1AVL z(aU&I%%z1Vu$JQ!z)*gxD*uyK!&IdLvhF@H!G%>XKsi^ojwyMRx3a-B3G4oc#h`F8 z&gPT6Aj(@OqvDp{iP-%F@oZ{N=4tHFVDj4Jlc)p&$t;ye=LPcA+cNAjfJh5cJ zHX?9{7;*hAgJ}4>E}e5~I|He6kcVJk}eprT_0==2tieK z8dau4aTX96HJay=IdV|+l*N~0GF)HOj;|%?D#SA{gx{p27>pSY$f$kCkjcg63pluc zq6r5DC?wUxn{gmsi{d4jBlqcrACTKzpJXoaV6G}W*W|CMYhzp`4!qu6Uo)L6_ux}+HTzA&wyKDFq3D2Yg&B(hrN zf+`CFX@dwPhD83Hv)U)c2c~1L2&}c;(h5=nDMh_Ke%)01 zg%$=?xjAy(cg#wZL@P(#38gioO8)|MD-`VK`IcZc4RMUxdyhrULPT{GEeSvip>PfK zH4}}Mr0Z^gpcq6kn#_(}ov_xf^Tft+j6TzhDW)&$H`zcw3V6< zbYc6!1b6*0G}m{2F+y^YE2CkW`4(AX5wug2awu&d4FIoKM8S^9vDyK*l5c_}TK`9w z!!mP~;6l%J;S1F=s2zUg;sL!%xO$@)9>5)_=B|A8(=9;NObvC9uWl*w&o;-GaoSH8 zLWvyBwFQdl2g##F!TyCDLNUZxh=gKTgjO62{_s}Mrh2vOq1LIB!3ibU9TABMPUm#E zn9;frxe==S#y`b=>iU%F{&DHrL|><_90M8`e&`*9sds!K(Kra=Mz?C*VoZ0+)|G{+ z8Urd1>N1?9RIPXS_&Jg%Md|AK;Vs5JhgLS;!=aPXJGr`jaj!7|a@9Cx^8VFJt!l)_ zSn;C@5oaRP(j>wK8exRwI*D$y2WXLFVRv-$8B(Z6$af@`_>E_T8MXY)!YT5EaUW|z z=1NlfV#f#dC4_9WQ#*ym&T1l>xZGk9W zvXOdX)tNfC8=ElW*(J+{D*2+mv6dPrkb_JG; z8@rsUjaL$S3yeUak61g&^*Irm4k2=Je=h3OMd7Lqoe*p;oW&XDH_E zfVCm)&(Z9M4YN{Bw*JZ+)KSAOq*0Cxn-v@jA}s?cHTKo9OXbnaz%&{ovZ@K7AqakN36+aOT0}W9 z8_5OA(F!h`CDBMR(VDjkY~HOtk%GMPebRKrF+qub6`kwz&vg>y)pk@i`qc!R6h!Sr z>t7=nQx$qmyOxUcE)@_2d+>)#h+GU(v6v) zBE~B>qp;_BRx_|i5%%f~niK-~YDWf|e9?jO2lo42dfqPPsum~d481HvCpA@X8C z)pTbWjC!>M$^|ursGb2;%PBJ0=~rWd7zRO6y6hH2a9^5&rfDWeGBozH&UsPU%wV!P z65-YEst#C>K7K$EC=#$n(K(^4atHA=1;v^sE$=T^TP^(a&oTM>WrEJ>JLMG26!l$$ zxD6G|_Dm|>HtIud!;HZWx5W+#%|Nt3(M0yVlapgd-Xu`Qw!6xrXD@u4f3?@1p^QY& zZeM2p`2H}EwtwIK*@qUp2gL|419x)Yt3*@N%(`$jDnQfRdTe6&hICcCEg2l z7slPQ7m&{IgjKai>Z=KTc~OOKWvtO~(PI2Mh`iRWR}HWdC!tbKma5Yd-RJ9}c)6&i z<@l7)E5Tao)j~`V_XRS7dcxm;&o`ExY$%|Kbm6bZuLNy~M)Xyhelk1UZ3#mV242O* zfPHDbFXQZp_w`ziUF}=ZxUF91wJc!Ph!G5 z{!g*RUQ0kkdOqYD9O0E6+E{Z#W`Q}VU#o|`` z+ED43ZO#pZx%|J7SdbZe+v4%53!s;zDHLsBF7mRJoUYq(6AK5d&_Dtuu9=zxyCsK5 zS*DYhnxCDDka-mwFP4AfB606-b1YqI1 z$y?@LQaK$^xrjO%soCMX0E|)y_R2XB_@0{N-7!0yK;;~v>IbF5?ntptqC}~sb2A8a zi(4W^n~IVnvKAV4r!H+Q8g_)4DurqtmUCMJIlKE{1{7dGCxadk$E#uiHX73ApvX=s zRi>Nmv`E?=`hSdifQ<&{bY;qQSfXza=yo`&W|3FLfpx??;s$wP)>E=!L5yq@a>wNy z;$SEGJ))fsMwBe0{yEqU&X{QzmhaGLh9kRITHMzfb_pqM^S-EHJ!-7 z0S_ecC8qA!8!AW{&#vnYmhH#xuzhQm?biIaxR^FuDt^#3`}QRbXj-NJ5*OR%k86cu zp4vUAJ}LxWM@u|>Y%%JRy5@Me>dxGLr`yldsrIt^_1h9T`HSog&A|JZxEFg*Jk$%Q zKAL552%F)BhM^r!*3nrpf>WHljE{y6azPc^lpCdO=T)$oF^rC6asya5$iz;F0^M}E z8zZ^lN=($?+_%{(z`JLe8aLNN6V3SZa|$JewqEg7QYd8f7V6)Hi(4kd?zPM5M|+Fb zqKJy^$*EhH08#v3t1aN%3C5zpPRTUaZ<&@7x-HsHpme1Cm+en`uC=~5rL0_#0LNOA zBeTC6Tq6pu$o6qvS)kC*e{K9Sr&M@0YLKKV;pT71AOw&QN=x3=fdUhDf7YNezoBDs zPy%uWBA0b(^kK3>Z>sAT|g#1W>bFDfId-Hl7-e8W~h!YNh z{W@VA^C{HIK5^|LoyIVDY~HV*%o5kO!GOgU(^uz}@+Udf=Q5*=M$I@$no^gXA%vo@ z^3c*Jnk-bAf3zQwe6IL5m=mDv`#fHUUze|YIlD6teXTuq@VDDW@@;Xux9VVT2!8uP zZT=gyN4e4&d|m!?_h*?@K8~}KxmsvxJQ>)*eD-?EK3R4VKqp*DoQyiIL z?vl?M&)F$U`2LfGlE>M18T@Uwh%Z*nuaDX2d>!MY&jrW50wH`Iqok#GZj0p!$r{L& z)RODI2Jofw+brdo6Jl++xBzB6m)}bzCjn&CSGY@4=%`P!?HxS@uoGQ9`S5L%xfXF9 zZI7i34$i`yTyEae@a;wJNCLYq-Yvi4kAZt`bpLE#GK^cfVIE1Rlvdayz-m z6}leUd8TlCmi(6Jx^R;l2uTJY+TG9DX%Is4cozMZFgSO6_^eFLjOFt?NR4obj`|2w z_sqb^#oL@%t_)LtA}p7>8)PH0VX`GpCAEKS8q^-pgvYXXtSh3!vn9{h?%+g67Q?f! zMO>K7j9@ec3ul18G#(zpaw>4~Sh#!2Hvp482r&}(jiMe&GgLjDnXi|;*>d~BIZz_* z8+i`Lk;AXZB71n-DOW(a!vjKL&BEnlM2@a-$hwEAQkylx=`q3pgS@ME8a$DJP)2C+ zhIfjEm*1RzexH$0IWW~X6oO%sm8 znl3Pi#o#kR#L&C&D%e|Q0}kLj*H(xTjTNq+4koP4&x{fpq#p@GCcMPMDW7quY119U zZfK+t(nI2U(-1`acAg(?QM(a9a(MOw9+)H9EZZSBR51V}8!BYsjg}vOjtr+*dh}EX zA5kFfS3J57B?a!{xK}?HU?0IPhTirtp1Yy!A~QS;d}%eFWw&axE@;>Y-RO2JblYuf zu@?Ka_rLU|jA5J%Mr#AFe9gNgXzFj=V%w~{^*|T+|Lifc!MR=AU^8ulf_0z_91q5& z7`s~Vus$4ZHbZqpM`!68gjnSyU+N-ab1v02BL^B6h)xXIj#3nn!sw0;g4hOK}#Q(djeiyJ_jdu_zPCtKoxaS}0cRx3k z`BG;0KD*L)7C!Cta_rR8tNl+Kd)dOF@QwxC$=)4(aPaEUeGldD`9M0%-@P&z0?qnk zDD0lB^Xq}@`qPV7*Ttb9s4%|&RoVYzGF4>Sqc1N(Adtsgh$+BJ6LovCSoV`9DC{qH{<9j6u5j~{>kqQONx$Yv9w(C1q<%*a;f zS$5R@h@IYNyLeCG-#Z=piqVrVv60VGH)I&mj|J0*d&kWpD2OXq3j`M-Nr(%Dr>(vl zF6Wz8N&a>2&6M{R^nIxhvpY7NuJAMEJd8>Q;5k#tgtI<oLCt!DT2jZPQC8-9)f^l_8SuxXF(OSR1O0^kfvI65FnhvX*J&5{ zLF8eBZo2>iu0E>o$DSkyl`bpM(ozn{k0{iZVg&Le!3kMfZ{<9oTEy~~ESX>anUX<2D9s<&7j=T0*+yqoUhUMc-v z_RhyQ%#UWf6^yTvS6{zAev9n+XV~tbS&SaW^GvzSilBHz_ZZD^fmX|RYuL3Rs={fqp~{phBpJ;F8xwkuhQq)xH_0<3H|NV) zMuMISwNV+a9%qCIb=?SE>4ZzhQKp-WI_Kfuj^?N;MSnwHBG5=@aFJC^RZWPzty9sI zkve{qZjZPKdM(#}MSw(9Y>Pf-RbJBBLP&%fZH$h5tf>w$`o4(LPtaJ zm%4j8iorO#(xALyC+aryF>z`smfCk60*~eW8&%^c}&+ze?GNo&GL+oheVac4Fre$ONL?bpxDb(HH zP;jTeuGopR2}{&W$PKEob55X?*agREr)G!Enpvd~;I{|zw9o@wccwWs>~42AeBYrR z?{;NlodyY0sjR?pVQ-FQ?I!oB>{8_>hY#;!zdjdC3pjM#nE~tnqXG^vzvWdZ*(Epw zqBng67XKBeW~hx?a{HQf#4Y;vhk)Z(4_`Bh4g{i9Dzm3$-KUSKe+8<>;GlIEChN-q zm6K{#1~@kL2sYF1Fe)^GGx-O>1|wm-RtHnyjk`sg`t_+=-v?sC(k-}X7!7gx^QT7T zFMq1>Uoo#YZT5bdjHPXZhMI$RrqYJjcKljBvrLW!WAmxC=%!uxmssG4Ax;_rsQ}_e zXd4e@1Uz=L-k)iPw#BakoP&nnKMkf7X28gn2GFujCd61~6gws@u#}3#6_O~Y#61>w ztbKcs^RR1;_x_np-Rb%N6*|H$qBUZG5P`*M_AUPZ5Epr@TjTeNht;qE-v&U=@GU8oYc7?5k3`1xGGc%+fal#U~)SnhY&P@9ni&;gpAIe zS2J(L=sA&wI_zwV3&8{fsyZnHt}1IXgw^aDw>=M}4rk^rza?ynptc;LHW}w6wk=pT z%E|1ZIUL9#SYB-(UCjtoyx5wtOyaVWxsnuv*G6E0mIFpl*~-*r;PmdAs;qTa$9{n; z!`3W0jZB3AHM_6S!MK%{=%9Y+YvK|vyQ_-f=hcaWQ5i>@?{UR#ZBN0H6Z zZp%-d&3&nM7bqmZ$%U;neVKb}qgx8w7HiF<5<%F(1glC#qM!~MeZj_Q&W^|A%aZ8|W6LQLvkiRZpT%;cFo#U#&%q~+H!9-Uwd)v&+$tr<$LDb7CHTC` zkPq7hR>Mbi;;8SRb2n})e3M0U;wK2QQCv1`BXeDWg_p1sh5YGE?M5KBIr=N?*zTMw zf~N9~Yu4`Wyp_-M0Ch?Px_N@sy)O?rY^a`0%rX5$3S`Df>Dm|&Y-6t4R}BS4#7nP4FWu;y~|;&G{g3RrVE4pxhgrE3y( zt$KAlD=jvXtkl_x)}c0^n2#h_n~enbfcGRGo%bYkbK4W&bJ{U9sO?Mz!GFJHTsJ2F zS9k~rhFta}^m5zh!7L>(%LU9@0xxfYjkw=Sf8^>kx8mc>Z2u(dUrXv_ ziFtvn{JvwU-&AQHW)IWH`BR&=Is=Nm&}on9`~g3|=F2&h*V_KV*vk+PVwYDJ5jm|3K+pcj_3YN@ulp)f1C75w7T{_2H+`fdeyQo_MjLhnYw{DZWrdi+rA9j}!4S0+6MH{M@OT_3giE5c#pcsyP~ZQkqlIV-7B&wgK@PL zj`D@nGow1WV0{o|-quUA4d|D=pZ4;DAtZ6c*vT){&McO?RTJr~N30GOm91z^P z(F2ep9C+(R!Pj&57(QPU&4Cm3JmDSH0i&wy7R)i`Po)@zQW}!^V^6qB7Ir zXdI5O@VcaA`*Rs8ITn*|$s-tE{Ha5IBbPOnf^TW_i)a+WpXH-40!g=9=fMH69@L?m zX*j;*dIrx<>fT{yR#uZ)M*Abn#uhr5pt^%1+zxuye^p}u&z{v7YD>9Vcs}fMRtsMy zD6TTr?=~*E`WW|PBm)9z#{RP6M2#J0WU*jGz{^@B@nxH7Zjt{81s=3VI zkyaBeoPtN!c&iwnxCxxvV(rb$cY#{AQ}x$~qr0fY<{e-^EC=YtCZCJHZ^TGZAy~^cskFT8`SZuxf)2U#aFeAUDdN$7+4R-*6O?LZR^*ao@z2W z8?HlA?>7xw5JbIDiGWl_?xT9ELqO4uoA9I8WLl9$e`e+u0>blcQ-nU(nq*6uN(`Wt#_l6m49`LlWVSkTRX}V2SIu z!x%VhVT4>n4i3duz6gtjJCwkRUf~+?#A`;fH)(-k!AJssIhxjI3U8=!$2t7+rzD&* zRkw1)BZg^_#G*zmr^us>=_D)(<9<3as07F&yyPbs3wr5{;`SlT)=;43T^}OY{|}*# zzU@H2%Xsetn03GV57Fj5;@-qpVtKvg(2zVtl)JV1xJKXuuz6gYJZtXCU0|UeAm9=! zUVsp9Q^CI!^B6SC?dzs%*`Sv@22VP6TE^BG<@UuqCf~=}KbO_#N@-Ac8;KSV7FzpV z_$%|V zhtBJjFHZsBa7e=G1HsMp$@t(1_-r?HeW#l%gwci8#Jdx_kBiC2TUg)q1MIa^8$+No zpsAq@-v^M?g=E@BmBw{!$J2lXSF6ux^V*8iNihBH!u!%y=w|jk_fq1YM%2!_w@mP5 znzsV2J7ZT*nId&30q2m#sZ@Ef`iOAwm4x$%@Ucut3q}*zW|o1htZrl%*ML>r=NQ<;xy~M#h|t~kooI3YH!vCusQM530o=0=$0!Rb5lVmX4{%K9E&#FlhrQ5b*)?gd0-s|47-2zvGVwI-Ke0t8nzIfYKmrtz_o$k zixD_Zl^~a7n@G%!*rSP9uL2>77&TOmqzPyQG0J32j5N?-I;Rp&Syx+e70;D+glvwe?~cVoP0wh z#~-E;QT}X1Tr|%eS%J=t8Y$$+je{Wli?h_$;{vQH62e6;p z?YWRm-SdCMJCBt8*lB5zu$SnF9Gv+*(iN3W!uD+!f^^DNv)c|?L@pR_=YdE3kbWWx zO2j-tIe4v3JlhH>%uWZSd|*NpIAubE-++zAoTm=#)-K#5_Vd()Y=^LPpZ%vG;b&jW`3A ze0>Vq^TGY%O4)NUEKSa3@R=_MaPd8;%fOL}kjK8$t)pm>tV>~7ZzelQim3Lt$ZFz! zsk?~YmY7l%pp$4p$1k+`4yeDGc(0yK)hTVC!=1DpqrrScKUm$JNp&KJv_GRyS(7fr zC2h}JR?DE+v&Xqbv}x%bV4MdRYkC7q%bw3R$X}fJE!rmxf!nHvEa; z5mTGP=E#vcbt<3!_EJb(N0G)?yAoFp3ws}Mn!bAB`wq0U@2C^p^Dw7wbN+tT4AAG^ z5|5L=4~WkVqv;k0G+TG(;h{jRV7=*n(jW>3q}qm zBPdDmBjLqt=jNt#gKmGO7nD#G54d2T-m=V^?s$kx23%}r@hz-T(C6BXj_UwBFNf~N zPRTu1#tE3}v@S-R6}-DNn%jV4(!>URxsWqMP%C>Jl)_$9z zx>NgJp6|!M4@^;2;xD7BPTQhn^V6P1UKdV(t0nd1Db!g*-f91FWizO=0y?wx1eoa> z%n;IeMj3`v5VK(fdP3R~E1GtwJS3F!jTo_zL*pY&RgrzQJldnJAPePT`y8?d?_xNx z;pq_$9o$L+!=U=T9kN#;B6zgJhCSU85!j+XEE4kru~U@)Ck3GjgE(Pe>z9AOZxkRG ziL`NP)q(fVdrjXtrS`2fpT`VcJs%{S&gk-AwfQ?wjQv>UmV5F^kFwW_o@Qr7PK7cl zQjF+L;y!NPtNpjvbV&WmA}4rlQ! zdU$grfo}0QPLHZCxau+5xwWv=hE*@hjaP(m{*j>bGoP`4mZ`PM;uvkE2@K;1 zC{@>eIWqE5+%`ShVRG3FCbg1)kI8#gZa^;4K3M?9O=dDIYI2Y3)bYz*OP=eUk$0AE z%k@WA!v|{EHz7&ZN}&Jba4grz7FUmS{q*c~gHB&77op%?i)vxkGPHK4-{1-(T_~b^ zW!@&D)zmBgfmNpmCX(>1jx}dfWq%D--}f!Q!BbsLk$c;*y<`SzJ@ahS7f13`1X|#Z z`GIW9%X*4E(O;9s92yTl7?eh*h%$sddTORWa^E?%(Ux0pKvvbc^;t~U>kdWnO50h( z&KM`Mvw;dpE!~<7b@}q2=l+=4Bk{VK<)Hu{HR`idMYw|_ZBcxknzbg=wOz{yA6?II9DN3QIM4>L$`tQ^`D1%_SMFrCTa3zI|ej z8o(!^+DL6EbL#yR%cWJ-W)}FJS*ItHssj4m4W)DU0CNBDYn?V}cbKD>SskXDUTNef z-^t;ob@Q0d0-3gEGI4%PA$BTh{4br#P8_gM7jkPF-qNj*A}bCh8vEqCiYB42fNxv{K;pWU$q}_ z3~i|`d+j{cI6}GD)zhODs8yO)pI?#C)$u5vtr{!G8*i4#OSREL)O#Q?jWXSP^%5+8 z+pdVYywZ-j-ag-2n!69oyM4#p53@z7ALa(`DWs%2Cf22D;6g4<@_!Hb`w$v#)5wLM zhr3Ida&C_9QSaO;gs_u|Ew`=XMwQjjUr8^h##lL%L)k=;S)5Mv{Lb_|MWRFhMguWv zrIsDyDy3iQrl2VTQ(1iyTQxfi>rJ0f;qLVgHdbR zhj{6GZEfjF-O*L85E>g)uW~|7?nXfF%#vsSI!w8Eo>!RaYbEx#mOw=V(4?sM-LMz9 z#n)d-!<7cf*h~DW^G1-XkyssLi)QDVz;{AbLhWdc(UuYlJGVw4H~|+JzO=7$@)X-GFzV8PV`!%~;nI-KN8{qe3&nvcP8gJ>VY0mPT zyKN74z`Lh!X0d0bA+^?+(3(wtSMe!-Z1==!UH2qWPt&8N-U>~Vfvhij`UMY}^|--0Gt>Mo z_STj&^7P3qw^BpQ5_wdczX-K;goC8k4?9* zNTEZ`AlHShXF653MN8SB^N;C(Tkj71GP`6~27&s7I}S}8_1gSpqqysjcONI$YK?v% zn!?&2B^rW>HS>Z^TNPK=lh_m#LPhzdKt@+Vd#Upjlo13p@*vjFWP3ScTr*+32?On& zaD2)$!We~9iA@dqV`|kA9vpHOF;W92S&1}pjjXYlWChC-UrgD$1x!SJ_p)y|mqz(@ z2AeqlhX5(eEGrTVH4nzTALBM~>HHZ&65m65zVYltEue*xc9s>alwk{>7NQS5e!kz|e_O$wl~EctA&a@9 zKEG&cvb7(}M^rMlSE|Y?m(hTK`uuRe*7Vf(G0J6d;7rEU8QQKUs@qa@xpI-;%gy8a zerieS|3iotV@qPMlC~jh^c}W;(Y=mXgUupOM$6P*t17G7s`rrqc2>Xlj{$W_^;< z*X`pom;19yWOM&^qdKQns*h1~U3Ht9l0ALWSp|W-ygMf$MwD_%6x50 zY`2oBK6LC$ynZ=Y9Hri1H2~{B62R3J_Ud1nqdJ`$jrE9l#s)88qAYe4)txqW`ORyq@V4NH!}?veza zPZV_!el{p=8V9;1znYKV2J3#1-G40V-hYGsE5^Fbo4JI&5}a|*y8L9aEoej1m zkux&RA6oWj;vB)18+S9_DxZCYG(7nSZ)#l5<463Em4VH2EEH78!}Q-B-9hnz35eL? z<{68I;#FcocwG~JE#IZD9cs}Zviys>>dvIbkhVRw23^~-?9W^K$nIh_Y#P zmq%BepEeloUkiPN@MKF+xDn zkpiNWfJ$tDbR$T2jdJ8SM19{M-}gPwkF%X;_qpR-`|(`ooJ-%aiv=Rf=?gea^8*Xh zU$z^<<2F?t3#@n$1oQYZdrdEpRd_>TJhTcQbOU)r4_#$8(Tz9Gj?CdX@t3=DGvf%f z^TdJTZrbG2x&0e2TNpNzI84m2FZ>f1HAM_YUb>%g)u-{aMTg)p#(Mz|b2b#v z0io_*67n#30rA8rL-nPj%jjn;fbm;M71q@}EFcVcW$&y1xuZCC8yPHzwMcLzjDr6T ziv_wZ&OMWCGm>`5b4?3&HR^aM${%m>zB^L-+ga4FVPY`iGPD^_z-RU@TFD%Lt;oH< z$)3a_JQtzj+kBBotCipR+kz2C^pJNQnD#26b1Na(k7P5|FLGb51&!+o%3M{lLI+)* zS*218Cb%UUebu+2gO%4)oA%%6~~V7XwbE9Ixu&3p@{&m-@ulp{mBZCr5PpUpce?{l#I<>3k51 zS?VeCt{mByfCVE#nX6f?5JtzB@`wTxDArz7a9vF>+S~^9q^?KW(jWV|!s#l-)gYKz z{LIc(rt?(Wim^Fs+Oz1Y#M=^_ zGl>sJx;J)t$Rhq$eZ~S~ZeL0vao>;bGMY;m{+`npF!42Zm6M?vyUpLoT=XSHdbYXQ zk9F)kP)hiRAA8_uzM@h>aib!ils^UEmf*d_3Df?9{N|ze-`JZ}FtO)~7oH^?u?N2T zhQa^k{4+q>p0wJ2c+0f^uz7I#%Fzi4a--a`%6$^XdTaN0KvnpQzQo9>tN+Jkf)|pQ z^b7@|zLNaM9Qz3yx5pn=MK1V~AUxX?9+MwR9r;QAsm==k2Hz9mD|y^&#A|>s;a-rT`VftjK7DM8AcOMJgwU+JFKQyB7J)d*t|U39lyiv1af2j9Cs`dQLzI)K zX&Kjg9B=a*F^?fnc#gwc zK@{E}psZY|!TB4sT^p|z8&&ZyL`E(E3$)}flGci=dpu-yEY1zI@7_J|GuDWdyC75f z34_D3a!YKQEcmM(unkBX4SUzu(>d-e^|vyL3K`_f7^$QwTHd5S-oq!9H>5$O+TMeO zlnz!;j~8TW`#vh7mG$e(D1GA}p<8YUi~}tkc~cl$Mku{1oWLvwn|Z&7adxHbI;K0- z(1Wdz5`p!^E^|$$ry?-zmpmT{8NnKz8hJ)6zdnsbb8f7Pp!K~=4YLW+fjJYXq+3ih zx!$CTKMwdV9GN%rIKtmlj&)a0uZh$px$f$S@IDUGU(b%PGW;lu68Z^>0JOqI}^Qu_^_6dElPu{14+^Q@y$8UuTn))ay_cf0?=IfMiy|LhN zg4LFNRcLhDeP@4OEa+RATD7^g2U3f_597?!=&)!)NuAkd5Z zVe(yMX>ZjU3W(9cZuMrMf>LM^-hSHm3pt2zc%uGnE{i*3;ox!Z#Gzi>7%|>kmXr3_ z+7bVkA>#&t5tHh0|8oYxlxo`_X1v_~(k2YdbAU&)V6ynud}LLYB{zPzqr4z=I;QT7G zUp(3Roxw+hQ&oT{n!m`-&`2HI!yN8c?vWy4#EUNkSXR!VxKYp~2TR|=yt*f#>+~OK zbL~Z|C6#0rA(r1V^(7Kp8JA=e(;*3sr3IF{b4)s&4( zxT85u(vR^;k7$dNdvsIo40>zI8KF{2zJ=#+F2F@)V6LnI8Ks=;bk7+YCQ1b`D@|j@ z5+;VuBe-db8PevH07?D1*pIf2S6!#i1nBn~ zC$`X3C-*^W^(JMs)wLB&i@~GHJVflO*P`wE3KSOW64r->aKqi62#nn;h`$gv(H?SX z7SS^#+YQjmE>V(Um=N*SXSm3!NV*T{;`L0u&^j*DhwNxiB-Pz z{B+CVJ}%WKaJZrih6xgU$Fej$!vBe%M7_|0DxB0^l=1miH4g}9}Em!C&tVy;DN~cuV-?Aq;*RsnnAq)ubb4Ip}kip{=a3QY9&qV3n zyic^t0R_W7g8`B)rGZh$rM+t=VkrP-fq0~gEwB7L^=Ekl`#$orv;CF*t+n%O?bDA{ zy1rV#cb}((YJ*S&>7qw#?z^iTAHDcQ&4dfq()|X9xW2&Mbr+ABKCoMkhCM%d*Yc9` zm;0|7-19su;!e^@2Fn;Xcw09A(mbNg4kq?(HPt(%`xv-+B9c)`8ogW~iQjfkfBhbx z=rGEYlN)ko*F@rJ!%F%w8=hjg+?zCG?Rt*?-R*qL^h6cmaV^I*3y2|i>fMW%x?Vx7 zGf5gKp_$<_gz)dsI4}#Mchv)efLxO@+A<=kNfT9^Xx?Y;^K#0mQ$B3vj1;_?^ zCS$*HqGjtE=tQQQl__OiLk@h1!OAL5z1kf5ZS!K8)1DIKRPN@pcvwXnvsE2B1S z9-(jk|4=&Q5g@#qTfI#^K7MrY1bobO$>r7ur!*fdtnQIRHt>oCBo{|lwl(DSnu!6cW+y(Au$rA?b{_+T9sml|WT%}NUy{@HUd zGaA~wtTzjnfIVp~UOD?A^S}#hzE+|k-r$Y3L1uGE8P@pbQO()V_Tu5lOhCZSBU(yZ zISi+>rc<6e8hADt8W?h3ZGN|KXM}?_*6Nk7yA;eWu%~%wn>o|Gq>Wg1@?x_!@N9I~ z#k1HXpg#Sck&irWiiJSw1P+a6=eBjV93Bp-&xWbp(zsuqpPAO%NM39%k$7aNqT#>!ZbTKB?7RjdP;m4 z9oSnwM!K9pN6Mm&1eExbBj#p&Xj+o~w>%yBIq0o#t52y^Y^IWay@PHGR?K4r^4iRJ zI)p=9uk(|U&x=J-XsC5|aI543Y@$O5M80~-w8vU2jg^zC^Z zcOFwpPiPhgO~fTo@eJ8@j}!QST5^pd*kbRnu2# zw^&>}v8k11D2wL%fqPprEC{y*6iHhimgb7>EiQy&OW4(Z$q+BI)ueqfli-v}_(Fu@ z4G=bjCw!oiB)E~>$0ccid`&A}ha3ovAE5E(Vx@gn5G@pWo}CYncY6*XkL5>lP{rar z#>KM0vP}EZILWs5STV+&WAK;%+gFQ84*tqQLV7e&RNz6n1iWw2It-C{Pno*J7;Oms zwL9-Qp~X$i`4#9(sM5l)c(6J$^KXOMBXWI}xPw^O+l5usrO7B)E~?5}?AMi#t(rQq ziBu>bVx_{%FV)2sbSdfZY;vWAa`Z#q3PZ$_C0*nFnCmjdUZqsWf0t*(%~~#F%6{U? z)hJnH9^ux1QqH0ALmFo8Ut%YSJ z%>^YW7i!uZHKbtLX4hkHpBpOD+c)HY0?0LmPnD2ud}^si~?oXQFw8BkYc9kY*{J0 z(c$L|>tSB|#g{O(&F99H&mPk>QDPf3t^yrb5T%eynW*LyW3{_9wNZmJOE_rOc^^4izv$D$| zb6G0FufS=M%QCgA*Y4R8w?q_{-OZQr!l@4smW^61{AOR$N@dbM8Xm%Zkq}qqIVfyG(Ef=9(`tSNL@mE`*CiXQdoc~)S_ODTG@a3n! klCl4>`rk+YkJTAQaQ2TC#uqN$<&$fe+X>UM8(x0&|6-y8 z_DH8xx4Rf&hBQ$?<%5L)J&USFt4R3zw7dPd|1hF*6sr^`okFsa*&zsg=Nzv)I`Q*Q zXtA4!rt#HYykWhtpWdkQ@9N~?|5({t4`@uKz7mYc5c3d0;Uzi(Qd*)(z!EhU-_E{q zIbyn^JWyJ)#L(e+RM$2|GvmD59hV5Y)5q@oFC9e8?joLyqQai_-hChKoO zigGX(q)(R{-Es7$B^JUuDTH1)?hd}5_+FXHcS%+YkdUUQi-D_VOIDMgMkjR3puV%E zf6u)=K6e&BXB&(qLdC_q_56V5qJx|LqRO~Nc>DBFR-mpp0*f9)=IQ16cF(~)?i`6g zEVV|Ns{BOk=jF|)l|Gxoq{4c${pO6zGQMpxS-nse6aY7f|rV=U?0U^}Lw-I^2Cym}rRT(*xVvyY>C^-Dd?C%Ff&B z;2#B9PM8e57H&PA(%@*fX6TM}sRc0=_^tcKW5V>DgkvhU1NS~-Jw;MAT(|5pjl6PA zIVmgM6hj}>H^C_3r4)r%0LQ>m{pyP?q=!#F63{!aWR5;T^;!^w$-ei~S1xax!)1G5 z3n;Z+-2KQf7Z5U9$EigMx>}8yxtywma%4r{KFPT85qP$qfI_RbX$S=_Tt&ezhbPE` zlB$R$B(iPs%MJ`hwF6ZJUkP7V3ouZ45!WY`1qz9YGX*) z`o;b9j)<#uH6G=8z5ShB8ViGLm&V}9ri-t9@~8aOBvRm)U|WX@=I5Tr)fov5@wnZ_ zw=G=6!Y@cg=S|k)oXSN)$|+1b@5+yHX(gk!3D z<`y}*!Lrb(wcFmE7gdniR7zJLByzRFsIjF>DrKBCtp`D+)qcMcK><P9F=M&Gprek!BX+t?=qPEmO(8lu3ZR&Hcfd? zsuDQOO$i@E+nM)E2oEYA2Mlh)VbG}L)E@lh=Cm?aRtD&SW)=^kR(Rvcvh$YzXdtq8 z6@O2yGK#Orh!FO-6s|c92}!Mj?5syJ6m)lViBf@=P|Cc@+X!M07{?>==^F0eB~*yj z8Z#zi(MP2Tsj3wIS?mE1nvhIN#%K*gzCyzT7HNjgskjoAM%rf7m8}3Px`EyFn2iVQ zwbjc_RVC^QoM5}IDq>*EMdTv^SvOv1-isbQwmO{Nk+v3PkuFQ@fW8FNlc0WT*xb@A*y8ThJFTjMq?0@ z8Hm>kB)ocUO`Z}Pp(jA@1yXyh;|P*sTQMU^LXuTy5j4^yGm;*uxk#Ez}+ic`TB(i-Y#iDs$l2w9EaH9ON_Zv(sF7l&v5>{b$W1{z)elhQ;3C~mu` zNMCSS8Nn9@;@ANvVcIEv8-}V|Cm1%ww%xOcW ztr#zR9ob=_uPgHZl>DIpYp(;%+qHDP#wYt~<76K=h}E4mvgt^(I#EKd)5rf)-8Gxs z;*}XeR!2;xD|wa+mE&VYs)MTkxw4?sGvIltU_H|KEG-tQ>CR{~dbC9@xINZDkYLeq z1xD$o8#=!d%kxTAzI`o$KvrSBtN`(C%Fddn_=Lg3gouf($_zL|jWqpAZvpdeL{YQ;aq9W$w-wqyyaZPRvM08Of zDY?far{k#~v**mj;IBR<#4zWfI$}TGI42Z&^b%v{O+4vdP0wg+8s`dkSYUkRG5V^n zg^a+}6T-edIc6b@&aB8GHnp2=Y!%5gBM8;jV3ljukQ0uB8=0F?w8ZAJWab}QL1DsR z#ipwWg`_H{1}Mz(z+$3>fDu~d1e9laFt$z_gnL7+Cw`Bzo`Bp!x{*N*GjPf z8$sceLom&NtH24=k7vm&g0-)%suVXg5d$kg3Zw?@C4(q^<`qh+47cKu&C5%C)0L@`AU(5ddjrFR zM(*_VTALYPy4iT)#O?l8@y!X>;+t%A%ix!M0zA#{F5UpZ%zJB5O1%+o!MEph}Yz!|{HlrnhLEAyKdQHHEhEXHu^#dG=5zf=n(`8@aJN;**$d#0^TQ^1( z@NB?v{$m0BHD7Q#+%%fRdRXd)qtuY=wx6LXG6gPl0jR%6%LkSm=v^nWu%z6R4kRg7nV)XL*1irBfFNoaA-@RW4`NGzB06z*M6|%HUYFfcAdO) z-%!U2%jbr#yV||vm66fPvVl0AMqQj4PLD>fG$ov@u8py#+Qf+M z*MibF5EiEIWGSc~#&I;`qoBKcP1A#n7BM_Q1m#ubC49ZQh2Eqtg9R9R)S(VEh`Ok7JGl* z&+>!rjdg3AuP}-YK$s$CU_N~Az_wDpb)8DRh;J7@gL&Cwx=)B(KI@?~j6zQQiXL`&7*T1feQqO_@0&jOAx5Nf6Tl_?4nv<&Y)MIrMK_kBXG!4Ceu8E zADv^B@|M_W#%5~EmZo+K5n!4S->6oe>ruOM1jzkk>*pHc9QeAuoad$Q7c${2ucVI4Q)f#poVLu?E3`G_=Asc)hfh^ zLjaVw^ZVxs6YMKaLuqODnKtdJ+g6kPeiMaGak+uxLiKg$E zP?J@K(=vye+Okx0=&0+M>at|D`_j){txLw&yD)$BGf>uDBO#oEp2zVo6`btW%h~V6 z?}vuF@=)XxTF6^5f)cMv&|eVK2tr8I^3AP|Ij1Dh-7w!rxRAdLa~_wvoqrn~%&Qgi zZTv7E@tRnl^j88jX5Auuh)pd^3eNj4ZEF-~_xjWMi9WnMF?R=E8iah1pFc%jZM%Z{ZeVX4+xZncqmg{h)9-?|LiBG7Th|&=vQmJ}bE`JpecBabPoe_3s{Z2n}h>$Dhzew|z{zN0h!a4=E_vCx-|1GnrU&BZUYU|RUaOvJJMqA#u8?x-nQ538Z^#L%V+ zx(1D_?yXftVHG+aBQOin%c?5xtqlcMBC5TBh>f58D-7!UUI>5oR@1GEe7wElCkFlT z5Mn^_iodl0*CqbQ@v9o$Z!B_Bb}wfV_KeG`N=73-d>YQ)jH@HfR}84;&{j$O$Whdn zM_y-C7TWqNSIa8rw>vbzvd_lda^Ah>bhe`WBTl3KP3Nn+=jYpZ-zS8j-LPdLC-s;wUGk)r>oFuCjDSCh^=QXiZrVKilFcbSP#piYj0?7(A9~o~zYBruD zN)CR$tG3j(tyXwg32tuYoiK(bkND^GRHToODHrKLkUw^?>I;_%YvJL=FU%f#C-#j7 zIRzDt2@dw9Ya12u(C=!$?^RiEUpsARn?!8ZW;pWFn23*o<*7}_Bb~YURT~HG(;nl_ zVa|&Lr(%oZA-27-n&Bk1XyZQ~(GjmGu(u@uUnP}13O_`^#V7>{g;aO5O_#}i9_{z^ ziopv{Ct@Q@jdZa=qdeb^^>;H<-d!1QD0|$y*V;%SCPJ`n_Ukt=T2s01mwKF1;{f0Q zUPSV1S%KH>R6AnFe?$2~;SVN(7<(u6q1`4%5++u$!C1b5L$rc=?o2A3N1ulfW`r2co4?tg; zlzvMWa5SBB3SCxoWdEKTBL`Tzve`XiYB_3+cc*trg10ggCEonfkz41Vua1Om=?NMl@5!p^HkR<5!w;B^O1}-!?joX`!`+= zewSe4bJ~jk(DB^;9z};G^OWPv51U~>%@d+!;V2A>zn$O?r&rrrS%Obf&fs?H$v@+2 zTDwn(`$5Xp+~M@#DA?Td%zU|D^TXhawkI3OVEgm_O_zB|C8w0ddR>0{Sj&a{a*GC~(NidI-% z>0GzC6_pb?R%h?i8+FmJ!6=RD6y>e1AW}(#?G-XOlYmug$B!K^{%xQQYDG^}*Luli zQdGNRx~#kU4N-P%N1e0yppszA<=;Lw@0`N55?-l=kZ0n2X4BRAcu8Us8X+ObJOo19c_h9fiZx~sOVSA$H;3IOuaYbZbyc@ zBY=P7V{9&N@N5~(67u?X)8xtBcdsgbg%^`!?}(uY_W{P1WTzNQlvzlSC0G4r!l;S$ z=I6$&HRB$~>32lGByY{v=Wp>$^m_HS*SO{;m^3$uV8LqKAo`fFD4F`*A8F`Fi+uWF zU0ZiVk1MlrnX~SbnbN|ld5dny)*)QEB_bNKezf)BkTzt=O-Pbgv}7$Rw&{w{!vabr zh7m!JyiSNT%FyvUufCbD_g`-oy=4zSll#o^G-F*%UY6XKO~4DD7XU7A23Yfyt6c}4 z3TF|JTMcUv_KI{7?#OeCPoCg+1}yy`T=9(kgb+gaxMA>K7ryipodJfZay4kIXec8C z8N9BVxNqpkyYa=4&0?)DsPEp2fKQvfdO&M6;|vn9{&aK5JP@#IU^7yZW=m4JRb64K z?WLsL{qEU^z4FP)6N_24ay?#q6uw>}H>b+YLILMjtSxD4cTgd ztsg>KR$;Tc%C^iGnuCtL%J!(no*Ra?GSuYH%|T0KJ?D?$eqD$^J?qpqA(7TKmKRI3 zi#V;E(J_%HogncUtZrfbN(sjKoK!czJ|Dfdb`{;GXj`7!&!K%(#zf1i?!D?hZGe~u*DT)e2oha>LlMUe35tJ)1yuO`}=!=A}E9$vpIHP%|YOMpth6|AA)W=N7&W1UG9`+(o`GG zH$QgTK7nFAMK}+Gtjy8}md?7G`hoq)8cU)-83#WJM z`4^6j4`sR>*p{?g28D~WKnR&ckf^8Ap@Sb30pa4A^r*tIG|1p?=A=V#inPH+arZVd z^)^=U>@8xAKU|b{Z_Ins-Fsk%^ww|G`&c^bhKGOZThX9`_s8SF*0qy`hli|eJ>AUd zuiw_Ya~eXKU|m;$FHo?^>Neth+55gpg?H30Ys_hMV#2oO`imdx^Vax5?K@s1kY;NJ zU%9SaB6QVM>&djg*j0iS@0=8Z+g7`(?Rkk2zi-8XSjTpvzhpPheu!|c@GK8i@W>hP zP8gcwjDQ+v9x@EQ2IYs3a2%_@X`H*JN@|!csd9{o7q#B&hml){mQm=`va8k4-aYUF zOepZ^fR$P&7p^6B+Piw^7xjYKOq9IzSG;YNqx ziSs-5u9HliOIaw(X)RM^b}r!rMBCzF|J(3t+RkNAufPp!Y4uuKBGc9}Ki@q33(>ZG zSj!CAxy%1&IN-c?gx1X6%ZTC_CAzxpk*7nb;KL=l+U#-tf_+`T(cJO_(u?|X`A5F}gf1{(v{&-zWG8XDeON@^hXGAyDw-R`uEJ=I!a*2M@jFUTMO-Te`#Z)_$3I zRI#-73f(VeoQ34r1?Gb3L3Ide7Jf2Rg||Q5)wM73d`}$c1x$( z7wztX9popmSte@Rs+Fu9b%&j}<7gDiN4K%&7nBHu8n;T;j_>@*$?&Z<$#%EH=e0oj;?O<$#{;O^?MjJlrhFV{F#f_i$Y z4VwQ6d{sA#n5c`v5^E@7*^T!SKBsm%fKP3D+3wA~Ovi-kJBPL3r2UN$i659@P~ybx z8P3ELT({@?01PVlW%*3%y0^~5m(a*%wIrtL=Xz8A1=w&IKkhOetoTOj{Xw%o#kFBA6;=ad?TD*C8W`!Ua^Jq+dW}8_>Cl94LNdX zcSS2B`BTr}wI1N3G~Ro}4JJg~pWOUi*I4(GgPBd*jHa-4VnaE+4AFGq?T(sW|U;Ah|T(777il3%`L^#LfW-J?#b6b+YBySm{Ae5jg(s4m(v{oLc5jK|DO93 zT3^uhIiIO5ot_R>G0s1kPNlYg8Ni9Ga9wic{%`uVsqLZ)S_FE}!NWkR|6pJeIK+&d z$nozA?9_I))QXEq9f=AiWmzyY$2*anIw8}*VP>3U_d`1CkXA`(6Y-|MX8wY?OH*|{ zx442MauEMZ@87xC3GJms4$q^!WwS0014mE)S^0;M(vo)339XE9{&5Ksa`gWI^=C0o zq!{%^*h zKN*`3^WqM|xgs0UApVEur#<6ql#Vg&`8MkAQ2K0Q^gm2$1ze9n@2z=G<7>UrSzpBn z{6o8;BB$G+GK``+czir}*FQ{-i0$clO=_QztLzQ_MeW~UVEzF^*!uZ4d};1`;Xj)x zC2FYcCY1wsa1e?@>yySd)ZdI53wyfT8CW2EtjS-kWc@=<&!13HwNCi@B`ysA-H+FZ zeY_l690ed3m?+E@tRRT{OKObZLl6njl!%gk zrE%?|f@m~4dcV;gwxIqTzCWiW;q%gZZardsluetp)ql?rbM%myeB~Kww0VTg{ZF*c zJ)&nSpRWe)(Y>)uh>zHpjGHe8B%LcgUU9v6MI8?(-6)^N=D()#9MVu;ONu1C=@gD4 zUBz`j6Yr5rnvpG$Y$thSdBMhINdFunG|TCsWQ^0~N(8fzxC-gSmM%g}QX3z+^sTh9 z3`6edqJ_8iwbo{i8?P6TmnTt6iu++~ek za&B;bzFoC?5~tAo_MBIdS4`2lO;K2K*ng?nyNL}uC@qsyw8ys&Ie24^b7vAQ(7fwRh4Z);eU(8AZTyj*w4CG{t{11p7sW?Mv_l6PzPku5 zMY|ny$|z+xh3@fJvmE{6uxc=7Cft%k{_t5xm>TJL>MFw` z(X}0qv@{_6fHD5Y`siCrHe#XUpg0h9LHVu}qj8>=#TPrB5xAd|y*}y{ha(;5>i4zM z^4YLyebgSVtibzg<$F{(`4L1`vk_mf(Px4- zjrGYW?X{Cg4M*chXD2)$L-5Ti(Q2dXl{;-y_BxzEc2T^*t)LA`A$EW}mp73Af>N?2 z&2h}ljdMFB?^L;m3^SlSzM!CTj6JjGonsr3mGa%`r7Lu4qH%1C)}&Ew8MCdDo#%zb zERpPXxm5tR;tc9l_$U_d{*iKO0~1!g7^+?hn&29ooz5oJ2XENMd-$wq1oxhowoP); zs|9qtp6R-w>$;KYTHR{CmSO$q*hU9SI)Z%FnvxQ7&M)U5ThpT&- zG9?_B=r+s69=mEbnQMh4IPw6lV#HPcj)tn*AgDB*j2?}fbdp=&s_Me2y9&6z)Z#n@IF{*k>W)?+JYrP-e& zxQP4|I%2kyK$*flB!+nCAkL;z^{Cq31#QU^0-ZjFcqE!~lOI<-xRk_-6iI+}w%fku zi8hDvn5`r7NUUzJq-NBA6hcYi1S3;kcbs!(>YyNEhhG9J#gPrF0P4;5Jv7SN%}A3~ z>YPNlefrwfZ8L$P%*h<0BrhF*h3LlC^x#s!{HLI+e(GzDAVJzLF zV>(gmVi?X~-_j@T&&^!ZgY{P;diIY?lMosTKD@0VI0f;)r$*hfkray6MvKEQl6cMm zW7|?X%)xxll!YC(o&Q2ZDo%{MszZv*q0S-UtEH{x|9+cBZJ@R zsbLE*Txe0B)$(ZXpU8bxsvDD zNalDv6cmHsqSkj@TlCu@eSTQh5zCL1Vt%D+4OBB@W1}K%90uep(SUW%%D4(gO2GGI z9s5Cx31X;mItcp^fwFqpl^$WC60h=bY#Ly^fBs@q z-WK0;nzdeY^rLGu{s6c!_9e;W>QjQ}xOOu8WMb3mc0ck&HIlfzN4-Qg)c+#beCg)E zA?Cgm4&jlG*TDYf1S;t{4boYf6pk!N+0#x|K0g7Qp>$0&90u9)9_f`AAFlb%&b4{@ z3gBCOrcJ>ip(#9K8ijYx`#)8ii4p$BBU)JpLY|}_9mdY7? zqh9NIAnG#uWiIm8l}=AlM)$(+57tZ6XGYQm`-}jDox>j_1Mwt3%;5D&2M})FpK_)1 z{kNg<25x*XxeOP7itOjH=!yGV25+A-4;OandQVojmc;_Enu9jTb2@$#9t^1;p*rA# z#msZ50#!;Z{Q9wyMt;V&=7OSOOalb%gMb-G&xlzlgB|~oW=JLeE6vbx)8P`9J;PlC z;1!CuUdf-i@4&v`J`}k1E?UOaet1CirCL+y?naKgq*HN+<7cXarU3}=sZ&v=hOM#J zwl(wNh=SvJTDY7H9OekPHkc1Ti<_O&HSPz1C);t>0M+6S1}KQ66zYgGdBhQW)5L^< zK5^H1?Zpx|meHJAQ%j;+2sdHihMJS1wXpz#M6da z1WWnzjNed>MQGU}CdI0i%T(*jt4GE9tb(9_zcXiVvUB$@A8T^tM01X&v{ z`SUN42~DAXXbJysMMi+O8kXSP+7kHmf<3l$;==3Q)#>X$HXf%u)JLk|BSQ($8}Hfv zLFtcuWtti7NDbY9pb44n!bQyH#LvEaiXTWH7%T^Z-Mchtc@sbk6NPOE@IG#+c10okS(@uZ+f z_t5O;)$ve_4xSDxCLc>J1swH%wY*TM@vEam$xY(Ac&Zs8iVdE8`Fv5z;5vSAYY}{Q z|3|giAqg89$=!PT{CTWMHWzWCI$py7+!5lnzy1`BkV~@`@5&?nK?yjYG3nZ6(uN7$ z_~z+}^QW@Yv`gnS!eFXB+-~~_qpz&QOsV3yv(X6=a^wy9{F*J`d4H!iQI?R^oyJyI zqGQKX1^_UrAIr}g&8b827%5XCJ}nP;VIhHREX0Y56#vB60bf)TaLw%9?k}0lWuHd( zuE4UTg|ZVuf?g9Ky&fbuiq;K$+8TXXOc)4*E0jkg@qL2u-k zQHt2s29|&6B_WrX@i{frQz5b`tJ=?Km3OKCPRl((Cch2(tC+EZ2_xAB3vbcU#elkZ zHY}zL)Lp@^nneb2HPrjSI7c{)J;haIJy_)I=XG~~3)NqR0ogVfA2vKW1vgD3Q!6*X zp<2+&+k`x~Aq$sOQei168e@dNkCxHv__-)yF8!5; z@$V_VIX9aLSh3G?K^?ipT2>hiOakk=e(jF3M96Y;^+Ym>91_8%`$)*_E^(!sWa>T> z4|?mof?W*Bu1B~=4#?_YryLr+UD+B!&O^!B%Ob_ENQ_)@hkGzyfEL|cp;+vo;F0|L zqd@>6y|%$9X^(&BWbecc?O^~2mo^cRcwefRbN+!=oK;|Vu)xi zQ)7@U);I&w9<&7s=eHdCmCp1~Y4&1`M z{(>WWl2{HFbypV|riHB_l)H+(1T>}kbVh`_J|6Up0BN5nh*c0HKbQftbZM*;(mPs<-<$DCo(_r)YN~)Ba0azIZ~}rQ?33b+c2J7E zqlojdE3ht7juU_E67F@~?5(~!yXb;M@PgO#iBOnLzxO0Cw`W2L3s36>?u_CICU*hft1@+y471P`v4bhK zM+tKeJzuxTeAGEVLii_dLzwpmiQ+$v5MW@W+BR~3dLRD#`Cl3#OcZ6nAuu8T-whN0 t8Z`y}HTt)G;(uEG-@X4&EBMdYdI{P|`6^9&5^e*o8x)A0ZR From f141b8574584d3a4e2b581acb4874d0890bafca8 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 10:15:35 +1100 Subject: [PATCH 33/65] Ignore .log files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1dadcb9..5f368cf 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ __pycache__/ *.py[cod] *$py.class /.venv/ +*.log \ No newline at end of file From db5997889595b401990fe0f50faf1eff547234ba Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 10:16:38 +1100 Subject: [PATCH 34/65] Switch to conda rather than pipenv to manage environment --- .env | 6 +- Makefile | 64 ++-- Pipfile | 31 -- Pipfile.lock | 753 ------------------------------------------------ README.md | 38 ++- environment.yml | 149 ++++++++++ 6 files changed, 206 insertions(+), 835 deletions(-) delete mode 100644 Pipfile delete mode 100644 Pipfile.lock create mode 100644 environment.yml diff --git a/.env b/.env index a71086e..de5e5c4 100644 --- a/.env +++ b/.env @@ -10,10 +10,10 @@ MATLAB_PATH="C:/Program Files/MATLAB/R2016b/bin/win64/MATLAB.exe" # total water level. MULTIPROCESS_THREADS=2 -# The settings below should be left as is unless you know what you're doing. +# GDAL_DATA="C://Users//z5189959//Desktop//nsw-2016-storm-impact//.venv//Library//share//gdal" + -# We want to create the pipenv virtualenv in the current folder -PIPENV_VENV_IN_PROJECT=1 +# The settings below should be left as is unless you know what you're doing. # Need to set pythonpath so that relative imports can be properly used in with pipenv # Refer to https://stackoverflow.com/q/52986500 and https://stackoverflow.com/a/49797761 diff --git a/Makefile b/Makefile index fc7f22b..c6ad96e 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +SHELL=cmd + ############################### # Load environment variables @@ -12,13 +14,21 @@ CURRENT_DIR = $(shell pwd) . PHONY: venv_init venv-init: ##@environment Setup virtual environment - pip install pipenv - pipenv --python 3.7 - pipenv install + conda create -f environment.yml --prefix=.venv python=3.7 + +venv-activate: ##@environment Activates the virtual environment + activate $(CURRENT_DIR)/.venv + +venv-requirements-install: ##@enviornment Ensures environment.yml packages are installed + conda env update + +venv-requirements-export: ##@environment Exports current environment to environment.yml + conda env export --file environment.yml ############################### # Get data from network drive +.PHONY: push-data pull-data push-data: ##@data Copies data from ./data/ to data backup directory rclone copy ./data/ $(DATA_BACKUP_DIR) --exclude "*.las" --progress @@ -39,44 +49,35 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr $(MATLAB_PATH) -nosplash -r "cd $(CURRENT_DIR); run('./src/data/beach_orientations.m'); quit" # Produces a .csv of sites where our beach cross-sections are located -./data/interim/sites.csv: ./data/raw/processed_shorelines/*.mat - pipenv run python ./src/data/parse_mat.py create-sites-csv \ - --waves-mat "./data/raw/processed_shorelines/waves.mat" \ - --tides-mat "./data/raw/processed_shorelines/tides.mat" \ +./data/interim/sites.csv ./data/interim/profiles.csv: ./data/raw/processed_shorelines/profiles.mat + activate ./.venv && python ./src/data/parse_mat.py create-sites-and-profiles-csv \ --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ - --orientations-mat "./data/raw/processed_shorelines/orientations.mat" \ - --output-file "./data/interim/sites.csv" + --profiles-output-file "./data/interim/profiles.csv" \ + --sites-output-file "./data/interim/sites.csv" # Produces a .csv of waves for each site ./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat - pipenv run python ./src/data/parse_mat.py create-waves-csv \ + activate ./.venv && python ./src/data/parse_mat.py create-waves-csv \ --waves-mat "./data/raw/processed_shorelines/waves.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/waves.csv" -# Produces a .csv of profiles for each site -./data/interim/profiles.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/profiles.mat - pipenv run python ./src/data/parse_mat.py create-profiles-csv \ - --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ - --sites-csv "./data/interim/sites.csv" \ - --output-file "./data/interim/profiles.csv" - # Produces a .csv of tides for each site ./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat - pipenv run python ./src/data/parse_mat.py create-tides-csv \ + activate ./.venv && python ./src/data/parse_mat.py create-tides-csv \ --tides-mat "./data/raw/processed_shorelines/tides.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/tides.csv" # Creates a .shp of our sites to load into QGis ./data/interim/sites.shp: ./data/interim/sites.csv - pipenv run python ./src/data/csv_to_shp.py sites-csv-to-shp \ + activate ./.venv && python ./src/data/csv_to_shp.py sites-csv-to-shp \ --input-csv "./data/interim/sites.csv" \ --output-shp "./data/interim/sites.shp" # Creates a .csv of our dune toe and crest profile features ./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv - pipenv run python ./src/data/profile_features.py create-profile-features \ + activate ./.venv && python ./src/data/profile_features.py create-profile-features \ --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ --dune-toe-shp "./data/raw/profile_features/dune_toes.shp" \ --sites-csv "./data/interim/sites.csv" \ @@ -85,7 +86,7 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr # Creates a forecast of twl using sto06 and prestorm time varying prestorm foreshore slope ./data/interim/twl_foreshore_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features.csv - pipenv run python ./src/analysis/forecast_twl.py create-twl-forecast \ + activate ./.venv && python ./src/analysis/forecast_twl.py create-twl-forecast \ --waves-csv "./data/interim/waves.csv" \ --tides-csv "./data/interim/tides.csv" \ --profiles-csv "./data/interim/profiles.csv" \ @@ -96,7 +97,7 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr # Creates a forecast of twl using sto06 and prestorm mean foreshore slope ./data/interim/twl_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 - pipenv run python ./src/analysis/forecast_twl.py create-twl-forecast \ + activate ./.venv && python ./src/analysis/forecast_twl.py create-twl-forecast \ --waves-csv "./data/interim/waves.csv" \ --tides-csv "./data/interim/tides.csv" \ --profiles-csv "./data/interim/profiles.csv" \ @@ -106,37 +107,24 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --output-file "./data/interim/twl_mean_slope_sto06.csv" ./data/interim/impacts_observed.csv: ./data/interim/profiles.csv ./data/interim/profile_features.csv - pipenv run python ./src/analysis/observed_storm_impacts.py create-observed-impacts \ + activate ./.venv && python ./src/analysis/observed_storm_impacts.py create-observed-impacts \ --profiles-csv "./data/interim/profiles.csv" \ --profile-features-csv "./data/interim/profile_features.csv" \ --output-file "./data/interim/impacts_observed.csv" ./data/interim/impacts_forecasted_mean_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_mean_slope_sto06.csv - pipenv run python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + activate ./.venv && python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ --profile-features-csv "./data/interim/profile_features.csv" \ --forecasted-twl-csv "./data/interim/twl_mean_slope_sto06.csv" \ --output-file "./data/interim/impacts_forecasted_mean_slope_sto06.csv" ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_foreshore_slope_sto06.csv - pipenv run python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + activate ./.venv && python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ --profile-features-csv "./data/interim/profile_features.csv" \ --forecasted-twl-csv "./data/interim/twl_foreshore_slope_sto06.csv" \ --output-file "./data/interim/impacts_forecasted_foreshore_slope_sto06.csv" -################################################################################# -# PROJECT RULES # -################################################################################# -.PHONY: push-data parse_mat sites-csv-to-shp - - -mat-to-csv: ##@data Converts raw .mat files to .csv for python - cd ./src/data/ && python parse_mat.py - -sites-csv-to-shp: ##@data Create the sites.shp from sites.csv - cd ./src/data && python csv_to_shp.py sites_csv_to_shp "..\..\data\interim\sites.csv" "..\..\data\interim\sites.shp" - - ############################### # Misc commands format: ./src/*.py ##@misc Check python file formatting diff --git a/Pipfile b/Pipfile deleted file mode 100644 index 0e234e9..0000000 --- a/Pipfile +++ /dev/null @@ -1,31 +0,0 @@ -[[source]] -name = "pypi" -url = "https://pypi.org/simple" -verify_ssl = true - -[dev-packages] - -[packages] -numpy = "*" -scipy = "*" -pandas = "*" -matplotlib = "*" -click = "*" -mat4py = "*" -black = "*" -shapely = "*" -fiona = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.8.2-cp37-cp37m-win_amd64.whl"} -gdal = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl"} -pyproj = {file = "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/pyproj-1.9.5.1-cp37-cp37m-win_amd64.whl"} -colorlover = "*" -ipykernel = "*" -jupyter = "*" -plotly = "*" -jupyter-contrib-nbextensions = "*" -jupyter-nbextensions-configurator = "*" - -[requires] -python_version = "3.7" - -[pipenv] -allow_prereleases = true diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index 5359b48..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,753 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "d1086c407632a2c2f9a8e1b657d7e0703ac8929bb3aa41f68ea364448c47cb33" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.7" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "appdirs": { - "hashes": [ - "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92", - "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e" - ], - "version": "==1.4.3" - }, - "attrs": { - "hashes": [ - "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", - "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" - ], - "version": "==18.2.0" - }, - "backcall": { - "hashes": [ - "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4", - "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2" - ], - "version": "==0.1.0" - }, - "black": { - "hashes": [ - "sha256:817243426042db1d36617910df579a54f1afd659adb96fc5032fcf4b36209739", - "sha256:e030a9a28f542debc08acceb273f228ac422798e5215ba2a791a6ddeaaca22a5" - ], - "index": "pypi", - "version": "==18.9b0" - }, - "bleach": { - "hashes": [ - "sha256:48d39675b80a75f6d1c3bdbffec791cf0bbbab665cf01e20da701c77de278718", - "sha256:73d26f018af5d5adcdabf5c1c974add4361a9c76af215fe32fdec8a6fc5fb9b9" - ], - "version": "==3.0.2" - }, - "certifi": { - "hashes": [ - "sha256:339dc09518b07e2fa7eda5450740925974815557727d6bd35d319c1524a04a4c", - "sha256:6d58c986d22b038c8c0df30d639f23a3e6d172a05c3583e766f4c0b785c0986a" - ], - "version": "==2018.10.15" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", - "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7" - ], - "index": "pypi", - "version": "==7.0" - }, - "click-plugins": { - "hashes": [ - "sha256:b1ee1ccc9421c73007fe290680d97984eb6eaf5f4512b7620c6aa46031d6cb6b", - "sha256:dfed74b5063546a137de99baaaf742b4de4337ad2b3e1df5ec7c8a256adc0847" - ], - "version": "==1.0.4" - }, - "cligj": { - "hashes": [ - "sha256:20f24ce9abfde3f758aec3399e6811b936b6772f360846c662c19bf5537b4f14", - "sha256:60c93dda4499562eb87509a8ff3535a7441053b766c9c26bcf874a732f939c7c", - "sha256:6c7d52d529a78712491974f975c33473f430c0f7beb18c0d7a402a743dcb460a" - ], - "version": "==0.5.0" - }, - "colorama": { - "hashes": [ - "sha256:a3d89af5db9e9806a779a50296b5fdb466e281147c2c235e8225ecc6dbf7bbf3", - "sha256:c9b54bebe91a6a803e0772c8561d53f2926bfeb17cd141fbabcb08424086595c" - ], - "markers": "sys_platform == 'win32'", - "version": "==0.4.0" - }, - "colorlover": { - "hashes": [ - "sha256:f12a091ca2bca29e0e9294a072693bc70d2fafc573bb7c0fc8070099b5de9cb2" - ], - "index": "pypi", - "version": "==0.2.1" - }, - "cycler": { - "hashes": [ - "sha256:1d8a5ae1ff6c5cf9b93e8811e581232ad8920aeec647c37316ceac982b08cb2d", - "sha256:cd7b2d1018258d7247a71425e9f26463dfb444d411c39569972f4ce586b0c9d8" - ], - "version": "==0.10.0" - }, - "decorator": { - "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" - ], - "version": "==4.3.0" - }, - "defusedxml": { - "hashes": [ - "sha256:24d7f2f94f7f3cb6061acb215685e5125fbcdc40a857eff9de22518820b0a4f4", - "sha256:702a91ade2968a82beb0db1e0766a6a273f33d4616a6ce8cde475d8e09853b20" - ], - "version": "==0.5.0" - }, - "entrypoints": { - "hashes": [ - "sha256:10ad569bb245e7e2ba425285b9fa3e8178a0dc92fc53b1e1c553805e15a8825b", - "sha256:d2d587dde06f99545fb13a383d2cd336a8ff1f359c5839ce3a64c917d10c029f" - ], - "version": "==0.2.3" - }, - "fiona": { - "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/Fiona-1.8.2-cp37-cp37m-win_amd64.whl", - "hashes": [ - "sha256:ea6f9f7914fe25e7e9945cabf628edb94c483702f8181d9b868b6bfffec2db25" - ], - "index": "pypi", - "version": "==1.8.2" - }, - "gdal": { - "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/GDAL-2.3.2-cp37-cp37m-win_amd64.whl", - "hashes": [ - "sha256:2f6c36ee59f9b24fb16514e4fce8b73e7833714feb9b8397f91662256e1b12d8" - ], - "index": "pypi", - "version": "==2.3.2" - }, - "idna": { - "hashes": [ - "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e", - "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16" - ], - "version": "==2.7" - }, - "ipykernel": { - "hashes": [ - "sha256:0aeb7ec277ac42cc2b59ae3d08b10909b2ec161dc6908096210527162b53675d", - "sha256:0fc0bf97920d454102168ec2008620066878848fcfca06c22b669696212e292f" - ], - "index": "pypi", - "version": "==5.1.0" - }, - "ipython": { - "hashes": [ - "sha256:a5781d6934a3341a1f9acb4ea5acdc7ea0a0855e689dbe755d070ca51e995435", - "sha256:b10a7ddd03657c761fc503495bc36471c8158e3fc948573fb9fe82a7029d8efd" - ], - "markers": "python_version >= '3.3'", - "version": "==7.1.1" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" - ], - "version": "==0.2.0" - }, - "ipywidgets": { - "hashes": [ - "sha256:0f2b5cde9f272cb49d52f3f0889fdd1a7ae1e74f37b48dac35a83152780d2b7b", - "sha256:a3e224f430163f767047ab9a042fc55adbcab0c24bbe6cf9f306c4f89fdf0ba3" - ], - "version": "==7.4.2" - }, - "jedi": { - "hashes": [ - "sha256:0191c447165f798e6a730285f2eee783fff81b0d3df261945ecb80983b5c3ca7", - "sha256:b7493f73a2febe0dc33d51c99b474547f7f6c0b2c8fb2b21f453eef204c12148" - ], - "version": "==0.13.1" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" - ], - "version": "==2.10" - }, - "jsonschema": { - "hashes": [ - "sha256:3ae8afd6f4ca6417f14bf43ef61341311598f14234cdb4174fe43d42b236a3c8", - "sha256:dfd8426040892c8d0ef6da574085f282569f189cb24b70091a66c21c12d6705e" - ], - "version": "==3.0.0a3" - }, - "jupyter": { - "hashes": [ - "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7", - "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78", - "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f" - ], - "index": "pypi", - "version": "==1.0.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:27befcf0446b01e29853014d6a902dd101ad7d7f94e2252b1adca17c3466b761", - "sha256:59e6d791e22a8002ad0e80b78c6fd6deecab4f9e1b1aa1a22f4213de271b29ea" - ], - "version": "==5.2.3" - }, - "jupyter-console": { - "hashes": [ - "sha256:308ce876354924fb6c540b41d5d6d08acfc946984bf0c97777c1ddcb42e0b2f5", - "sha256:cc80a97a5c389cbd30252ffb5ce7cefd4b66bde98219edd16bf5cb6f84bb3568" - ], - "version": "==6.0.0" - }, - "jupyter-contrib-core": { - "hashes": [ - "sha256:1ec81e275a8f5858d56b0c4c6cd85335aa8e915001b8657fe51c620c3cdde50f", - "sha256:e65bc0e932ff31801003cef160a4665f2812efe26a53801925a634735e9a5794" - ], - "version": "==0.3.3" - }, - "jupyter-contrib-nbextensions": { - "hashes": [ - "sha256:40eba9492d22302599d0a8f29d1297efb06e233677fe2d6f4d224e7c3e373872", - "sha256:f4893d99fed6be6587cd2c722ef8841556283a697a482288b621b514beda2405" - ], - "index": "pypi", - "version": "==0.5.0" - }, - "jupyter-core": { - "hashes": [ - "sha256:927d713ffa616ea11972534411544589976b2493fc7e09ad946e010aa7eb9970", - "sha256:ba70754aa680300306c699790128f6fbd8c306ee5927976cbe48adacf240c0b7" - ], - "version": "==4.4.0" - }, - "jupyter-highlight-selected-word": { - "hashes": [ - "sha256:9545dfa9cb057eebe3a5795604dcd3a5294ea18637e553f61a0b67c1b5903c58", - "sha256:9fa740424859a807950ca08d2bfd28a35154cd32dd6d50ac4e0950022adc0e7b" - ], - "version": "==0.2.0" - }, - "jupyter-latex-envs": { - "hashes": [ - "sha256:b0a83e0cda2d33e61c4b2da94365d2de4dfcdc1ed67abdba3cbe390872cf5231" - ], - "version": "==1.4.4" - }, - "jupyter-nbextensions-configurator": { - "hashes": [ - "sha256:778f36a0996e622c224589327405583f4a539d183fa2fdaeecbc4397c1af9991", - "sha256:e2cea15dde24c9090104cf3ebedd6bcd354004cbea5e858b3776372ad50b7d46" - ], - "index": "pypi", - "version": "==0.4.0" - }, - "kiwisolver": { - "hashes": [ - "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3", - "sha256:0f7f532f3c94e99545a29f4c3f05637f4d2713e7fd91b4dd8abfc18340b86cd5", - "sha256:1a078f5dd7e99317098f0e0d490257fd0349d79363e8c923d5bb76428f318421", - "sha256:1aa0b55a0eb1bd3fa82e704f44fb8f16e26702af1a073cc5030eea399e617b56", - "sha256:2874060b91e131ceeff00574b7c2140749c9355817a4ed498e82a4ffa308ecbc", - "sha256:379d97783ba8d2934d52221c833407f20ca287b36d949b4bba6c75274bcf6363", - "sha256:3b791ddf2aefc56382aadc26ea5b352e86a2921e4e85c31c1f770f527eb06ce4", - "sha256:4329008a167fac233e398e8a600d1b91539dc33c5a3eadee84c0d4b04d4494fa", - "sha256:45813e0873bbb679334a161b28cb9606d9665e70561fd6caa8863e279b5e464b", - "sha256:53a5b27e6b5717bdc0125338a822605084054c80f382051fb945d2c0e6899a20", - "sha256:574f24b9805cb1c72d02b9f7749aa0cc0b81aa82571be5201aa1453190390ae5", - "sha256:66f82819ff47fa67a11540da96966fb9245504b7f496034f534b81cacf333861", - "sha256:79e5fe3ccd5144ae80777e12973027bd2f4f5e3ae8eb286cabe787bed9780138", - "sha256:83410258eb886f3456714eea4d4304db3a1fc8624623fc3f38a487ab36c0f653", - "sha256:8b6a7b596ce1d2a6d93c3562f1178ebd3b7bb445b3b0dd33b09f9255e312a965", - "sha256:9576cb63897fbfa69df60f994082c3f4b8e6adb49cccb60efb2a80a208e6f996", - "sha256:95a25d9f3449046ecbe9065be8f8380c03c56081bc5d41fe0fb964aaa30b2195", - "sha256:a424f048bebc4476620e77f3e4d1f282920cef9bc376ba16d0b8fe97eec87cde", - "sha256:aaec1cfd94f4f3e9a25e144d5b0ed1eb8a9596ec36d7318a504d813412563a85", - "sha256:acb673eecbae089ea3be3dcf75bfe45fc8d4dcdc951e27d8691887963cf421c7", - "sha256:b15bc8d2c2848a4a7c04f76c9b3dc3561e95d4dabc6b4f24bfabe5fd81a0b14f", - "sha256:b1c240d565e977d80c0083404c01e4d59c5772c977fae2c483f100567f50847b", - "sha256:c595693de998461bcd49b8d20568c8870b3209b8ea323b2a7b0ea86d85864694", - "sha256:ce3be5d520b4d2c3e5eeb4cd2ef62b9b9ab8ac6b6fedbaa0e39cdb6f50644278", - "sha256:e0f910f84b35c36a3513b96d816e6442ae138862257ae18a0019d2fc67b041dc", - "sha256:ea36e19ac0a483eea239320aef0bd40702404ff8c7e42179a2d9d36c5afcb55c", - "sha256:efabbcd4f406b532206b8801058c8bab9e79645b9880329253ae3322b7b02cd5", - "sha256:f923406e6b32c86309261b8195e24e18b6a8801df0cfc7814ac44017bfcb3939" - ], - "version": "==1.0.1" - }, - "lxml": { - "hashes": [ - "sha256:02bc220d61f46e9b9d5a53c361ef95e9f5e1d27171cd461dddb17677ae2289a5", - "sha256:22f253b542a342755f6cfc047fe4d3a296515cf9b542bc6e261af45a80b8caf6", - "sha256:2f31145c7ff665b330919bfa44aacd3a0211a76ca7e7b441039d2a0b0451e415", - "sha256:36720698c29e7a9626a0dc802ef8885f8f0239bfd1689628ecd459a061f2807f", - "sha256:438a1b0203545521f6616132bfe0f4bca86f8a401364008b30e2b26ec408ce85", - "sha256:4815892904c336bbaf73dafd54f45f69f4021c22b5bad7332176bbf4fb830568", - "sha256:5be031b0f15ad63910d8e5038b489d95a79929513b3634ad4babf77100602588", - "sha256:5c93ae37c3c588e829b037fdfbd64a6e40c901d3f93f7beed6d724c44829a3ad", - "sha256:60842230678674cdac4a1cf0f707ef12d75b9a4fc4a565add4f710b5fcf185d5", - "sha256:62939a8bb6758d1bf923aa1c13f0bcfa9bf5b2fc0f5fa917a6e25db5fe0cfa4e", - "sha256:75830c06a62fe7b8fe3bbb5f269f0b308f19f3949ac81cfd40062f47c1455faf", - "sha256:81992565b74332c7c1aff6a913a3e906771aa81c9d0c68c68113cffcae45bc53", - "sha256:8c892fb0ee52c594d9a7751c7d7356056a9682674b92cc1c4dc968ff0f30c52f", - "sha256:9d862e3cf4fc1f2837dedce9c42269c8c76d027e49820a548ac89fdcee1e361f", - "sha256:a623965c086a6e91bb703d4da62dabe59fe88888e82c4117d544e11fd74835d6", - "sha256:a7783ab7f6a508b0510490cef9f857b763d796ba7476d9703f89722928d1e113", - "sha256:aab09fbe8abfa3b9ce62aaf45aca2d28726b1b9ee44871dbe644050a2fff4940", - "sha256:abf181934ac3ef193832fb973fd7f6149b5c531903c2ec0f1220941d73eee601", - "sha256:ae07fa0c115733fce1e9da96a3ac3fa24801742ca17e917e0c79d63a01eeb843", - "sha256:b9c78242219f674ab645ec571c9a95d70f381319a23911941cd2358a8e0521cf", - "sha256:bccb267678b870d9782c3b44d0cefe3ba0e329f9af8c946d32bf3778e7a4f271", - "sha256:c4df4d27f4c93b2cef74579f00b1d3a31a929c7d8023f870c4b476f03a274db4", - "sha256:caf0e50b546bb60dfa99bb18dfa6748458a83131ecdceaf5c071d74907e7e78a", - "sha256:d3266bd3ac59ac4edcd5fa75165dee80b94a3e5c91049df5f7c057ccf097551c", - "sha256:db0d213987bcd4e6d41710fb4532b22315b0d8fb439ff901782234456556aed1", - "sha256:dbbd5cf7690a40a9f0a9325ab480d0fccf46d16b378eefc08e195d84299bfae1", - "sha256:e16e07a0ec3a75b5ee61f2b1003c35696738f937dc8148fbda9fe2147ccb6e61", - "sha256:e175a006725c7faadbe69e791877d09936c0ef2cf49d01b60a6c1efcb0e8be6f", - "sha256:edd9c13a97f6550f9da2236126bb51c092b3b1ce6187f2bd966533ad794bbb5e", - "sha256:fa39ea60d527fbdd94215b5e5552f1c6a912624521093f1384a491a8ad89ad8b" - ], - "version": "==4.2.5" - }, - "markupsafe": { - "hashes": [ - "sha256:7d263e5770efddf465a9e31b78362d84d015cc894ca2c131901a4445eaa61ee1" - ], - "version": "==1.1.0" - }, - "mat4py": { - "hashes": [ - "sha256:8272ce80747120ff44200b1fde341c657595813e1adf61262e44b52642c10dbe" - ], - "index": "pypi", - "version": "==0.4.1" - }, - "matplotlib": { - "hashes": [ - "sha256:16aa61846efddf91df623bbb4598e63be1068a6b6a2e6361cc802b41c7a286eb", - "sha256:1975b71a33ac986bb39b6d5cfbc15c7b1f218f1134efb4eb3881839d6ae69984", - "sha256:2b222744bd54781e6cc0b717fa35a54e5f176ba2ced337f27c5b435b334ef854", - "sha256:317643c0e88fad55414347216362b2e229c130edd5655fea5f8159a803098468", - "sha256:4269ce3d1b897d46fc3cc2273a0cc2a730345bb47e4456af662e6fca85c89dd7", - "sha256:65214fd668975077cdf8d408ccf2b2d6bdf73b4e6895a79f8e99ce4f0b43fcdb", - "sha256:74bc213ab8a92d86a0b304d9359d1e1d14168d4c6121b83862c9d8a88b89a738", - "sha256:88949be0db54755995dfb0210d0099a8712a3c696c860441971354c3debfc4af", - "sha256:8e1223d868be89423ec95ada5f37aa408ee64fe76ccb8e4d5f533699ba4c0e4a", - "sha256:9fa00f2d7a552a95fa6016e498fdeb6d74df537853dda79a9055c53dfc8b6e1a", - "sha256:c27fd46cab905097ba4bc28d5ba5289930f313fb1970c9d41092c9975b80e9b4", - "sha256:c94b792af431f6adb6859eb218137acd9a35f4f7442cea57e4a59c54751c36af", - "sha256:f4c12a01eb2dc16693887a874ba948b18c92f425c4d329639ece6d3bb8e631bb" - ], - "index": "pypi", - "version": "==3.0.2" - }, - "mistune": { - "hashes": [ - "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e", - "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4" - ], - "version": "==0.8.4" - }, - "munch": { - "hashes": [ - "sha256:6ae3d26b837feacf732fb8aa5b842130da1daf221f5af9f9d4b2a0a6414b0d51" - ], - "version": "==2.3.2" - }, - "nbconvert": { - "hashes": [ - "sha256:08d21cf4203fabafd0d09bbd63f06131b411db8ebeede34b0fd4be4548351779", - "sha256:a8a2749f972592aa9250db975304af6b7337f32337e523a2c995cc9e12c07807" - ], - "version": "==5.4.0" - }, - "nbformat": { - "hashes": [ - "sha256:b9a0dbdbd45bb034f4f8893cafd6f652ea08c8c1674ba83f2dc55d3955743b0b", - "sha256:f7494ef0df60766b7cabe0a3651556345a963b74dbc16bc7c18479041170d402" - ], - "version": "==4.4.0" - }, - "notebook": { - "hashes": [ - "sha256:661341909008d1e7bfa1541904006f9789fa3de1cbec8379d2879819454cc04b", - "sha256:91705b109fc785198faed892489cddb233265564d5e2dad5e4f7974af05ee8dd" - ], - "version": "==5.7.2" - }, - "numpy": { - "hashes": [ - "sha256:0df89ca13c25eaa1621a3f09af4c8ba20da849692dcae184cb55e80952c453fb", - "sha256:154c35f195fd3e1fad2569930ca51907057ae35e03938f89a8aedae91dd1b7c7", - "sha256:18e84323cdb8de3325e741a7a8dd4a82db74fde363dce32b625324c7b32aa6d7", - "sha256:1e8956c37fc138d65ded2d96ab3949bd49038cc6e8a4494b1515b0ba88c91565", - "sha256:23557bdbca3ccbde3abaa12a6e82299bc92d2b9139011f8c16ca1bb8c75d1e95", - "sha256:24fd645a5e5d224aa6e39d93e4a722fafa9160154f296fd5ef9580191c755053", - "sha256:36e36b6868e4440760d4b9b44587ea1dc1f06532858d10abba98e851e154ca70", - "sha256:3d734559db35aa3697dadcea492a423118c5c55d176da2f3be9c98d4803fc2a7", - "sha256:416a2070acf3a2b5d586f9a6507bb97e33574df5bd7508ea970bbf4fc563fa52", - "sha256:4a22dc3f5221a644dfe4a63bf990052cc674ef12a157b1056969079985c92816", - "sha256:4d8d3e5aa6087490912c14a3c10fbdd380b40b421c13920ff468163bc50e016f", - "sha256:4f41fd159fba1245e1958a99d349df49c616b133636e0cf668f169bce2aeac2d", - "sha256:561ef098c50f91fbac2cc9305b68c915e9eb915a74d9038ecf8af274d748f76f", - "sha256:56994e14b386b5c0a9b875a76d22d707b315fa037affc7819cda08b6d0489756", - "sha256:73a1f2a529604c50c262179fcca59c87a05ff4614fe8a15c186934d84d09d9a5", - "sha256:7da99445fd890206bfcc7419f79871ba8e73d9d9e6b82fe09980bc5bb4efc35f", - "sha256:99d59e0bcadac4aa3280616591fb7bcd560e2218f5e31d5223a2e12a1425d495", - "sha256:a4cc09489843c70b22e8373ca3dfa52b3fab778b57cf81462f1203b0852e95e3", - "sha256:a61dc29cfca9831a03442a21d4b5fd77e3067beca4b5f81f1a89a04a71cf93fa", - "sha256:b1853df739b32fa913cc59ad9137caa9cc3d97ff871e2bbd89c2a2a1d4a69451", - "sha256:b1f44c335532c0581b77491b7715a871d0dd72e97487ac0f57337ccf3ab3469b", - "sha256:b261e0cb0d6faa8fd6863af26d30351fd2ffdb15b82e51e81e96b9e9e2e7ba16", - "sha256:c857ae5dba375ea26a6228f98c195fec0898a0fd91bcf0e8a0cae6d9faf3eca7", - "sha256:cf5bb4a7d53a71bb6a0144d31df784a973b36d8687d615ef6a7e9b1809917a9b", - "sha256:db9814ff0457b46f2e1d494c1efa4111ca089e08c8b983635ebffb9c1573361f", - "sha256:df04f4bad8a359daa2ff74f8108ea051670cafbca533bb2636c58b16e962989e", - "sha256:ecf81720934a0e18526177e645cbd6a8a21bb0ddc887ff9738de07a1df5c6b61", - "sha256:edfa6fba9157e0e3be0f40168eb142511012683ac3dc82420bee4a3f3981b30e" - ], - "index": "pypi", - "version": "==1.15.4" - }, - "pandas": { - "hashes": [ - "sha256:11975fad9edbdb55f1a560d96f91830e83e29bed6ad5ebf506abda09818eaf60", - "sha256:12e13d127ca1b585dd6f6840d3fe3fa6e46c36a6afe2dbc5cb0b57032c902e31", - "sha256:1c87fcb201e1e06f66e23a61a5fea9eeebfe7204a66d99df24600e3f05168051", - "sha256:242e9900de758e137304ad4b5663c2eff0d798c2c3b891250bd0bd97144579da", - "sha256:26c903d0ae1542890cb9abadb4adcb18f356b14c2df46e4ff657ae640e3ac9e7", - "sha256:2e1e88f9d3e5f107b65b59cd29f141995597b035d17cc5537e58142038942e1a", - "sha256:31b7a48b344c14691a8e92765d4023f88902ba3e96e2e4d0364d3453cdfd50db", - "sha256:4fd07a932b4352f8a8973761ab4e84f965bf81cc750fb38e04f01088ab901cb8", - "sha256:5b24ca47acf69222e82530e89111dd9d14f9b970ab2cd3a1c2c78f0c4fbba4f4", - "sha256:647b3b916cc8f6aeba240c8171be3ab799c3c1b2ea179a3be0bd2712c4237553", - "sha256:66b060946046ca27c0e03e9bec9bba3e0b918bafff84c425ca2cc2e157ce121e", - "sha256:6efa9fa6e1434141df8872d0fa4226fc301b17aacf37429193f9d70b426ea28f", - "sha256:be4715c9d8367e51dbe6bc6d05e205b1ae234f0dc5465931014aa1c4af44c1ba", - "sha256:bea90da782d8e945fccfc958585210d23de374fa9294a9481ed2abcef637ebfc", - "sha256:d318d77ab96f66a59e792a481e2701fba879e1a453aefeebdb17444fe204d1ed", - "sha256:d785fc08d6f4207437e900ffead930a61e634c5e4f980ba6d3dc03c9581748c7", - "sha256:de9559287c4fe8da56e8c3878d2374abc19d1ba2b807bfa7553e912a8e5ba87c", - "sha256:f4f98b190bb918ac0bc0e3dd2ab74ff3573da9f43106f6dba6385406912ec00f", - "sha256:f71f1a7e2d03758f6e957896ed696254e2bc83110ddbc6942018f1a232dd9dad", - "sha256:fb944c8f0b0ab5c1f7846c686bc4cdf8cde7224655c12edcd59d5212cd57bec0" - ], - "index": "pypi", - "version": "==0.23.4" - }, - "pandocfilters": { - "hashes": [ - "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9" - ], - "version": "==1.4.2" - }, - "parso": { - "hashes": [ - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" - ], - "version": "==0.3.1" - }, - "pickleshare": { - "hashes": [ - "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", - "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" - ], - "version": "==0.7.5" - }, - "plotly": { - "hashes": [ - "sha256:53c647fdb28590de838678029f7d8fdc42f5ba4643d13c2afd2c4e4d56e18426", - "sha256:5dc85bde91bc80fa05f0d89e9f3a8eaee735b2b404047266874e0ff9c104407f" - ], - "index": "pypi", - "version": "==3.4.1" - }, - "prometheus-client": { - "hashes": [ - "sha256:046cb4fffe75e55ff0e6dfd18e2ea16e54d86cc330f369bebcc683475c8b68a9" - ], - "version": "==0.4.2" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:c1d6aff5252ab2ef391c2fe498ed8c088066f66bc64a8d5c095bbf795d9fec34", - "sha256:d4c47f79b635a0e70b84fdb97ebd9a274203706b1ee5ed44c10da62755cf3ec9", - "sha256:fd17048d8335c1e6d5ee403c3569953ba3eb8555d710bfc548faf0712666ea39" - ], - "version": "==2.0.7" - }, - "pygments": { - "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" - ], - "version": "==2.2.0" - }, - "pyparsing": { - "hashes": [ - "sha256:40856e74d4987de5d01761a22d1621ae1c7f8774585acae358aa5c5936c6c90b", - "sha256:f353aab21fd474459d97b709e527b5571314ee5f067441dc9f88e33eecd96592" - ], - "version": "==2.3.0" - }, - "pyproj": { - "file": "https://download.lfd.uci.edu/pythonlibs/h2ufg7oq/pyproj-1.9.5.1-cp37-cp37m-win_amd64.whl", - "hashes": [ - "sha256:2b8d0e937e1fa28b65bb351930ab2df9b5bd78e4cc953f7a5a415ff206a3acde" - ], - "index": "pypi", - "version": "==1.9.5.1" - }, - "pyrsistent": { - "hashes": [ - "sha256:05910b7ff43cec0a853c15da0bfaf2867faa95f29b08e71f5846a195f1f38c75" - ], - "version": "==0.14.7" - }, - "python-dateutil": { - "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" - ], - "version": "==2.7.5" - }, - "pytz": { - "hashes": [ - "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", - "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" - ], - "version": "==2018.7" - }, - "pywinpty": { - "hashes": [ - "sha256:79f2b4584111e36826e587d33eb4e7416a12ae1d6c094cb554e873c5c162fa5f" - ], - "markers": "os_name == 'nt'", - "version": "==0.5.4" - }, - "pyyaml": { - "hashes": [ - "sha256:254bf6fda2b7c651837acb2c718e213df29d531eebf00edb54743d10bcb694eb", - "sha256:3108529b78577327d15eec243f0ff348a0640b0c3478d67ad7f5648f93bac3e2", - "sha256:3c17fb92c8ba2f525e4b5f7941d850e7a48c3a59b32d331e2502a3cdc6648e76", - "sha256:8d6d96001aa7f0a6a4a95e8143225b5d06e41b1131044913fecb8f85a125714b", - "sha256:c8a88edd93ee29ede719080b2be6cb2333dfee1dccba213b422a9c8e97f2967b" - ], - "version": "==4.2b4" - }, - "pyzmq": { - "hashes": [ - "sha256:25a0715c8f69cf72f67cfe5a68a3f3ed391c67c063d2257bec0fe7fc2c7f08f8", - "sha256:2bab63759632c6b9e0d5bf19cc63c3b01df267d660e0abcf230cf0afaa966349", - "sha256:30ab49d99b24bf0908ebe1cdfa421720bfab6f93174e4883075b7ff38cc555ba", - "sha256:32c7ca9fc547a91e3c26fc6080b6982e46e79819e706eb414dd78f635a65d946", - "sha256:41219ae72b3cc86d97557fe5b1ef5d1adc1057292ec597b50050874a970a39cf", - "sha256:4b8c48a9a13cea8f1f16622f9bd46127108af14cd26150461e3eab71e0de3e46", - "sha256:55724997b4a929c0d01b43c95051318e26ddbae23565018e138ae2dc60187e59", - "sha256:65f0a4afae59d4fc0aad54a917ab599162613a761b760ba167d66cc646ac3786", - "sha256:6f88591a8b246f5c285ee6ce5c1bf4f6bd8464b7f090b1333a446b6240a68d40", - "sha256:75022a4c60dcd8765bb9ca32f6de75a0ec83b0d96e0309dc479f4c7b21f26cb7", - "sha256:76ea493bfab18dcb090d825f3662b5612e2def73dffc196d51a5194b0294a81d", - "sha256:7b60c045b80709e4e3c085bab9b691e71761b44c2b42dbb047b8b498e7bc16b3", - "sha256:8e6af2f736734aef8ed6f278f9f552ec7f37b1a6b98e59b887484a840757f67d", - "sha256:9ac2298e486524331e26390eac14e4627effd3f8e001d4266ed9d8f1d2d31cce", - "sha256:9ba650f493a9bc1f24feca1d90fce0e5dd41088a252ac9840131dfbdbf3815ca", - "sha256:a02a4a385e394e46012dc83d2e8fd6523f039bb52997c1c34a2e0dd49ed839c1", - "sha256:a3ceee84114d9f5711fa0f4db9c652af0e4636c89eabc9b7f03a3882569dd1ed", - "sha256:a72b82ac1910f2cf61a49139f4974f994984475f771b0faa730839607eeedddf", - "sha256:ab136ac51027e7c484c53138a0fab4a8a51e80d05162eb7b1585583bcfdbad27", - "sha256:c095b224300bcac61e6c445e27f9046981b1ac20d891b2f1714da89d34c637c8", - "sha256:c5cc52d16c06dc2521340d69adda78a8e1031705924e103c0eb8fc8af861d810", - "sha256:d612e9833a89e8177f8c1dc68d7b4ff98d3186cd331acd616b01bbdab67d3a7b", - "sha256:e828376a23c66c6fe90dcea24b4b72cd774f555a6ee94081670872918df87a19", - "sha256:e9767c7ab2eb552796440168d5c6e23a99ecaade08dda16266d43ad461730192", - "sha256:ebf8b800d42d217e4710d1582b0c8bff20cdcb4faad7c7213e52644034300924" - ], - "version": "==17.1.2" - }, - "qtconsole": { - "hashes": [ - "sha256:1ac4a65e81a27b0838330a6d351c2f8435d4013d98a95373e8a41119b2968390", - "sha256:bc1ba15f50c29ed50f1268ad823bb6543be263c18dd093b80495e9df63b003ac" - ], - "version": "==4.4.3" - }, - "requests": { - "hashes": [ - "sha256:65b3a120e4329e33c9889db89c80976c5272f56ea92d3e74da8a463992e3ff54", - "sha256:ea881206e59f41dbd0bd445437d792e43906703fff75ca8ff43ccdb11f33f263" - ], - "version": "==2.20.1" - }, - "retrying": { - "hashes": [ - "sha256:08c039560a6da2fe4f2c426d0766e284d3b736e355f8dd24b37367b0bb41973b" - ], - "version": "==1.3.3" - }, - "scipy": { - "hashes": [ - "sha256:0611ee97296265af4a21164a5323f8c1b4e8e15c582d3dfa7610825900136bb7", - "sha256:08237eda23fd8e4e54838258b124f1cd141379a5f281b0a234ca99b38918c07a", - "sha256:0e645dbfc03f279e1946cf07c9c754c2a1859cb4a41c5f70b25f6b3a586b6dbd", - "sha256:0e9bb7efe5f051ea7212555b290e784b82f21ffd0f655405ac4f87e288b730b3", - "sha256:108c16640849e5827e7d51023efb3bd79244098c3f21e4897a1007720cb7ce37", - "sha256:340ef70f5b0f4e2b4b43c8c8061165911bc6b2ad16f8de85d9774545e2c47463", - "sha256:3ad73dfc6f82e494195144bd3a129c7241e761179b7cb5c07b9a0ede99c686f3", - "sha256:3b243c77a822cd034dad53058d7c2abf80062aa6f4a32e9799c95d6391558631", - "sha256:404a00314e85eca9d46b80929571b938e97a143b4f2ddc2b2b3c91a4c4ead9c5", - "sha256:423b3ff76957d29d1cce1bc0d62ebaf9a3fdfaf62344e3fdec14619bb7b5ad3a", - "sha256:42d9149a2fff7affdd352d157fa5717033767857c11bd55aa4a519a44343dfef", - "sha256:625f25a6b7d795e8830cb70439453c9f163e6870e710ec99eba5722775b318f3", - "sha256:698c6409da58686f2df3d6f815491fd5b4c2de6817a45379517c92366eea208f", - "sha256:729f8f8363d32cebcb946de278324ab43d28096f36593be6281ca1ee86ce6559", - "sha256:8190770146a4c8ed5d330d5b5ad1c76251c63349d25c96b3094875b930c44692", - "sha256:878352408424dffaa695ffedf2f9f92844e116686923ed9aa8626fc30d32cfd1", - "sha256:8b984f0821577d889f3c7ca8445564175fb4ac7c7f9659b7c60bef95b2b70e76", - "sha256:8f841bbc21d3dad2111a94c490fb0a591b8612ffea86b8e5571746ae76a3deac", - "sha256:c22b27371b3866c92796e5d7907e914f0e58a36d3222c5d436ddd3f0e354227a", - "sha256:d0cdd5658b49a722783b8b4f61a6f1f9c75042d0e29a30ccb6cacc9b25f6d9e2", - "sha256:d40dc7f494b06dcee0d303e51a00451b2da6119acbeaccf8369f2d29e28917ac", - "sha256:d8491d4784aceb1f100ddb8e31239c54e4afab8d607928a9f7ef2469ec35ae01", - "sha256:dfc5080c38dde3f43d8fbb9c0539a7839683475226cf83e4b24363b227dfe552", - "sha256:e24e22c8d98d3c704bb3410bce9b69e122a8de487ad3dbfe9985d154e5c03a40", - "sha256:e7a01e53163818d56eabddcafdc2090e9daba178aad05516b20c6591c4811020", - "sha256:ee677635393414930541a096fc8e61634304bb0153e4e02b75685b11eba14cae", - "sha256:f0521af1b722265d824d6ad055acfe9bd3341765735c44b5a4d0069e189a0f40", - "sha256:f25c281f12c0da726c6ed00535ca5d1622ec755c30a3f8eafef26cf43fede694" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "send2trash": { - "hashes": [ - "sha256:60001cc07d707fe247c94f74ca6ac0d3255aabcb930529690897ca2a39db28b2", - "sha256:f1691922577b6fa12821234aeb57599d887c4900b9ca537948d2dac34aea888b" - ], - "version": "==1.5.0" - }, - "shapely": { - "hashes": [ - "sha256:045e991636787c22bf3e18b57cdaa200681acc0e5db0720123643909d99ad32b", - "sha256:2e8398aacf67cfdfcd64154738c809fea52008afefb4704103f43face369230d", - "sha256:56b8184ef9cf2e2e1dd09ccfe341028af08ea57254524c9458e7f115655385af", - "sha256:7268fd767dc88ef083a528a1e8977a358c7a56cb349aae9e4c36913cfba30857", - "sha256:7e06705e0a20e10f0ce35b233b32b57f6b77044e58e2ad4023d6e64f6c3719a7", - "sha256:937502b7f7bfea39910e30617a30d74ce1b6585895b3d8a2a4602c223a0dd73c", - "sha256:99dc867fe6519c1af1840cceea8bcf5dd1ece077207bdcb19072cdb4fbda8584", - "sha256:9e45485c49fd9ee81a81be756e648a0c1c125e770e3ed42845350d75a46723ad", - "sha256:e3c3eb85f7d4308ccbfcdd23513bfe201b193673c98400219b9a480b903b3033", - "sha256:eb4f295b1ff558857d8061ff7716b1e10ec3c24b5b784bccb51dc87e6fd3ad07", - "sha256:f87c677c0b176827167d1ebad37bba36a9e6baf61f608ff8ef4b9d9ff002c3c3", - "sha256:ffe14cf22da9c95aa87a287ddb96202e3cbb4ec1ec862050d9e4b114307fa206" - ], - "index": "pypi", - "version": "==1.7a1" - }, - "six": { - "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" - ], - "version": "==1.11.0" - }, - "terminado": { - "hashes": [ - "sha256:55abf9ade563b8f9be1f34e4233c7b7bde726059947a593322e8a553cc4c067a", - "sha256:65011551baff97f5414c67018e908110693143cfbaeb16831b743fe7cad8b927" - ], - "version": "==0.8.1" - }, - "testpath": { - "hashes": [ - "sha256:46c89ebb683f473ffe2aab0ed9f12581d4d078308a3cb3765d79c6b2317b0109", - "sha256:b694b3d9288dbd81685c5d2e7140b81365d46c29f5db4bc659de5aa6b98780f8" - ], - "version": "==0.4.2" - }, - "toml": { - "hashes": [ - "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", - "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" - ], - "version": "==0.10.0" - }, - "tornado": { - "hashes": [ - "sha256:0662d28b1ca9f67108c7e3b77afabfb9c7e87bde174fbda78186ecedc2499a9d", - "sha256:4e5158d97583502a7e2739951553cbd88a72076f152b4b11b64b9a10c4c49409", - "sha256:732e836008c708de2e89a31cb2fa6c0e5a70cb60492bee6f1ea1047500feaf7f", - "sha256:8154ec22c450df4e06b35f131adc4f2f3a12ec85981a203301d310abf580500f", - "sha256:8e9d728c4579682e837c92fdd98036bd5cdefa1da2aaf6acf26947e6dd0c01c5", - "sha256:d4b3e5329f572f055b587efc57d29bd051589fb5a43ec8898c77a47ec2fa2bbb", - "sha256:e5f2585afccbff22390cddac29849df463b252b711aa2ce7c5f3f342a5b3b444" - ], - "version": "==5.1.1" - }, - "traitlets": { - "hashes": [ - "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835", - "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9" - ], - "version": "==4.3.2" - }, - "urllib3": { - "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" - ], - "version": "==1.24.1" - }, - "wcwidth": { - "hashes": [ - "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" - ], - "version": "==0.1.7" - }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78" - ], - "version": "==0.5.1" - }, - "widgetsnbextension": { - "hashes": [ - "sha256:14b2c65f9940c9a7d3b70adbe713dbd38b5ec69724eebaba034d1036cf3d4740", - "sha256:fa618be8435447a017fd1bf2c7ae922d0428056cfc7449f7a8641edf76b48265" - ], - "version": "==3.4.2" - } - }, - "develop": {} -} diff --git a/README.md b/README.md index 341ff13..d00579c 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,36 @@ structure where possible. The analysis is done in python (look at the `/src/` fo Development is conducted using a [gitflow](https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow) approach. The `master` branch stores the officialrelease history and the `develop` branch serves as an integration branch for features. Other `hotfix` and `feature` branches should be created and merged as necessary. -## Where to start? -Check .env -Uses pipenv -1. Clone this repository. -2. Pull data from WRL coastal J drive with `make pull-data` -3. Check out jupyter notebook `./notebooks/01_exploration.ipynb` which has an example of how to import the data and some interactive widgets. - -## Requirements +## How to start? + +### # Getting software requirements The following requirements are needed to run various bits: -- [Python 3.6+](https://conda.io/docs/user-guide/install/windows.html): Used for processing and analysing data. Jupyter notebooks are used for exploratory analyis and communication. +- [Anacond](https://www.anaconda.com/download/): Used for processing and analysing data. The Anaconda distribution is used for managing environments and is available for Windows, Mac and Linux. Jupyter notebooks are used for exploratory analyis and communication. - [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and extracting dune crests/toes - [rclone](https://rclone.org/downloads/): Data is not tracked by this repository, but is backed up to a remote Chris Leaman working directory located on the WRL coastal drive. Rclone is used to sync local and remote copies. Ensure rclone.exe is located on your `PATH` environment. - [gnuMake](http://gnuwin32.sourceforge.net/packages/make.htm): A list of commands for processing data is provided in the `./Makefile`. Use gnuMake to launch these commands. Ensure make.exe is located on your `PATH` environment. +- git + +#### Getting the repository +Clone the repository: +``` +git clone http://git.wrl.unsw.edu.au:3000/chrisl/nsw-2016-storm-impact.git +cd nsw-2016-storm-impact +``` + +#### Getting the python environment set up +Commands for setting up the python environment are provided in the `Makefile`. Simply run the following commands in the repo root directory: +``` +make venv-init +make venv-activate +make venv-requirements-install +``` +You can see what these commands are actually running by inspecting the `Makefile`. + +#### Pull data + +#### View notebooks + ## Available data Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can @@ -44,4 +61,5 @@ been corrected for systematic errors, so actual elevations should be taken from - [ ] 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. -- [ ] Investigate using [modin](https://github.com/modin-project/modin) to help speed up analysis. \ No newline at end of file +- [ ] 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? \ No newline at end of file diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..561fc32 --- /dev/null +++ b/environment.yml @@ -0,0 +1,149 @@ +name: C:\Users\z5189959\Desktop\nsw-2016-storm-impact\.venv +channels: + - defaults + - conda-forge +dependencies: + - appdirs=1.4.3=py_1 + - attrs=18.2.0=py_0 + - backcall=0.1.0=py_0 + - black=18.9b0=py_0 + - bleach=3.0.2=py_0 + - boost=1.66.0=py36_vc14_1 + - boost-cpp=1.66.0=vc14_1 + - ca-certificates=2018.10.15=ha4d7672_0 + - certifi=2018.10.15=py36_1000 + - colorama=0.4.0=py_0 + - colorlover=0.2.1=py_0 + - curl=7.60.0=vc14_0 + - entrypoints=0.2.3=py36_1002 + - expat=2.2.5=vc14_0 + - freetype=2.8.1=vc14_0 + - freexl=1.0.2=vc14_2 + - geotiff=1.4.2=vc14_1 + - hdf4=4.2.13=vc14_0 + - hdf5=1.10.1=vc14_2 + - icu=58.2=vc14_0 + - ipykernel=5.1.0=py36h39e3cac_1001 + - ipython=7.1.1=py36h39e3cac_1000 + - jedi=0.13.1=py36_1000 + - jinja2=2.10=py_1 + - jpeg=9b=vc14_2 + - jupyter_client=5.2.3=py_1 + - jupyter_contrib_core=0.3.3=py_2 + - jupyter_contrib_nbextensions=0.5.0=py36_1000 + - jupyter_highlight_selected_word=0.2.0=py36_1000 + - jupyter_latex_envs=1.4.4=py36_1000 + - jupyter_nbextensions_configurator=0.4.0=py36_1000 + - kealib=1.4.7=vc14_4 + - krb5=1.14.6=vc14_0 + - libgdal=2.2.4=vc14_5 + - libiconv=1.14=vc14_4 + - libnetcdf=4.6.1=vc14_2 + - libpng=1.6.34=vc14_0 + - libpq=9.6.3=vc14_0 + - libsodium=1.0.16=vc14_0 + - libspatialite=4.3.0a=vc14_19 + - libtiff=4.0.9=vc14_0 + - libxml2=2.9.5=vc14_1 + - libxslt=1.1.32=vc14_0 + - lxml=4.2.3=py36heafd4d3_0 + - markupsafe=1.1.0=py36hfa6e2cd_1000 + - matplotlib=2.2.2=py36_1 + - mistune=0.8.4=py36hfa6e2cd_1000 + - nbconvert=5.3.1=py_1 + - notebook=5.7.2=py36_1000 + - openjpeg=2.3.0=vc14_2 + - openssl=1.0.2p=hfa6e2cd_1001 + - pandoc=2.4=0 + - pandocfilters=1.4.2=py_1 + - parso=0.3.1=py_0 + - pickleshare=0.7.5=py36_1000 + - proj4=4.9.3=vc14_5 + - prometheus_client=0.4.2=py_0 + - prompt_toolkit=2.0.7=py_0 + - pygments=2.2.0=py_1 + - python=3.6.6=he025d50_0 + - pywinpty=0.5.4=py36_1002 + - pyzmq=17.1.2=py36hf576995_1001 + - qt=5.6.2=vc14_1 + - send2trash=1.5.0=py_0 + - sqlite=3.20.1=vc14_2 + - terminado=0.8.1=py36_1001 + - testpath=0.4.2=py36_1000 + - tk=8.6.8=vc14_0 + - toml=0.10.0=py_0 + - vc=14=0 + - wcwidth=0.1.7=py_1 + - webencodings=0.5.1=py_1 + - winpty=0.4.3=4 + - xerces-c=3.2.0=vc14_0 + - yaml=0.1.7=vc14_0 + - zeromq=4.2.5=vc14_2 + - zlib=1.2.11=vc14_0 + - asn1crypto=0.24.0=py36_0 + - blas=1.0=mkl + - cffi=1.11.5=py36h74b6da3_1 + - chardet=3.0.4=py36_1 + - click=7.0=py36_0 + - click-plugins=1.0.4=py36_0 + - cligj=0.5.0=py36_0 + - cryptography=2.3.1=py36h74b6da3_0 + - cycler=0.10.0=py36h009560c_0 + - decorator=4.3.0=py36_0 + - fiona=1.7.10=py36h5bf8d1d_0 + - gdal=2.2.2=py36hcebd033_1 + - geos=3.6.2=h9ef7328_2 + - icc_rt=2017.0.4=h97af966_0 + - idna=2.7=py36_0 + - intel-openmp=2019.1=144 + - ipython_genutils=0.2.0=py36h3c5d0ee_0 + - jsonschema=2.6.0=py36h7636477_0 + - jupyter_core=4.4.0=py36_0 + - kiwisolver=1.0.1=py36h6538335_0 + - libboost=1.67.0=hd9e427e_4 + - libcurl=7.61.1=h7602738_0 + - libkml=1.3.0=he5f2a48_4 + - libssh2=1.8.0=hd619d38_4 + - m2w64-gcc-libgfortran=5.3.0=6 + - m2w64-gcc-libs=5.3.0=7 + - m2w64-gcc-libs-core=5.3.0=7 + - m2w64-gmp=6.1.0=2 + - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 + - mkl=2018.0.3=1 + - mkl_fft=1.0.6=py36hdbbee80_0 + - mkl_random=1.0.1=py36h77b88f5_1 + - msys2-conda-epoch=20160418=1 + - munch=2.3.2=py36_0 + - nbformat=4.4.0=py36h3a5bc1b_0 + - numpy=1.15.4=py36ha559c80_0 + - numpy-base=1.15.4=py36h8128ebf_0 + - pandas=0.23.4=py36h830ac7b_0 + - pip=18.1=py36_0 + - plotly=3.4.1=py36h28b3542_0 + - pycparser=2.19=py36_0 + - pyopenssl=18.0.0=py36_0 + - pyparsing=2.3.0=py36_0 + - pyproj=1.9.5.1=py36_0 + - pyqt=5.6.0=py36_2 + - pysocks=1.6.8=py36_0 + - python-dateutil=2.7.5=py36_0 + - pytz=2018.7=py36_0 + - pyyaml=3.13=py36hfa6e2cd_0 + - requests=2.20.1=py36_0 + - retrying=1.3.3=py36_2 + - scipy=1.1.0=py36h4f6bf74_1 + - setuptools=40.6.2=py36_0 + - shapely=1.6.4=py36hc90234e_0 + - sip=4.19.8=py36h6538335_0 + - six=1.11.0=py36_1 + - tornado=5.1.1=py36hfa6e2cd_0 + - traitlets=4.3.2=py36h096827d_0 + - urllib3=1.23=py36_0 + - vs2015_runtime=14.15.26706=h3a45250_0 + - wheel=0.32.3=py36_0 + - win_inet_pton=1.0.1=py36_1 + - wincertstore=0.2=py36h7fe50ca_0 + - xz=5.2.4=h2fa13f4_4 + - pip: + - mat4py==0.4.1 +prefix: C:\Users\z5189959\Desktop\nsw-2016-storm-impact\.venv From 0cf76b3165c4b943543cc605483ed7ac31dc5353 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 12:59:21 +1100 Subject: [PATCH 35/65] Update Makefile --- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index c6ad96e..c31a2c7 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ venv-init: ##@environment Setup virtual environment venv-activate: ##@environment Activates the virtual environment activate $(CURRENT_DIR)/.venv -venv-requirements-install: ##@enviornment Ensures environment.yml packages are installed +venv-requirements-install: ##@environment Ensures environment.yml packages are installed conda env update venv-requirements-export: ##@environment Exports current environment to environment.yml @@ -42,7 +42,7 @@ pull-data: ##@data Copies data from data backup directory to ./data/ # Process data .PHONY: process-mat -process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/profiles.csv ./data/interim/tides.csv ##@data Process all .mat to .csv +impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/interim/impacts_forecasted_mean_slope_sto06.csv ./data/interim/impacts_observed.csv ##@products makes obsered and forecasted impacts # Calculates beach orientations at each profile ./data/raw/processed_shorelines/orientations.mat: ./data/raw/processed_shorelines/profiles.mat @@ -95,7 +95,6 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr --slope "foreshore" \ --output-file "./data/interim/twl_foreshore_slope_sto06.csv" -# Creates a forecast of twl using sto06 and prestorm mean foreshore slope ./data/interim/twl_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/analysis/forecast_twl.py create-twl-forecast \ --waves-csv "./data/interim/waves.csv" \ @@ -128,7 +127,7 @@ process-mat: ./data/interim/sites.csv ./data/interim/waves.csv ./data/interim/pr ############################### # Misc commands format: ./src/*.py ##@misc Check python file formatting - pipenv run black --line-length 120 "src/" + activate ./.venv && black --line-length 120 "src/" ############################### From b811565e99a8ce49b334e68ceaad3f57ec390c76 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 12:59:34 +1100 Subject: [PATCH 36/65] Improve README for starting out --- README.md | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index d00579c..00f303c 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Development is conducted using a [gitflow](https://www.atlassian.com/git/tutoria ## How to start? -### # Getting software requirements +#### Getting software requirements The following requirements are needed to run various bits: - [Anacond](https://www.anaconda.com/download/): Used for processing and analysing data. The Anaconda distribution is used for managing environments and is available for Windows, Mac and Linux. Jupyter notebooks are used for exploratory analyis and communication. - [QGIS](https://www.qgis.org/en/site/forusers/download): Used for looking at raw LIDAR pre/post storm surveys and extracting dune crests/toes @@ -18,7 +18,7 @@ The following requirements are needed to run various bits: - git #### Getting the repository -Clone the repository: +Clone the repository onto into your local environment: ``` git clone http://git.wrl.unsw.edu.au:3000/chrisl/nsw-2016-storm-impact.git cd nsw-2016-storm-impact @@ -34,9 +34,20 @@ make venv-requirements-install You can see what these commands are actually running by inspecting the `Makefile`. #### Pull data +The actual raw, interim and processed data are not tracked by the repository as part of good git practices. A copy of the raw data is stored on the WRL Coastal J:\ drive and can be copied using the following command. +``` +make pull-data +``` +If you have updated the data and want to copy it back to the J:\ drive, use the following command. Note that it is probably not a good idea to modify data stored in `./data/raw`. +``` +make push-data +``` #### View notebooks - +Jupyter notebooks have been set up to help explore the data. Once you have set up your environment and pulled the data, this is probably a good place to start as you. To run the notebook, use the following command and navigate to the `./notebooks` folder. +``` +jupyter notebook +``` ## Available data Raw, interim and processed data used in this analysis is kept in the `/data/` folder. Data is not tracked in the repository due to size constraints, but stored locally. A mirror is kept of the coastal folder J drive which you can From 022c7b890754e428e3c9045726dac5854b68c226 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 14:51:52 +1100 Subject: [PATCH 37/65] Update notebook --- notebooks/01_exploration.ipynb | 108 +++++++++++++++++++-------------- 1 file changed, 61 insertions(+), 47 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 03189fd..9150b26 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -10,11 +10,11 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2018-11-25T21:56:41.533322Z", - "start_time": "2018-11-25T21:56:41.362045Z" + "end_time": "2018-11-27T03:27:16.641947Z", + "start_time": "2018-11-27T03:27:15.791353Z" } }, "outputs": [], @@ -29,11 +29,11 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2018-11-25T21:57:10.456785Z", - "start_time": "2018-11-25T21:56:41.534324Z" + "end_time": "2018-11-27T03:27:16.655952Z", + "start_time": "2018-11-27T03:27:16.642938Z" }, "scrolled": true }, @@ -70,11 +70,11 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": { "ExecuteTime": { - "end_time": "2018-11-25T21:57:33.969096Z", - "start_time": "2018-11-25T21:57:10.456785Z" + "end_time": "2018-11-27T03:27:31.268696Z", + "start_time": "2018-11-27T03:27:16.657959Z" }, "pixiedust": { "displayParams": {} @@ -130,23 +130,23 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2018-11-25T22:27:09.754717Z", - "start_time": "2018-11-25T22:27:06.633214Z" + "end_time": "2018-11-27T03:27:34.422864Z", + "start_time": "2018-11-27T03:27:31.278426Z" }, "code_folding": [ 408 ], - "hide_input": false, + "hide_input": true, "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9bf50bbca81147ee9d37120a32bed4ea", + "model_id": "80589953e2e04fecb2a0f3add40b3d5b", "version_major": 2, "version_minor": 0 }, @@ -166,45 +166,45 @@ "

\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), options=('swash', 'collision', 'overwash'), value=('swash', 'collision', 'overwash')))))))), HBox(children=(VBox(children=(HTML(value='Filter by site_id:'), HBox(children=(Dropdown(description='site_id: ', index=942, options=('AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', 'AVOCAn0004', 'AVOCAn0005', 'AVOCAn0006', 'AVOCAn0007', 'AVOCAn0008', 'AVOCAn0009', '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", + "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), options=('swash', 'collision', 'overwash'), value=('swash', 'collision', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('swash', 'overwash', 'collision'), value=('swash', 'overwash', 'collision')))))))), 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': 'c8ea5f67-a68e-492f-a718-c6d2b6a1a3ab',\n", + " 'uid': 'dede4ee7-342d-41c2-b899-daa42347f70c',\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': 'ac860cf0-1e87-4a16-b5a1-ef914032c675',\n", + " 'uid': 'd51ed30f-dc58-4334-a0d2-e0e76b9f3ff4',\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': '6d629f5f-ecdb-4a38-b5da-9390e53902c4',\n", + " 'uid': 'a09876d4-eebe-4a20-9f56-ddf10095c5de',\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': '7caff243-2d24-4b71-9eea-a037a121f7ff',\n", + " 'uid': '329c7dd8-2f5a-42e9-9813-81b6acb08419',\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': '0797ed89-9dd1-4b71-bbb9-dde65ce0e010',\n", + " 'uid': '8cef75dd-a4eb-40de-8149-a6179a9c6ba6',\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': '6db4b49a-049d-4182-b307-f14deeb8af01',\n", + " 'uid': 'c1691092-a100-4799-a807-13d8c2dc0679',\n", " 'x': [0],\n", " 'y': [0]}],\n", " 'layout': {'height': 300,\n", @@ -224,16 +224,16 @@ " 'title': 'z (m)',\n", " 'zeroline': True}}\n", "}), FigureWidget({\n", - " 'data': [{'lat': array([-33.46381539, -33.46301835, -33.46221051, ..., -33.4279646 ,\n", - " -33.42732743, -33.42671036]),\n", - " 'lon': array([151.43639576, 151.43690633, 151.43738179, ..., 151.4501613 ,\n", - " 151.45092222, 151.45170635]),\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=' Date: Tue, 27 Nov 2018 14:53:32 +1100 Subject: [PATCH 38/65] Parse new profiles.mat from Mitch Mitch has updated profiles.mat to include more information, like time of LIDAR acquisition, profile flags and recovery profiles. The updates to the code parse this new information. --- .env | 4 +- src/analysis/forecast_twl.py | 4 +- src/analysis/observed_storm_impacts.py | 44 +++-- src/data/__init__.py | 0 src/data/csv_to_shp.py | 15 +- src/data/parse_mat.py | 259 ++++++++++++++----------- src/data/profile_features.py | 34 ++-- src/logging.yaml | 50 +++++ src/utils.py | 16 ++ 9 files changed, 271 insertions(+), 155 deletions(-) create mode 100644 src/data/__init__.py create mode 100644 src/logging.yaml create mode 100644 src/utils.py diff --git a/.env b/.env index de5e5c4..8a4468b 100644 --- a/.env +++ b/.env @@ -10,11 +10,9 @@ MATLAB_PATH="C:/Program Files/MATLAB/R2016b/bin/win64/MATLAB.exe" # total water level. MULTIPROCESS_THREADS=2 -# GDAL_DATA="C://Users//z5189959//Desktop//nsw-2016-storm-impact//.venv//Library//share//gdal" - # The settings below should be left as is unless you know what you're doing. # Need to set pythonpath so that relative imports can be properly used in with pipenv # Refer to https://stackoverflow.com/q/52986500 and https://stackoverflow.com/a/49797761 -PYTHONPATH=${PWD} \ No newline at end of file +# PYTHONPATH=${PWD} \ No newline at end of file diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index e15df6e..ddc93a6 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -7,8 +7,7 @@ import numpy.ma as ma import pandas as pd from scipy import stats - -from src.analysis import runup_models +import runup_models logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) @@ -266,6 +265,7 @@ def crossings(profile_x, profile_z, constant_z): z = np.subtract(profile_z, constant_z) # Find all indices right before any crossing. + # TODO Sometimes this can give a runtime warning https://stackoverflow.com/a/36489085 indicies = np.where(z[:-1] * z[1:] < 0)[0] # Use linear interpolation to find intersample crossings. diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 0aadbbe..80bdbda 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -48,6 +48,11 @@ def volume_change(df_profiles, df_profile_features, zone): if np.isnan(prestorm_dune_toe_x): prestorm_dune_toe_x = prestorm_dune_crest_x + # If no prestorm and poststorm profiles, skip site and continue + profile_lengths = [len(df_site.query("profile_type == '{}'".format(x))) for x in ['prestorm', 'poststorm']] + if any([length ==0 for length in profile_lengths]): + continue + # Find last x coordinate where we have both prestorm and poststorm measurements. If we don't do this, # the prestorm and poststorm values are going to be calculated over different lengths. df_zone = df_site.dropna(subset=["z"]) @@ -128,25 +133,26 @@ def storm_regime(df_observed_impacts): return df_observed_impacts -if __name__ == "__main__": - logger.info("Importing existing data") - data_folder = "./data/interim" - df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) - - logger.info("Creating new dataframe for observed impacts") - df_observed_impacts = pd.DataFrame(index=df_profile_features.index) - - logger.info("Getting pre/post storm volumes") - df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") - df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone="dune_face") - df_observed_impacts = df_observed_impacts.join([df_swash_vol_changes, df_dune_face_vol_changes]) - - # Classify regime based on volume changes - df_observed_impacts = storm_regime(df_observed_impacts) - - # Save dataframe to csv - df_observed_impacts.to_csv(os.path.join(data_folder, "impacts_observed.csv")) +# +# if __name__ == "__main__": +# logger.info("Importing existing data") +# data_folder = "./data/interim" +# df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) +# df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) +# +# logger.info("Creating new dataframe for observed impacts") +# df_observed_impacts = pd.DataFrame(index=df_profile_features.index) +# +# logger.info("Getting pre/post storm volumes") +# df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") +# df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone="dune_face") +# df_observed_impacts = df_observed_impacts.join([df_swash_vol_changes, df_dune_face_vol_changes]) +# +# # Classify regime based on volume changes +# df_observed_impacts = storm_regime(df_observed_impacts) +# +# # Save dataframe to csv +# df_observed_impacts.to_csv(os.path.join(data_folder, "impacts_observed.csv")) @click.command() diff --git a/src/data/__init__.py b/src/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/data/csv_to_shp.py b/src/data/csv_to_shp.py index 39525fa..a5438c2 100644 --- a/src/data/csv_to_shp.py +++ b/src/data/csv_to_shp.py @@ -2,15 +2,20 @@ Converts .csv files to .shape files """ +import os +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + import click import fiona import pandas as pd from fiona.crs import from_epsg from shapely.geometry import Point, mapping -import logging.config -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +from utils import setup_logging + +logger = setup_logging() @click.command() @@ -25,11 +30,11 @@ def sites_csv_to_shp(input_csv, output_shp): """ logger.info("Converting %s to %s", input_csv, output_shp) df_sites = pd.read_csv(input_csv, index_col=[0]) - + logger.info(os.environ.get("GDAL_DATA", None)) schema = {"geometry": "Point", "properties": {"beach": "str", "site_id": "str"}} with fiona.open(output_shp, "w", crs=from_epsg(4326), driver="ESRI Shapefile", schema=schema) as output: for index, row in df_sites.iterrows(): - point = Point(row["lon"], row["lat"]) + point = Point(row["x_200_lon"], row["x_200_lat"]) prop = {"beach": row["beach"], "site_id": index} output.write({"geometry": mapping(point), "properties": prop}) logger.info("Done!") diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index d6f7cb2..de17dfc 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -2,15 +2,25 @@ Converts raw .mat files into a flattened .csv structure which can be imported into python pandas. """ -import logging.config +import os +import sys + +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + from datetime import datetime, timedelta +import math + + import click +import numpy as np import pandas as pd from mat4py import loadmat -import numpy as np +from shapely.geometry import Point + +from profile_features import convert_coord_systems +from utils import setup_logging -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +logger = setup_logging() def parse_orientations(orientations_mat): @@ -134,7 +144,7 @@ def parse_tides(tides_mat): return df -def parse_profiles(profiles_mat): +def parse_profiles_and_sites(profiles_mat): """ Parses the raw profiles.mat file and returns a pandas dataframe :param tides_mat: @@ -142,39 +152,108 @@ def parse_profiles(profiles_mat): """ logger.info("Parsing %s", profiles_mat) mat_data = loadmat(profiles_mat)["data"] - rows = [] - for i in range(0, len(mat_data["site"])): - for j in range(0, len(mat_data["pfx"][i])): - for profile_type in ["prestorm", "poststorm"]: - - if profile_type == "prestorm": - z = mat_data["pf1"][i][j][0] - if profile_type == "poststorm": - z = mat_data["pf2"][i][j][0] - - rows.append( - { - "beach": mat_data["site"][i], - "lon": mat_data["lon"][i], - "lat": mat_data["lat"][i], - "profile_type": profile_type, - "x": mat_data["pfx"][i][j][0], - "z": z, - } - ) + profile_rows = [] + site_rows = [] + site_counter = 0 + + for i, site in enumerate(mat_data["site"]): + + # Give each site a unique id + if len(site_rows) == 0 or site_rows[-1]["beach"] != site: + site_counter = 1 + else: + site_counter += 1 + site_id = "{}{:04d}".format(site, site_counter) + + # Initalize location of x=200m latitude and longitude + x_200_lat = np.nan + x_200_lon = np.nan + + # Want to calculation the orientation + orientation = {} + + for x, lat, lon, z_prestorm, z_poststorm, easting, northing in zip( + mat_data["x"][i], + mat_data["lats"][i], + mat_data["lons"][i], + mat_data["Zpre"][i], + mat_data["Zpost"][i], + mat_data["eastings"][i], + mat_data["northings"][i], + ): + + # Only extract pre and post storm profile + for j, profile_type in enumerate(["prestorm", "poststorm"]): + + if mat_data["isgood"][i][j] == 1: + land_lim = mat_data["landlims"][i][j] + survey_datetime = matlab_datenum_to_datetime(mat_data["surveydates"][i][j]) + + if profile_type == "prestorm": + z = z_prestorm + else: + z = z_poststorm + + # Keep a record of the where the center of the profile is located, and the locations of the land + # and sea + + # TODO: This code isn't very transferrable. What if we don't have lat/lons at 200 m? Relook at this + if x[0] == 200: + x_200_lat = lat[0] + x_200_lon = lon[0] + elif x[0] == 0: + orientation["land_easting"] = easting[0] + orientation["land_northing"] = northing[0] + elif x[0] == 400: + orientation["sea_easting"] = easting[0] + orientation["sea_northing"] = northing[0] + + profile_rows.append( + { + "site_id": site_id, + "lon": lon[0], + "lat": lat[0], + "profile_type": profile_type, + "x": x[0], + "z": z[0], + "land_lim": land_lim, + "survey_datetime": survey_datetime, + } + ) + + orientation = math.degrees( + math.atan2( + orientation["land_northing"] - orientation["sea_northing"], + orientation["land_easting"] - orientation["sea_easting"], + ) + ) + site_rows.append( + { + "site_id": site_id, + "beach": site, + "lat": x_200_lat, + "lon": x_200_lon, + "orientation": orientation, + "profile_x_lat_lon": 200, + } + ) - df = pd.DataFrame(rows) - return df + df_profiles = pd.DataFrame(profile_rows) + df_sites = pd.DataFrame(site_rows) + + logger.info("Parsed profiles and sites") + return df_profiles, df_sites def remove_zeros(df_profiles): """ When parsing the pre/post storm profiles, the end of some profiles have constant values of zero. Let's change these to NaNs for consistancy. Didn't use pandas fillnan because 0 may still be a valid value. - :param df: + :param df_profiles: :return: """ + logger.info("Removing zeros from end of profiles") df_profiles = df_profiles.sort_index() groups = df_profiles.groupby(level=["site_id", "profile_type"]) for key, _ in groups: @@ -185,6 +264,7 @@ def remove_zeros(df_profiles): df_profile = df_profiles[idx_site] x_last_ele = df_profile[df_profile.z != 0].index.get_level_values("x")[-1] df_profiles.loc[idx_site & (df_profiles.index.get_level_values("x") > x_last_ele), "z"] = np.nan + logger.info("Removed zeros from end of profiles") return df_profiles @@ -198,31 +278,7 @@ def matlab_datenum_to_datetime(matlab_datenum): return datetime.fromordinal(int(matlab_datenum)) + timedelta(days=matlab_datenum % 1) - timedelta(days=366) -def get_unique_sites(dfs, cols=["beach", "lat", "lon"]): - """ - Generates a dataframe of unique sites based on beach names, lats and lons. Creates a unique site ID for each. - :param dfs: - :param cols: - :return: - """ - - rows = [] - df_all = pd.concat([df[cols] for df in dfs]) - beach_groups = df_all.groupby(["beach"]) - for beach_name, beach_group in beach_groups: - site_groups = beach_group.groupby(["lat", "lon"]) - siteNo = 1 - for site_name, site_group in site_groups: - site = "{}{:04d}".format(beach_name, siteNo) - rows.append({"site_id": site, "lat": site_name[0], "lon": site_name[1], "beach": beach_name}) - siteNo += 1 - - df = pd.DataFrame(rows) - - return df - - -def replace_unique_sites(df, df_sites, cols=["lat", "lon"]): +def replace_unique_sites(df, df_sites): """ Replaces beach/lat/lon columns with the unique site_id :param dfs: @@ -232,56 +288,37 @@ def replace_unique_sites(df, df_sites, cols=["lat", "lon"]): # Make the sites index a column, so it can be merged into df df_sites["site_id"] = df_sites.index.get_level_values("site_id") - # Merging on a float can lead to subtle bugs. Lets convert lat/lons to integers and merge on that instead - precision = 8 - df_sites["lat_int"] = np.round(df_sites["lat"] * 10 ** precision).astype(np.int64) - df_sites["lon_int"] = np.round(df_sites["lon"] * 10 ** precision).astype(np.int64) - df["lat_int"] = np.round(df["lat"] * 10 ** precision).astype(np.int64) - df["lon_int"] = np.round(df["lon"] * 10 ** precision).astype(np.int64) + # Create eastings and northings so we can calculate distances + site_points = [convert_coord_systems(Point(lon, lat)).xy for lon, lat in zip(df_sites["lon"], df_sites["lat"])] + df_sites["easting"] = [x[0][0] for x in site_points] + df_sites["northing"] = [x[1][0] for x in site_points] - df_merged = df.merge(df_sites, on=["lat_int", "lon_int"]) + # Process each unique combination lat/lons in groups + groups = df.groupby(["lat", "lon"]) + for (lat, lon), df_group in groups: - # Check that all our records have a unique site identifier - n_unmatched = len(df) - len(df_merged) - if n_unmatched > 0: - logger.warning("Not all records (%d of %d) matched with a unique site", n_unmatched, len(df)) - - df_merged = df_merged.drop( - columns=[ - "lat_x", - "lon_x", - "lat_int", - "lon_int", - "beach_y", - "beach_x", - "lat_y", - "lon_y", - "orientation", - "profile_x_lat_lon", - ] - ) + # Calculate distances from each point to each site and determine closest site + easting, northing = [x[0] for x in convert_coord_systems(Point(lon, lat)).xy] + distances_to_sites = np.sqrt((df_sites["easting"] - easting) ** 2 + (df_sites["northing"] - northing) ** 2) + min_distance = distances_to_sites.min() + closest_site = distances_to_sites.idxmin() - return df_merged + # Do some logging so we can check later. + if min_distance > 1: + logger.warning("Closest site to (%.4f,%.4f) is %s (%.2f m away)", lat, lon, closest_site, min_distance) + else: + logger.info("Closest site to (%.4f,%.4f) is %s (%.2f m away)", lat, lon, closest_site, min_distance) + # Assign site_id based on closest site + df.loc[df_group.index, "site_id"] = closest_site -@click.command(short_help="create sites.csv") -@click.option("--waves-mat", required=True, help=".mat file containing wave records") -@click.option("--tides-mat", required=True, help=".mat file containing tide records") -@click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") -@click.option("--orientations-mat", required=True, help=".mat file containing orientation of beach profiles") -@click.option("--output-file", required=True, help="where to save sites.csv") -def create_sites_csv(waves_mat, tides_mat, profiles_mat, orientations_mat, output_file): - logger.info("Creating %s", output_file) - df_waves = parse_waves(waves_mat=waves_mat) - df_tides = parse_tides(tides_mat=tides_mat) - df_profiles = parse_profiles(profiles_mat=profiles_mat) - df_orientations = parse_orientations(orientations_mat=orientations_mat) - df_sites = get_unique_sites(dfs=[df_waves, df_tides, df_profiles]) - df_sites = combine_sites_and_orientaions(df_sites, df_orientations) - df_sites = specify_lat_lon_profile_center(df_sites) - df_sites.set_index(["site_id"], inplace=True) - df_sites.to_csv(output_file) - logger.info("Created %s", output_file) + nan_count = df.site_id.isna().sum() + if nan_count > 0: + logger.warning("Not all records (%d of %d) matched with a unique site", nan_count, len(df)) + + df = df.drop(columns=["lat", "lon", "beach"]) + + return df @click.command(short_help="create waves.csv") @@ -301,17 +338,22 @@ def create_waves_csv(waves_mat, sites_csv, output_file): @click.command(short_help="create profiles.csv") @click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") -@click.option("--sites-csv", required=True, help=".csv file description of cross section sites") -@click.option("--output-file", required=True, help="where to save profiles.csv") -def create_profiles_csv(profiles_mat, sites_csv, output_file): - logger.info("Creating %s", output_file) - df_profiles = parse_profiles(profiles_mat=profiles_mat) - df_sites = pd.read_csv(sites_csv, index_col=[0]) - df_profiles = replace_unique_sites(df_profiles, df_sites) +@click.option("--profiles-output-file", required=True, help="where to save profiles.csv") +@click.option("--sites-output-file", required=True, help="where to save sites.csv") +def create_sites_and_profiles_csv(profiles_mat, profiles_output_file, sites_output_file): + logger.info("Creating sites and profiles csvs") + df_profiles, df_sites = parse_profiles_and_sites(profiles_mat=profiles_mat) df_profiles.set_index(["site_id", "profile_type", "x"], inplace=True) df_profiles.sort_index(inplace=True) - df_profiles.to_csv(output_file) - logger.info("Created %s", output_file) + df_profiles = remove_zeros(df_profiles) + + df_sites.set_index(["site_id"], inplace=True) + df_sites.sort_index(inplace=True) + + df_profiles.to_csv(profiles_output_file) + logger.info("Created %s", profiles_output_file) + df_sites.to_csv(sites_output_file) + logger.info("Created %s", sites_output_file) @click.command(short_help="create profiles.csv") @@ -335,8 +377,7 @@ def cli(): if __name__ == "__main__": - cli.add_command(create_sites_csv) cli.add_command(create_waves_csv) - cli.add_command(create_profiles_csv) + cli.add_command(create_sites_and_profiles_csv) cli.add_command(create_tides_csv) cli() diff --git a/src/data/profile_features.py b/src/data/profile_features.py index 78ba406..cb63568 100644 --- a/src/data/profile_features.py +++ b/src/data/profile_features.py @@ -15,22 +15,6 @@ logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) logger = logging.getLogger(__name__) -def shapes_from_shp(shp_file): - """ - Parses a shape file and returns a list of shapely shapes, ids and properties - :param shp_file: - :return: - """ - shapes = [] - ids = [] - properties = [] - for feat in fiona.open(shp_file, "r"): - shapes.append(shape(feat["geometry"])) - ids.append(feat["id"]) - properties.append(feat["properties"]) - return shapes, ids, properties - - def convert_coord_systems(g1, in_coord_system="EPSG:4326", out_coord_system="EPSG:28356"): """ Converts coordinates from one coordinates system to another. Needed because shapefiles are usually defined in @@ -50,6 +34,22 @@ def convert_coord_systems(g1, in_coord_system="EPSG:4326", out_coord_system="EPS return g2 +def shapes_from_shp(shp_file): + """ + Parses a shape file and returns a list of shapely shapes, ids and properties + :param shp_file: + :return: + """ + shapes = [] + ids = [] + properties = [] + for feat in fiona.open(shp_file, "r"): + shapes.append(shape(feat["geometry"])) + ids.append(feat["id"]) + properties.append(feat["properties"]) + return shapes, ids, properties + + def distance_to_intersection(lat, lon, landward_orientation, beach, line_strings, line_properties): """ Returns the distance at whjch a line drawn from a lat/lon at an orientation intersects a line stinrg @@ -143,7 +143,7 @@ def parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp): lambda row: beach_profile_elevation(row["{}_x".format(feat)], df_profiles, "prestorm", row.name), axis=1 ) - df_profile_features = df_profile_features.drop(columns=["beach", "lat", "lon", "orientation"]) + df_profile_features = df_profile_features.drop(columns=["beach", "lat", "lon", "orientation", "profile_x_lat_lon"]) return df_profile_features diff --git a/src/logging.yaml b/src/logging.yaml new file mode 100644 index 0000000..fc82b31 --- /dev/null +++ b/src/logging.yaml @@ -0,0 +1,50 @@ +--- +version: 1 +disable_existing_loggers: False +formatters: + simple: + format: "%(asctime)s - %(filename)s - %(levelname)s - %(message)s" + +handlers: + console: + class: logging.StreamHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout + + info_file_handler: + class: logging.handlers.RotatingFileHandler + level: INFO + formatter: simple + filename: info.log + maxBytes: 10485760 # 10MB + backupCount: 3 + encoding: utf8 + + warning_file_handler: + class: logging.handlers.RotatingFileHandler + level: WARNING + formatter: simple + filename: warning.log + maxBytes: 10485760 # 10MB + backupCount: 3 + encoding: utf8 + + error_file_handler: + class: logging.handlers.RotatingFileHandler + level: ERROR + formatter: simple + filename: error.log + maxBytes: 10485760 # 10MB + backupCount: 3 + encoding: utf8 + +loggers: + my_module: + level: ERROR + handlers: [console] + propagate: no + +root: + level: INFO + handlers: [console, info_file_handler, error_file_handler, warning_file_handler] diff --git a/src/utils.py b/src/utils.py new file mode 100644 index 0000000..0df1fc6 --- /dev/null +++ b/src/utils.py @@ -0,0 +1,16 @@ +import logging.config +import os +import yaml + + +def setup_logging(path="./src/logging.yaml", default_level=logging.INFO): + """ + Setup logging configuration + """ + if os.path.exists(path): + with open(path, "rt") as f: + config = yaml.safe_load(f.read()) + logging.config.dictConfig(config) + else: + logging.basicConfig(level=default_level) + return logging.getLogger(__name__) From 44b1ac3775e2e00c1d9136ae154b75810be223ae Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 15:25:51 +1100 Subject: [PATCH 39/65] Fix logging and cli Logging now uses .yaml file and is stored in the utils.py file. New CLI entrypoint has been created cli.py to deal with relative import issues - when running the analysis, this should be used as the main entrypoint. --- Makefile | 27 ++++++++++++-------- src/__init__.py | 0 src/analysis/__init__.py | 0 src/analysis/analysis.py | 15 ----------- src/analysis/compare_impacts.py | 6 ++--- src/analysis/forecast_twl.py | 18 +++---------- src/analysis/forecasted_storm_impacts.py | 18 +++---------- src/analysis/observed_storm_impacts.py | 21 ++++------------ src/cli.py | 29 +++++++++++++++++++++ src/data/__init__.py | 0 src/data/csv_to_shp.py | 16 ------------ src/data/parse_mat.py | 10 ++------ src/data/profile_features.py | 17 +++---------- src/logging.conf | 32 ------------------------ 14 files changed, 66 insertions(+), 143 deletions(-) delete mode 100644 src/__init__.py delete mode 100644 src/analysis/__init__.py delete mode 100644 src/analysis/analysis.py create mode 100644 src/cli.py delete mode 100644 src/data/__init__.py delete mode 100644 src/logging.conf diff --git a/Makefile b/Makefile index c31a2c7..1914a02 100644 --- a/Makefile +++ b/Makefile @@ -48,36 +48,43 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte ./data/raw/processed_shorelines/orientations.mat: ./data/raw/processed_shorelines/profiles.mat $(MATLAB_PATH) -nosplash -r "cd $(CURRENT_DIR); run('./src/data/beach_orientations.m'); quit" +# # Produces a .csv of sites where our beach cross-sections are located +# ./data/interim/sites.csv ./data/interim/profiles.csv: ./data/raw/processed_shorelines/profiles.mat +# activate ./.venv && python ./src/data/parse_mat.py create-sites-and-profiles-csv \ +# --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ +# --profiles-output-file "./data/interim/profiles.csv" \ +# --sites-output-file "./data/interim/sites.csv" + # Produces a .csv of sites where our beach cross-sections are located ./data/interim/sites.csv ./data/interim/profiles.csv: ./data/raw/processed_shorelines/profiles.mat - activate ./.venv && python ./src/data/parse_mat.py create-sites-and-profiles-csv \ + activate ./.venv && python ./src/cli.py create-sites-and-profiles-csv \ --profiles-mat "./data/raw/processed_shorelines/profiles.mat" \ --profiles-output-file "./data/interim/profiles.csv" \ --sites-output-file "./data/interim/sites.csv" # Produces a .csv of waves for each site ./data/interim/waves.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/waves.mat - activate ./.venv && python ./src/data/parse_mat.py create-waves-csv \ + activate ./.venv && python ./src/cli.py create-waves-csv \ --waves-mat "./data/raw/processed_shorelines/waves.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/waves.csv" # Produces a .csv of tides for each site ./data/interim/tides.csv: ./data/interim/sites.csv ./data/raw/processed_shorelines/tides.mat - activate ./.venv && python ./src/data/parse_mat.py create-tides-csv \ + activate ./.venv && python ./src/cli.py create-tides-csv \ --tides-mat "./data/raw/processed_shorelines/tides.mat" \ --sites-csv "./data/interim/sites.csv" \ --output-file "./data/interim/tides.csv" # Creates a .shp of our sites to load into QGis ./data/interim/sites.shp: ./data/interim/sites.csv - activate ./.venv && python ./src/data/csv_to_shp.py sites-csv-to-shp \ + activate ./.venv && python ./src/cli.py sites-csv-to-shp \ --input-csv "./data/interim/sites.csv" \ --output-shp "./data/interim/sites.shp" # Creates a .csv of our dune toe and crest profile features ./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv - activate ./.venv && python ./src/data/profile_features.py create-profile-features \ + activate ./.venv && python ./src/cli.py create-profile-features \ --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ --dune-toe-shp "./data/raw/profile_features/dune_toes.shp" \ --sites-csv "./data/interim/sites.csv" \ @@ -86,7 +93,7 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte # Creates a forecast of twl using sto06 and prestorm time varying prestorm foreshore slope ./data/interim/twl_foreshore_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/analysis/forecast_twl.py create-twl-forecast \ + 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" \ @@ -96,7 +103,7 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --output-file "./data/interim/twl_foreshore_slope_sto06.csv" ./data/interim/twl_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/analysis/forecast_twl.py create-twl-forecast \ + 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" \ @@ -106,19 +113,19 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --output-file "./data/interim/twl_mean_slope_sto06.csv" ./data/interim/impacts_observed.csv: ./data/interim/profiles.csv ./data/interim/profile_features.csv - activate ./.venv && python ./src/analysis/observed_storm_impacts.py create-observed-impacts \ + activate ./.venv && python ./src/cli.py create-observed-impacts \ --profiles-csv "./data/interim/profiles.csv" \ --profile-features-csv "./data/interim/profile_features.csv" \ --output-file "./data/interim/impacts_observed.csv" ./data/interim/impacts_forecasted_mean_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_mean_slope_sto06.csv - activate ./.venv && python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + activate ./.venv && python ./src/cli.py create-forecasted-impacts \ --profile-features-csv "./data/interim/profile_features.csv" \ --forecasted-twl-csv "./data/interim/twl_mean_slope_sto06.csv" \ --output-file "./data/interim/impacts_forecasted_mean_slope_sto06.csv" ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv: ./data/interim/profile_features.csv ./data/interim/twl_foreshore_slope_sto06.csv - activate ./.venv && python ./src/analysis/forecasted_storm_impacts.py create-forecasted-impacts \ + activate ./.venv && python ./src/cli.py create-forecasted-impacts \ --profile-features-csv "./data/interim/profile_features.csv" \ --forecasted-twl-csv "./data/interim/twl_foreshore_slope_sto06.csv" \ --output-file "./data/interim/impacts_forecasted_foreshore_slope_sto06.csv" diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/analysis/__init__.py b/src/analysis/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/analysis/analysis.py b/src/analysis/analysis.py deleted file mode 100644 index 1d1f9a9..0000000 --- a/src/analysis/analysis.py +++ /dev/null @@ -1,15 +0,0 @@ -import pandas as pd -import os - - -def main(): - - data_folder = "./data/interim" - df_waves = pd.read_csv(os.path.join(data_folder, "waves.csv"), index_col=[0, 1]) - df_tides = pd.read_csv(os.path.join(data_folder, "tides.csv"), index_col=[0, 1]) - df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) - df_sites = pd.read_csv(os.path.join(data_folder, "sites.csv"), index_col=[0]) - - -if __name__ == "__main__": - main() diff --git a/src/analysis/compare_impacts.py b/src/analysis/compare_impacts.py index e6a3837..fdae771 100644 --- a/src/analysis/compare_impacts.py +++ b/src/analysis/compare_impacts.py @@ -2,13 +2,13 @@ Compares forecasted and observed impacts, putting them into one data frame and exporting the results. """ -import logging.config import os import pandas as pd -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +from utils import setup_logging + +logger = setup_logging() def compare_impacts(df_forecasted, df_observed): diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index ddc93a6..06d7bf4 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -1,16 +1,16 @@ -import logging.config import os from multiprocessing import Pool + import click import numpy as np import numpy.ma as ma import pandas as pd from scipy import stats -import runup_models +from analysis import runup_models +from utils import setup_logging -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +logger = setup_logging() MULTIPROCESS_THREADS = int(os.environ.get("MULTIPROCESS_THREADS", 4)) @@ -301,13 +301,3 @@ def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv df_twl_foreshore_slope_sto06.to_csv(output_file) logger.info("Saved to %s", output_file) logger.info("Done!") - - -@click.group() -def cli(): - pass - - -if __name__ == "__main__": - cli.add_command(create_twl_forecast) - cli() diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index d156cb1..28db35a 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -2,13 +2,12 @@ Estimates the forecasted storm impacts based on the forecasted water level and dune crest/toe. """ -import logging.config -import os import click import pandas as pd -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +from utils import setup_logging + +logger = setup_logging() def forecasted_impacts(df_profile_features, df_forecasted_twl): @@ -72,7 +71,6 @@ def storm_regime(df_forecasted_impacts): @click.option("--forecasted-twl-csv", required=True, help="") @click.option("--output-file", required=True, help="") def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_file): - logger.info("Creating observed wave impacts") logger.info("Importing existing data") df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) @@ -82,13 +80,3 @@ def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_f df_forecasted_impacts.to_csv(output_file) logger.info("Saved to %s", output_file) logger.info("Done!") - - -@click.group() -def cli(): - pass - - -if __name__ == "__main__": - cli.add_command(create_forecasted_impacts) - cli() diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 80bdbda..6900b31 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -1,12 +1,11 @@ -import logging.config -import os import click import numpy as np import pandas as pd from scipy.integrate import simps -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +from utils import setup_logging + +logger = setup_logging() def return_first_or_nan(l): @@ -49,8 +48,8 @@ def volume_change(df_profiles, df_profile_features, zone): prestorm_dune_toe_x = prestorm_dune_crest_x # If no prestorm and poststorm profiles, skip site and continue - profile_lengths = [len(df_site.query("profile_type == '{}'".format(x))) for x in ['prestorm', 'poststorm']] - if any([length ==0 for length in profile_lengths]): + profile_lengths = [len(df_site.query("profile_type == '{}'".format(x))) for x in ["prestorm", "poststorm"]] + if any([length == 0 for length in profile_lengths]): continue # Find last x coordinate where we have both prestorm and poststorm measurements. If we don't do this, @@ -182,13 +181,3 @@ def create_observed_impacts(profiles_csv, profile_features_csv, output_file): logger.info("Saved to %s", output_file) logger.info("Done!") - - -@click.group() -def cli(): - pass - - -if __name__ == "__main__": - cli.add_command(create_observed_impacts) - cli() diff --git a/src/cli.py b/src/cli.py new file mode 100644 index 0000000..5c048b3 --- /dev/null +++ b/src/cli.py @@ -0,0 +1,29 @@ +""" +Entry point to run data processing and analysis commands. +""" + +import click + +import data.parse_mat as parse_mat +import data.profile_features as profile_features +import data.csv_to_shp as csv_to_shp +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 + + +@click.group() +def cli(): + pass + + +if __name__ == "__main__": + cli.add_command(parse_mat.create_waves_csv) + cli.add_command(parse_mat.create_sites_and_profiles_csv) + cli.add_command(parse_mat.create_tides_csv) + cli.add_command(profile_features.create_profile_features) + cli.add_command(csv_to_shp.sites_csv_to_shp) + cli.add_command(forecast_twl.create_twl_forecast) + cli.add_command(forecasted_storm_impacts.create_forecasted_impacts) + cli.add_command(observed_storm_impacts.create_observed_impacts) + cli() diff --git a/src/data/__init__.py b/src/data/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/data/csv_to_shp.py b/src/data/csv_to_shp.py index a5438c2..46d8f7e 100644 --- a/src/data/csv_to_shp.py +++ b/src/data/csv_to_shp.py @@ -1,12 +1,6 @@ """ Converts .csv files to .shape files """ - -import os -import sys - -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - import click import fiona import pandas as pd @@ -38,13 +32,3 @@ def sites_csv_to_shp(input_csv, output_shp): prop = {"beach": row["beach"], "site_id": index} output.write({"geometry": mapping(point), "properties": prop}) logger.info("Done!") - - -@click.group() -def cli(): - pass - - -if __name__ == "__main__": - cli.add_command(sites_csv_to_shp) - cli() diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index de17dfc..4fb29d3 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -2,14 +2,8 @@ Converts raw .mat files into a flattened .csv structure which can be imported into python pandas. """ -import os -import sys - -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -from datetime import datetime, timedelta import math - +from datetime import datetime, timedelta import click import numpy as np @@ -17,7 +11,7 @@ import pandas as pd from mat4py import loadmat from shapely.geometry import Point -from profile_features import convert_coord_systems +from data.profile_features import convert_coord_systems from utils import setup_logging logger = setup_logging() diff --git a/src/data/profile_features.py b/src/data/profile_features.py index cb63568..56440fd 100644 --- a/src/data/profile_features.py +++ b/src/data/profile_features.py @@ -1,5 +1,5 @@ -import os from functools import partial + import click import fiona import numpy as np @@ -8,11 +8,10 @@ import pyproj from shapely.geometry import LineString, Point from shapely.geometry import shape from shapely.ops import transform -import logging.config +from utils import setup_logging -logging.config.fileConfig("./src/logging.conf", disable_existing_loggers=False) -logger = logging.getLogger(__name__) +logger = setup_logging() def convert_coord_systems(g1, in_coord_system="EPSG:4326", out_coord_system="EPSG:28356"): @@ -160,13 +159,3 @@ def create_profile_features(dune_crest_shp, dune_toe_shp, sites_csv, profiles_cs df_profile_features = parse_profile_features(df_sites, df_profiles, dune_crest_shp, dune_toe_shp) df_profile_features.to_csv(output_csv) logger.info("Done!") - - -@click.group() -def cli(): - pass - - -if __name__ == "__main__": - cli.add_command(create_profile_features) - cli() diff --git a/src/logging.conf b/src/logging.conf deleted file mode 100644 index 9cb8c0c..0000000 --- a/src/logging.conf +++ /dev/null @@ -1,32 +0,0 @@ -[loggers] -keys=root, matplotlib, fiona - -[handlers] -keys=consoleHandler - -[formatters] -keys=simpleFormatter - -[logger_root] -level=DEBUG -handlers=consoleHandler - -[logger_matplotlib] -level=WARNING -handlers=consoleHandler -qualname=matplotlib - -[logger_fiona] -level=WARNING -handlers=consoleHandler -qualname=fiona - -[handler_consoleHandler] -class=StreamHandler -level=INFO -formatter=simpleFormatter -args=(sys.stdout,) - -[formatter_simpleFormatter] -format=%(asctime)s %(name)-17s %(levelname)-8s %(message)s -datefmt=%a, %d %b %Y %H:%M:%S From 5fe3445aaa2c8abe5e66f64403d720234497e3f2 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 15:26:06 +1100 Subject: [PATCH 40/65] Add item to TODO list --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 00f303c..9e563cb 100644 --- a/README.md +++ b/README.md @@ -73,4 +73,5 @@ been corrected for systematic errors, so actual elevations should be taken from - [ ] 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. - [ ] 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? \ No newline at end of file +- [ ] 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 From 7e314757ce131ce0b1fffaf687afb2fa870898c2 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 15:31:01 +1100 Subject: [PATCH 41/65] Fix typos in README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9e563cb..b1ee642 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # 2016 Narrabeen Storm EWS Performance -This repository investigates whether the storm impacts (i.e. Sallenger, 2000) f the June 2016 Narrabeen Storm could have been forecasted in advance. +This repository investigates whether the storm impacts (i.e. Sallenger, 2000) of the June 2016 Narrabeen Storm could have been forecasted in advance. ## Repository and analysis format This repository follows the [Cookiecutter Data Science](https://drivendata.github.io/cookiecutter-data-science/) @@ -69,9 +69,9 @@ been corrected for systematic errors, so actual elevations should be taken from - [ ] Setup precomit hook for automatic code formatting using [black](https://ljvmiranda921.github.io/notebook/2018/06/21/precommits-using-black-and-flake8/). Low priority as can run black using the command `make format`. - [ ] Raw tide WL's are interpolated based on location from tide gauges. This probably isn't the most accurate method, but should have a small effect since surge elevation was low during this event. Need to assess the effect of this method. - [ ] 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 [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. - [ ] 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 +- [ ] 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 From c391edf75578ef80e7f2eab8219e078617c6132d Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 27 Nov 2018 15:50:17 +1100 Subject: [PATCH 42/65] Keep old index number of site when parsing .mat file --- src/data/parse_mat.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index 4fb29d3..7a368da 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -151,6 +151,7 @@ def parse_profiles_and_sites(profiles_mat): site_counter = 0 for i, site in enumerate(mat_data["site"]): + logger.debug('Processing site {} of {}'.format(i+1, len(mat_data['site']))) # Give each site a unique id if len(site_rows) == 0 or site_rows[-1]["beach"] != site: @@ -205,6 +206,7 @@ def parse_profiles_and_sites(profiles_mat): profile_rows.append( { "site_id": site_id, + "site_no": i, "lon": lon[0], "lat": lat[0], "profile_type": profile_type, From dac2f9824dc5b818370980933772b23ac5dbdedf Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 3 Dec 2018 17:56:27 +1100 Subject: [PATCH 43/65] Fix environment --- environment.yml | 150 ++++++++++++++++++++++++------------------------ 1 file changed, 76 insertions(+), 74 deletions(-) diff --git a/environment.yml b/environment.yml index 561fc32..232b29a 100644 --- a/environment.yml +++ b/environment.yml @@ -3,147 +3,149 @@ channels: - defaults - conda-forge dependencies: - - appdirs=1.4.3=py_1 - - attrs=18.2.0=py_0 - - backcall=0.1.0=py_0 - black=18.9b0=py_0 - - bleach=3.0.2=py_0 - - boost=1.66.0=py36_vc14_1 - - boost-cpp=1.66.0=vc14_1 - - ca-certificates=2018.10.15=ha4d7672_0 - - certifi=2018.10.15=py36_1000 - - colorama=0.4.0=py_0 - colorlover=0.2.1=py_0 - - curl=7.60.0=vc14_0 - - entrypoints=0.2.3=py36_1002 - - expat=2.2.5=vc14_0 - - freetype=2.8.1=vc14_0 - - freexl=1.0.2=vc14_2 - - geotiff=1.4.2=vc14_1 - - hdf4=4.2.13=vc14_0 - - hdf5=1.10.1=vc14_2 - - icu=58.2=vc14_0 - - ipykernel=5.1.0=py36h39e3cac_1001 - - ipython=7.1.1=py36h39e3cac_1000 - - jedi=0.13.1=py36_1000 - - jinja2=2.10=py_1 - - jpeg=9b=vc14_2 - - jupyter_client=5.2.3=py_1 - jupyter_contrib_core=0.3.3=py_2 - jupyter_contrib_nbextensions=0.5.0=py36_1000 - jupyter_highlight_selected_word=0.2.0=py36_1000 - jupyter_latex_envs=1.4.4=py36_1000 - jupyter_nbextensions_configurator=0.4.0=py36_1000 - - kealib=1.4.7=vc14_4 - - krb5=1.14.6=vc14_0 - - libgdal=2.2.4=vc14_5 - - libiconv=1.14=vc14_4 - - libnetcdf=4.6.1=vc14_2 - - libpng=1.6.34=vc14_0 - - libpq=9.6.3=vc14_0 - - libsodium=1.0.16=vc14_0 - - libspatialite=4.3.0a=vc14_19 - - libtiff=4.0.9=vc14_0 - - libxml2=2.9.5=vc14_1 - - libxslt=1.1.32=vc14_0 - - lxml=4.2.3=py36heafd4d3_0 - - markupsafe=1.1.0=py36hfa6e2cd_1000 - - matplotlib=2.2.2=py36_1 - - mistune=0.8.4=py36hfa6e2cd_1000 - - nbconvert=5.3.1=py_1 - - notebook=5.7.2=py36_1000 - - openjpeg=2.3.0=vc14_2 - - openssl=1.0.2p=hfa6e2cd_1001 - - pandoc=2.4=0 - - pandocfilters=1.4.2=py_1 - - parso=0.3.1=py_0 - - pickleshare=0.7.5=py36_1000 - - proj4=4.9.3=vc14_5 - - prometheus_client=0.4.2=py_0 - - prompt_toolkit=2.0.7=py_0 - - pygments=2.2.0=py_1 - - python=3.6.6=he025d50_0 - - pywinpty=0.5.4=py36_1002 - - pyzmq=17.1.2=py36hf576995_1001 - - qt=5.6.2=vc14_1 - - send2trash=1.5.0=py_0 - - sqlite=3.20.1=vc14_2 - - terminado=0.8.1=py36_1001 - - testpath=0.4.2=py36_1000 - - tk=8.6.8=vc14_0 - - toml=0.10.0=py_0 - - vc=14=0 - - wcwidth=0.1.7=py_1 - - webencodings=0.5.1=py_1 - - winpty=0.4.3=4 - - xerces-c=3.2.0=vc14_0 - - yaml=0.1.7=vc14_0 - - zeromq=4.2.5=vc14_2 - - zlib=1.2.11=vc14_0 + - matplotlib-base=3.0.2=py36h3e3dc42_1001 + - appdirs=1.4.3=py36h28b3542_0 - asn1crypto=0.24.0=py36_0 + - attrs=18.2.0=py36h28b3542_0 + - backcall=0.1.0=py36_0 - blas=1.0=mkl + - bleach=3.0.2=py36_0 + - boost=1.67.0=py36_4 + - boost-cpp=1.67.0=hfa6e2cd_4 + - ca-certificates=2018.03.07=0 + - certifi=2018.10.15=py36_0 - cffi=1.11.5=py36h74b6da3_1 - chardet=3.0.4=py36_1 - click=7.0=py36_0 - click-plugins=1.0.4=py36_0 - cligj=0.5.0=py36_0 + - colorama=0.4.0=py36_0 - cryptography=2.3.1=py36h74b6da3_0 + - curl=7.62.0=h2a8f88b_0 - cycler=0.10.0=py36h009560c_0 - decorator=4.3.0=py36_0 + - entrypoints=0.2.3=py36_2 + - expat=2.2.5=he025d50_0 - fiona=1.7.10=py36h5bf8d1d_0 + - freetype=2.9.1=ha9979f8_1 + - freexl=1.0.5=hfa6e2cd_0 - gdal=2.2.2=py36hcebd033_1 - geos=3.6.2=h9ef7328_2 + - geotiff=1.4.2=hd5bfa41_0 + - hdf4=4.2.13=h712560f_2 + - hdf5=1.10.1=h98b8871_1 - icc_rt=2017.0.4=h97af966_0 + - icu=58.2=ha66f8fd_1 - idna=2.7=py36_0 - intel-openmp=2019.1=144 + - ipykernel=5.1.0=py36h39e3cac_0 + - ipython=7.2.0=py36h39e3cac_0 - ipython_genutils=0.2.0=py36h3c5d0ee_0 + - jedi=0.13.1=py36_0 + - jinja2=2.10=py36_0 + - jpeg=9b=hb83a4c4_2 - jsonschema=2.6.0=py36h7636477_0 + - jupyter_client=5.2.3=py36_0 - jupyter_core=4.4.0=py36_0 + - kealib=1.4.7=ha5b336b_5 - kiwisolver=1.0.1=py36h6538335_0 - - libboost=1.67.0=hd9e427e_4 - - libcurl=7.61.1=h7602738_0 + - krb5=1.16.1=h038dc86_6 + - libboost=1.67.0=hfd51bdf_4 + - libcurl=7.62.0=h2a8f88b_0 + - libgdal=2.2.2=h2727f2b_1 + - libiconv=1.15=h1df5818_7 - libkml=1.3.0=he5f2a48_4 + - libnetcdf=4.4.1.1=h825a56a_8 + - libpng=1.6.35=h2a8f88b_0 + - libpq=10.5=h5fe2233_0 + - libsodium=1.0.16=h9d3ae62_0 + - libspatialite=4.3.0a=h383548d_18 - libssh2=1.8.0=hd619d38_4 + - libtiff=4.0.9=h36446d0_2 + - libxml2=2.9.8=hadb2253_1 + - libxslt=1.1.32=hf6f1972_0 + - lxml=4.2.5=py36hef2cd61_0 - m2w64-gcc-libgfortran=5.3.0=6 - m2w64-gcc-libs=5.3.0=7 - m2w64-gcc-libs-core=5.3.0=7 - m2w64-gmp=6.1.0=2 - m2w64-libwinpthread-git=5.0.0.4634.697f757=2 + - markupsafe=1.1.0=py36he774522_0 + - matplotlib=3.0.1=py36hc8f65d3_0 + - mistune=0.8.4=py36he774522_0 - mkl=2018.0.3=1 - mkl_fft=1.0.6=py36hdbbee80_0 - mkl_random=1.0.1=py36h77b88f5_1 - msys2-conda-epoch=20160418=1 - munch=2.3.2=py36_0 + - nbconvert=5.3.1=py36_0 - nbformat=4.4.0=py36h3a5bc1b_0 + - notebook=5.7.2=py36_0 - numpy=1.15.4=py36ha559c80_0 - numpy-base=1.15.4=py36h8128ebf_0 + - openjpeg=2.3.0=h5ec785f_1 + - openssl=1.0.2p=hfa6e2cd_0 - pandas=0.23.4=py36h830ac7b_0 + - pandoc=2.2.3.2=0 + - pandocfilters=1.4.2=py36_1 + - parso=0.3.1=py36_0 + - pickleshare=0.7.5=py36_0 - pip=18.1=py36_0 - - plotly=3.4.1=py36h28b3542_0 + - plotly=3.4.2=py36h28b3542_0 + - proj4=4.9.3=hcf24537_7 + - prometheus_client=0.4.2=py36_0 + - prompt_toolkit=2.0.7=py36_0 + - py-boost=1.67.0=py36h8300f20_4 - pycparser=2.19=py36_0 + - pygments=2.2.0=py36hb010967_0 - pyopenssl=18.0.0=py36_0 - pyparsing=2.3.0=py36_0 - pyproj=1.9.5.1=py36_0 - - pyqt=5.6.0=py36_2 + - pyqt=5.9.2=py36h6538335_2 - pysocks=1.6.8=py36_0 + - python=3.6.7=h33f27b4_1 - python-dateutil=2.7.5=py36_0 - pytz=2018.7=py36_0 + - pywinpty=0.5.4=py36_0 - pyyaml=3.13=py36hfa6e2cd_0 + - pyzmq=17.1.2=py36hfa6e2cd_0 + - qt=5.9.6=vc14h1e9a669_2 - requests=2.20.1=py36_0 - retrying=1.3.3=py36_2 - scipy=1.1.0=py36h4f6bf74_1 + - send2trash=1.5.0=py36_0 - setuptools=40.6.2=py36_0 - shapely=1.6.4=py36hc90234e_0 - sip=4.19.8=py36h6538335_0 - six=1.11.0=py36_1 + - sqlite=3.25.3=he774522_0 + - terminado=0.8.1=py36_1 + - testpath=0.4.2=py36_0 + - tk=8.6.8=hfa6e2cd_0 + - toml=0.10.0=py36h28b3542_0 - tornado=5.1.1=py36hfa6e2cd_0 - traitlets=4.3.2=py36h096827d_0 - urllib3=1.23=py36_0 + - vc=14.1=h0510ff6_4 - vs2015_runtime=14.15.26706=h3a45250_0 + - wcwidth=0.1.7=py36h3d5aa90_0 + - webencodings=0.5.1=py36_1 - wheel=0.32.3=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 + - zeromq=4.2.5=he025d50_1 + - zlib=1.2.11=h62dcd97_3 - pip: - mat4py==0.4.1 prefix: C:\Users\z5189959\Desktop\nsw-2016-storm-impact\.venv From 64602d5c7dd5c11ceb8bd55d5fc2073d83bb8290 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 3 Dec 2018 17:56:51 +1100 Subject: [PATCH 44/65] Fix environment --- Makefile | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 1914a02..73edcb8 100644 --- a/Makefile +++ b/Makefile @@ -14,11 +14,14 @@ CURRENT_DIR = $(shell pwd) . PHONY: venv_init venv-init: ##@environment Setup virtual environment - conda create -f environment.yml --prefix=.venv python=3.7 + conda env create -f environment.yml --prefix=.venv python=3.7 venv-activate: ##@environment Activates the virtual environment activate $(CURRENT_DIR)/.venv +venv-update: ##@environment Updates to latest packages + conda update ipykernel && conda update --prefix .venv --all + venv-requirements-install: ##@environment Ensures environment.yml packages are installed conda env update @@ -82,14 +85,22 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --input-csv "./data/interim/sites.csv" \ --output-shp "./data/interim/sites.shp" -# Creates a .csv of our dune toe and crest profile features -./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv +# # Creates a .csv of our dune toe and crest profile features from .shp file +# ./data/interim/profile_features.csv: ./data/raw/profile_features/dune_crests.shp ./data/raw/profile_features/dune_toes.shp ./data/interim/sites.csv ./data/interim/profiles.csv +# activate ./.venv && python ./src/cli.py create-profile-features \ +# --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ +# --dune-toe-shp "./data/raw/profile_features/dune_toes.shp" \ +# --sites-csv "./data/interim/sites.csv" \ +# --profiles-csv "./data/interim/profiles.csv" \ +# --output-csv "./data/interim/profile_features.csv" + +# Create a .csv of our dune toe and crest profile features from Tom Beuzen's .mat file +./data/interim/profile_features.csv: ./data/raw/profile_features_tom_beuzen/*.mat ./data/interim/sites.csv activate ./.venv && python ./src/cli.py create-profile-features \ - --dune-crest-shp "./data/raw/profile_features/dune_crests.shp" \ - --dune-toe-shp "./data/raw/profile_features/dune_toes.shp" \ + --crest-mat "./data/raw/profile_features_tom_beuzen/J16_DuneCrest.mat" \ + --toe-mat "./data/raw/profile_features_tom_beuzen/J16_DuneToe.mat" \ --sites-csv "./data/interim/sites.csv" \ - --profiles-csv "./data/interim/profiles.csv" \ - --output-csv "./data/interim/profile_features.csv" + --output-file "./data/interim/profile_features.csv" # Creates a forecast of twl using sto06 and prestorm time varying prestorm foreshore slope ./data/interim/twl_foreshore_slope_sto06.csv: ./data/interim/waves.csv ./data/interim/tides.csv ./data/interim/profiles.csv ./data/interim/sites.csv ./data/interim/profile_features.csv @@ -168,5 +179,3 @@ HELP_FUN = \ help: ##@other Show this help. @perl -e '$(HELP_FUN)' $(MAKEFILE_LIST) - - From 2a98dc2b0113cda14d7546c066749bb88a513b3a Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:26:42 +1100 Subject: [PATCH 45/65] Fix environment: add autopep8 for jupyter notebooks --- environment.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/environment.yml b/environment.yml index 232b29a..0c8db70 100644 --- a/environment.yml +++ b/environment.yml @@ -14,6 +14,7 @@ dependencies: - appdirs=1.4.3=py36h28b3542_0 - asn1crypto=0.24.0=py36_0 - attrs=18.2.0=py36h28b3542_0 + - autopep8=1.4.3=py36_0 - backcall=0.1.0=py36_0 - blas=1.0=mkl - bleach=3.0.2=py36_0 @@ -103,6 +104,7 @@ dependencies: - prometheus_client=0.4.2=py36_0 - prompt_toolkit=2.0.7=py36_0 - py-boost=1.67.0=py36h8300f20_4 + - pycodestyle=2.4.0=py36_0 - pycparser=2.19=py36_0 - pygments=2.2.0=py36hb010967_0 - pyopenssl=18.0.0=py36_0 From 8991657410bdefad2b767fdef4bc57cd796e5696 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:26:58 +1100 Subject: [PATCH 46/65] Add instructions for adding package --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 73edcb8..b6f17fd 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,8 @@ venv-requirements-install: ##@environment Ensures environment.yml packages are i venv-requirements-export: ##@environment Exports current environment to environment.yml conda env export --file environment.yml +# To install new packages: conda install --prefix .venv PACKAGE + ############################### # Get data from network drive From 23557cdf8e6a0809fb532bf1e1c71361b170fb45 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:27:27 +1100 Subject: [PATCH 47/65] Update notebooks --- .../02_collision_protection_volume.ipynb | 1051 +++++++++++++++++ notebooks/03_dune_to_vs_runup.ipynb | 554 +++++++++ 2 files changed, 1605 insertions(+) create mode 100644 notebooks/02_collision_protection_volume.ipynb create mode 100644 notebooks/03_dune_to_vs_runup.ipynb diff --git a/notebooks/02_collision_protection_volume.ipynb b/notebooks/02_collision_protection_volume.ipynb new file mode 100644 index 0000000..617b435 --- /dev/null +++ b/notebooks/02_collision_protection_volume.ipynb @@ -0,0 +1,1051 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Investigate \"collision protection volume\" concept" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T00:37:28.874517Z", + "start_time": "2018-12-03T00:37:28.528594Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%reload_ext autoreload\n", + "%autoreload" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T00:37:30.229243Z", + "start_time": "2018-12-03T00:37:28.875519Z" + } + }, + "outputs": [], + "source": [ + "from IPython.core.debugger import set_trace\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "\n", + "import plotly\n", + "import plotly.graph_objs as go\n", + "import plotly.plotly as py\n", + "import plotly.tools as tls\n", + "import plotly.figure_factory as ff\n", + "import plotly.io as pio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load data\n", + "Load data from the `./data/interim/` folder and parse into `pandas` dataframes." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T02:20:29.132099Z", + "start_time": "2018-12-03T02:20:22.217681Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing profiles.csv\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", + "\n", + "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing profile_features.csv\n", + "Importing impacts_forecasted_foreshore_slope_sto06.csv\n", + "Importing impacts_forecasted_mean_slope_sto06.csv\n", + "Importing impacts_observed.csv\n", + "Importing twl_foreshore_slope_sto06.csv\n", + "Importing twl_mean_slope_sto06.csv\n", + "Done!\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])\n", + "df_profile_features = df_from_csv('profile_features.csv', index_col=[0])\n", + "\n", + "impacts = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('impacts_forecasted_foreshore_slope_sto06.csv', index_col=[0]),\n", + " 'mean_slope_sto06': df_from_csv('impacts_forecasted_mean_slope_sto06.csv', index_col=[0]),\n", + " },\n", + " 'observed': df_from_csv('impacts_observed.csv', index_col=[0])\n", + " }\n", + "\n", + "twls = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('twl_foreshore_slope_sto06.csv', index_col=[0, 1]),\n", + " 'mean_slope_sto06':df_from_csv('twl_mean_slope_sto06.csv', index_col=[0, 1]),\n", + " }\n", + "}\n", + "\n", + "print('Done!')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Lets define a function to calculate the \"collision protection volume\" based on prestorm profiles." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T00:37:37.244970Z", + "start_time": "2018-12-03T00:37:36.924017Z" + }, + "code_folding": [] + }, + "outputs": [], + "source": [ + "from shapely.geometry import Point, LineString, Polygon\n", + "\n", + "def collision_protection_vol(x,z, d_low_x, d_low_z, lower_z, angle):\n", + " # First, get the bounding line strings of our protection volume\n", + " lower_line = LineString([Point(min(x), lower_z), Point(max(x), lower_z)])\n", + " profile_line = LineString([Point(x_coord, z_coord) for x_coord, z_coord in zip(x,z) \n", + " if all([not np.isnan(x_coord), not np.isnan(z_coord)])])\n", + " slope_line = LineString([Point(d_low_x, d_low_z), \n", + " Point(max(x), d_low_z - max(x) * np.sin(np.deg2rad(angle)))])\n", + "\n", + " # Work out where our lower line and slope line intersect\n", + " lower_profile_intersection = lower_line.intersection(profile_line)\n", + " d_protected_intersection = lower_line.intersection(slope_line)\n", + " \n", + " # Define the perimeter of the protection area\n", + " profile_protected = LineString([Point(x_coord, z_coord) for x_coord, z_coord \n", + " in zip(profile_line.xy[0],profile_line.xy[1]) \n", + " if d_low_x < x_coord < lower_profile_intersection.xy[0][0]] \n", + " + [lower_profile_intersection]\n", + " + [d_protected_intersection]\n", + " + [Point(d_low_x, d_low_z)])\n", + " \n", + " # Convert to polygon and return the area (m3/m)\n", + " protection_area_poly = Polygon(profile_protected)\n", + " protection_area_vol = protection_area_poly.area\n", + " return protection_area_vol\n", + "\n", + "site_id = 'NARRA0018'\n", + "profile_type = 'prestorm'\n", + "query = \"site_id == '{}' and profile_type == '{}'\".format(site_id, profile_type)\n", + "prestorm_profile = df_profiles.query(query)\n", + "profile_features = df_profile_features.query(query)\n", + "\n", + "x = prestorm_profile.index.get_level_values('x')\n", + "z = prestorm_profile.z\n", + "d_low_x = profile_features.dune_toe_x.tolist()[0]\n", + "d_low_z = profile_features.dune_toe_z.tolist()[0]\n", + "angle = 60 # degrees from the horizontal\n", + "lower_z = 0.5 # from mhw\n", + "\n", + "vol = collision_protection_vol(x,z, d_low_x, d_low_z, lower_z, angle)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T01:24:18.270476Z", + "start_time": "2018-12-03T01:24:18.119986Z" + } + }, + "outputs": [], + "source": [ + "from datetime import timedelta\n", + "\n", + "def wl_time(t, wl, z_lower, z_upper):\n", + " \"\"\"\n", + " Returns the amount of time the water level is between two elevations.\n", + " \"\"\"\n", + " df_wl = pd.DataFrame.from_records([(t_val, R2_val) for t_val, R2_val in zip(t,R2)], columns=['datetime','wl'])\n", + " df_wl.set_index(pd.DatetimeIndex(df_wl['datetime']),inplace=True)\n", + " df_wl.drop(columns=['datetime'], inplace=True)\n", + " \n", + " # Assumes that each record is one hour... probably need to check this\n", + " hours = len(df_wl.query('{} < wl < {}'.format(z_lower, z_upper)))\n", + " return timedelta(hours=hours)\n", + "\n", + "def wave_power(t, wl, z_lower, z_upper, Hs0, Tp):\n", + " \"\"\"\n", + " Returns the cumulative wave power when the water level is between two elevations.\n", + " \"\"\"\n", + " df_wl = pd.DataFrame.from_records([(t_val, R2_val,Hs0_val,Tp_val) for t_val, R2_val,Hs0_val,Tp_val in zip(t,R2,Hs0,Tp)], columns=['datetime','wl', 'Hs0','Tp'])\n", + " df_wl.set_index(pd.DatetimeIndex(df_wl['datetime']),inplace=True)\n", + " df_wl.drop(columns=['datetime'], inplace=True)\n", + " \n", + " # Assumes that each record is one hour... probably need to check this\n", + " rho = 1025 # kg/m3\n", + " g = 9.8 # m/s2\n", + " df_wl_times = df_wl.query('{} < wl < {}'.format(z_lower, z_upper))\n", + " power = rho * g ** 2 / 64 / np.pi * df_wl_times.Hs0 ** 2 * df_wl_times.Tp\n", + " return power.sum()\n", + "\n", + "df_twl = twls['forecasted']['mean_slope_sto06']\n", + "df_twl_site = df_twl.query(\"site_id == '{}'\".format(site_id))\n", + "\n", + "R2 = df_twl_site.R2.tolist()\n", + "t = df_twl_site.index.get_level_values('datetime')\n", + "z_lower = 0.5\n", + "z_upper = d_low_z\n", + "\n", + "exposed_time = wl_time(t, R2, z_lower,z_upper)\n", + "\n", + "Hs0 = df_twl.Hs0.tolist()\n", + "Tp = df_twl.Tp.tolist()\n", + "wave_p = wave_power(t, R2, z_lower,z_upper,Hs0, Tp)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T01:24:24.215223Z", + "start_time": "2018-12-03T01:24:24.210209Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "8554715.596323118" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "wave_p" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T00:54:57.439956Z", + "start_time": "2018-12-03T00:54:57.425899Z" + } + }, + "outputs": [], + "source": [ + "def dune_toe_elevation_change(site_id, df_profile_features):\n", + " query = \"site_id == '{}'\".format(site_id)\n", + " profile_features = df_profile_features.query(query)\n", + " prestorm_dune_toe_z = profile_features.query(\"profile_type=='prestorm'\").dune_toe_z.tolist()[0]\n", + " poststorm_dune_toe_z = profile_features.query(\"profile_type=='poststorm'\").dune_toe_z.tolist()[0]\n", + " return prestorm_dune_toe_z - poststorm_dune_toe_z\n", + "\n", + "toe_ele_change = dune_toe_elevation_change(\"NARRA0018\", df_profile_features)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T03:07:48.328428Z", + "start_time": "2018-12-03T03:06:54.182343Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 of 204\n", + "20 of 204\n", + "40 of 204\n", + "60 of 204\n", + "80 of 204\n", + "100 of 204\n", + "120 of 204\n", + "140 of 204\n", + "160 of 204\n", + "180 of 204\n", + "200 of 204\n" + ] + } + ], + "source": [ + "vols = []\n", + "exposed_times = []\n", + "toe_ele_changes = []\n", + "wave_powers = []\n", + "\n", + "# Get site ids where we observed collision\n", + "observed_site_ids = impacts['observed'].query(\"storm_regime=='collision'\").index.get_level_values('site_id').unique()\n", + "\n", + "# Get site ids where we forecast swash\n", + "forecasted_site_ids = impacts['forecasted']['mean_slope_sto06'].query(\"storm_regime=='swash'\").index.get_level_values('site_id').unique()\n", + "\n", + "site_ids = set(observed_site_ids).intersection(set(forecasted_site_ids))\n", + "\n", + "# Calculate for each site\n", + "\n", + "for n, site_id in enumerate(site_ids):\n", + " \n", + " if n%20 ==0:\n", + " print('{} of {}'.format(n, len(site_ids)))\n", + " \n", + " try:\n", + " query = \"site_id == '{}' and profile_type == '{}'\".format(site_id, 'prestorm')\n", + " prestorm_profile = df_profiles.query(query)\n", + " profile_features = df_profile_features.query(query)\n", + "\n", + " vol = collision_protection_vol(x = prestorm_profile.index.get_level_values('x'),\n", + " z = prestorm_profile.z,\n", + " d_low_x = profile_features.dune_toe_x.tolist()[0],\n", + " d_low_z = profile_features.dune_toe_z.tolist()[0],\n", + " lower_z = profile_features.dune_toe_z.tolist()[0] - 2, # from mhw\n", + " angle = 60, # degrees from the horizontal\n", + " )\n", + "\n", + " df_twl = twls['forecasted']['mean_slope_sto06']\n", + " df_twl_site = df_twl.query(\"site_id == '{}'\".format(site_id))\n", + "\n", + " exposed_time = wl_time(t = df_twl_site.index.get_level_values('datetime'),\n", + " wl = df_twl_site.R2.tolist(),\n", + " z_lower = profile_features.dune_toe_z.tolist()[0] -2,\n", + " z_upper = profile_features.dune_toe_z.tolist()[0],\n", + " )\n", + "\n", + " \n", + " power = wave_power(t = df_twl_site.index.get_level_values('datetime'),\n", + " wl = df_twl_site.R2.tolist(),\n", + " z_lower = profile_features.dune_toe_z.tolist()[0] -2,\n", + " z_upper = profile_features.dune_toe_z.tolist()[0],\n", + " Hs0=df_twl_site.Hs0.tolist(),\n", + " Tp=df_twl_site.Tp.tolist())\n", + " \n", + " toe_ele_change = dune_toe_elevation_change(site_id, df_profile_features)\n", + " except:\n", + " continue\n", + "\n", + " vols.append(vol)\n", + " exposed_times.append(exposed_time)\n", + " toe_ele_changes.append(toe_ele_change)\n", + " wave_powers.append(power)\n", + "# if n>100:\n", + "# break\n", + "\n", + " \n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "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" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T03:31:19.534072Z", + "start_time": "2018-12-03T03:31:19.439822Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "01b5e4786fd44414a38db9266df25a12", + "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", + " '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", + "})" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "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", + " 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 = [x.total_seconds() / 60 / 60 for x in exposed_times],\n", + " colorscale='Viridis',\n", + " showscale=True\n", + " ))\n", + "\n", + "layout = go.Layout(\n", + " title='Dune Collision Protection',\n", + "# height=300,\n", + "# legend=dict(font={'size': 10}),\n", + "# margin=dict(t=50, b=50, l=50, r=20),\n", + " xaxis=dict(\n", + " title='Exposed time',\n", + " autorange=True,\n", + " showgrid=True,\n", + " zeroline=True,\n", + " showline=True,\n", + " ),\n", + " yaxis=dict(\n", + " title='Collision protection volume',\n", + " autorange=True,\n", + " showgrid=True,\n", + " zeroline=True,\n", + " showline=True,\n", + " ))\n", + "\n", + "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", + "g_plot" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.4" + }, + "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 +} diff --git a/notebooks/03_dune_to_vs_runup.ipynb b/notebooks/03_dune_to_vs_runup.ipynb new file mode 100644 index 0000000..9673fcb --- /dev/null +++ b/notebooks/03_dune_to_vs_runup.ipynb @@ -0,0 +1,554 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Investigate how dune toe compares to R_high" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T03:38:44.538853Z", + "start_time": "2018-12-03T03:38:44.189514Z" + } + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "%reload_ext autoreload\n", + "%autoreload" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T03:38:46.213387Z", + "start_time": "2018-12-03T03:38:44.781382Z" + } + }, + "outputs": [], + "source": [ + "from IPython.core.debugger import set_trace\n", + "\n", + "import pandas as pd\n", + "import numpy as np\n", + "import os\n", + "\n", + "import plotly\n", + "import plotly.graph_objs as go\n", + "import plotly.plotly as py\n", + "import plotly.tools as tls\n", + "import plotly.figure_factory as ff\n", + "import plotly.io as pio" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load data\n", + "Load data from the `./data/interim/` folder and parse into `pandas` dataframes." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T03:38:53.297184Z", + "start_time": "2018-12-03T03:38:46.365829Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing profiles.csv\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\z5189959\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\numpy\\lib\\arraysetops.py:472: FutureWarning:\n", + "\n", + "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing profile_features.csv\n", + "Importing impacts_forecasted_foreshore_slope_sto06.csv\n", + "Importing impacts_forecasted_mean_slope_sto06.csv\n", + "Importing impacts_observed.csv\n", + "Importing twl_foreshore_slope_sto06.csv\n", + "Importing twl_mean_slope_sto06.csv\n", + "Done!\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])\n", + "df_profile_features = df_from_csv('profile_features.csv', index_col=[0])\n", + "\n", + "impacts = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('impacts_forecasted_foreshore_slope_sto06.csv', index_col=[0]),\n", + " 'mean_slope_sto06': df_from_csv('impacts_forecasted_mean_slope_sto06.csv', index_col=[0]),\n", + " },\n", + " 'observed': df_from_csv('impacts_observed.csv', index_col=[0])\n", + " }\n", + "\n", + "twls = {\n", + " 'forecasted': {\n", + " 'foreshore_slope_sto06': df_from_csv('twl_foreshore_slope_sto06.csv', index_col=[0, 1]),\n", + " 'mean_slope_sto06':df_from_csv('twl_mean_slope_sto06.csv', index_col=[0, 1]),\n", + " }\n", + "}\n", + "\n", + "print('Done!')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare underpredicted cases" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T04:05:30.984007Z", + "start_time": "2018-12-03T04:05:30.805508Z" + } + }, + "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", + "
" + ], + "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" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T04:08:15.732169Z", + "start_time": "2018-12-03T04:08:15.656966Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "35b9331242af473dba2f91761c307022", + "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", + "})" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "trace1 = go.Histogram(y=df_twl_toes['diff'].tolist())\n", + "\n", + "layout = go.Layout(\n", + " title='D_low - R_high
Observed Collision, Forecasted Swash',\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", + ")\n", + "\n", + "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", + "g_plot" + ] + }, + { + "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." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Compare overpredicted cases" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T04:08:56.128806Z", + "start_time": "2018-12-03T04:08:55.894182Z" + } + }, + "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", + "
" + ], + "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" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "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" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T04:14:46.601092Z", + "start_time": "2018-12-03T04:14:46.522883Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3ea49a4ac07c4ea19bbb4532326ff94c", + "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", + "})" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "trace1 = go.Histogram(y=df_twl_toes['diff'].tolist())\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", + ")\n", + "\n", + "g_plot = go.FigureWidget(data=[trace1], layout=layout)\n", + "g_plot" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "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?" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "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 06cc97ef7e541177606c58f51542d316333863e9 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:28:21 +1100 Subject: [PATCH 48/65] Add functions to parse Tom Beuzen's dune toe and crests --- src/cli.py | 3 ++- src/data/parse_mat.py | 57 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/src/cli.py b/src/cli.py index 5c048b3..210b91f 100644 --- a/src/cli.py +++ b/src/cli.py @@ -21,7 +21,8 @@ if __name__ == "__main__": cli.add_command(parse_mat.create_waves_csv) cli.add_command(parse_mat.create_sites_and_profiles_csv) cli.add_command(parse_mat.create_tides_csv) - cli.add_command(profile_features.create_profile_features) + cli.add_command(parse_mat.create_profile_features) + # cli.add_command(profile_features.create_profile_features) cli.add_command(csv_to_shp.sites_csv_to_shp) cli.add_command(forecast_twl.create_twl_forecast) cli.add_command(forecasted_storm_impacts.create_forecasted_impacts) diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index 7a368da..e7afd84 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -45,6 +45,48 @@ def parse_orientations(orientations_mat): return df +def parse_dune_crest_toes(df_sites, crest_mat, toe_mat): + """ + :param df_sites: + :param crest_mat: + :param toe_mat: + :return: + """ + logger.info("Parsing dune crests and toes") + + rows = [] + crest_data = loadmat(crest_mat) + toe_data = loadmat(toe_mat) + + for n, _ in enumerate(crest_data['xc1']): + rows.extend([{ + 'dune_crest_x': crest_data['xc1'][n], + 'dune_crest_z': crest_data['zc1'][n], + 'dune_toe_x': toe_data['xt1'][n], + 'dune_toe_z': toe_data['zt1'][n], + 'profile_type': 'prestorm', + 'site_no': n+1 + },{ + 'dune_crest_x': crest_data['xc2'][n], + 'dune_crest_z': crest_data['zc2'][n], + 'dune_toe_x': toe_data['xt2'][n], + 'dune_toe_z': toe_data['zt2'][n], + 'profile_type': 'poststorm', + 'site_no': n + 1 + }]) + + df_profile_features = pd.DataFrame(rows) + + # Want the site_id instead of the site_no, so merge in df_sites + df_sites.reset_index(inplace=True) + df_profile_features = df_sites[['site_no','site_id']].merge(df_profile_features, how='outer', on=['site_no']) + df_profile_features.drop(columns=['site_no'],inplace=True) + df_profile_features.set_index(['site_id','profile_type'], inplace=True) + df_profile_features.sort_index(inplace=True) + df_profile_features = df_profile_features.round(3) + + return df_profile_features + def combine_sites_and_orientaions(df_sites, df_orientations): """ Replaces beach/lat/lon columns with the unique site_id. @@ -206,7 +248,7 @@ def parse_profiles_and_sites(profiles_mat): profile_rows.append( { "site_id": site_id, - "site_no": i, + "lon": lon[0], "lat": lat[0], "profile_type": profile_type, @@ -226,6 +268,7 @@ def parse_profiles_and_sites(profiles_mat): site_rows.append( { "site_id": site_id, + "site_no": i + 1, "beach": site, "lat": x_200_lat, "lon": x_200_lon, @@ -332,6 +375,18 @@ def create_waves_csv(waves_mat, sites_csv, output_file): logger.info("Created %s", output_file) +@click.command(short_help="create profile_features.csv") +@click.option("--crest-mat", required=True, help=".mat file containing wave records") +@click.option("--toe-mat", required=True, help=".mat file containing wave records") +@click.option("--sites-csv", required=True, help=".csv file description of cross section sites") +@click.option("--output-file", required=True, help="where to save waves.csv") +def create_profile_features(crest_mat, toe_mat, sites_csv, output_file): + logger.info("Creating %s", output_file) + df_sites = pd.read_csv(sites_csv, index_col=[0]) + df_profile_features = parse_dune_crest_toes(df_sites, crest_mat, toe_mat) + df_profile_features.to_csv(output_file) + logger.info("Created %s", output_file) + @click.command(short_help="create profiles.csv") @click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") @click.option("--profiles-output-file", required=True, help="where to save profiles.csv") From c73e2dd254cef80aa26b1e3d6b6dd3796264c594 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:28:31 +1100 Subject: [PATCH 49/65] Update notebooks --- notebooks/01_exploration.ipynb | 378 ++++++++++++++++++++++++--------- 1 file changed, 283 insertions(+), 95 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 9150b26..1e5fc2e 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -10,11 +10,11 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2018-11-27T03:27:16.641947Z", - "start_time": "2018-11-27T03:27:15.791353Z" + "end_time": "2018-12-03T02:14:51.434299Z", + "start_time": "2018-12-03T02:14:51.048281Z" } }, "outputs": [], @@ -22,18 +22,18 @@ "# Enable autoreloading of our modules. \n", "# Most of the code will be located in the /src/ folder, \n", "# and then called from the notebook.\n", - "\n", + "%matplotlib inline\n", "%reload_ext autoreload\n", "%autoreload" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2018-11-27T03:27:16.655952Z", - "start_time": "2018-11-27T03:27:16.642938Z" + "end_time": "2018-12-03T02:14:56.153167Z", + "start_time": "2018-12-03T02:14:51.435303Z" }, "scrolled": true }, @@ -50,6 +50,8 @@ "import plotly.plotly as py\n", "import plotly.tools as tls\n", "import plotly.figure_factory as ff\n", + "import plotly.io as pio\n", + "\n", "\n", "import matplotlib\n", "from matplotlib import cm\n", @@ -58,7 +60,9 @@ "from ipywidgets import widgets, Output\n", "from IPython.display import display, clear_output, Image, HTML\n", "\n", - "from sklearn.metrics import confusion_matrix" + "from sklearn.metrics import confusion_matrix\n", + "\n", + "import ruptures as rpt" ] }, { @@ -70,11 +74,11 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2018-11-27T03:27:31.268696Z", - "start_time": "2018-11-27T03:27:16.657959Z" + "end_time": "2018-12-03T02:15:19.403132Z", + "start_time": "2018-12-03T02:14:56.154127Z" }, "pixiedust": { "displayParams": {} @@ -82,6 +86,15 @@ "scrolled": false }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing waves.csv\n", + "Importing tides.csv\n", + "Importing profiles.csv\n" + ] + }, { "name": "stderr", "output_type": "stream", @@ -91,10 +104,25 @@ "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", "\n" ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Importing sites.csv\n", + "Importing profile_features.csv\n", + "Importing impacts_forecasted_foreshore_slope_sto06.csv\n", + "Importing impacts_forecasted_mean_slope_sto06.csv\n", + "Importing impacts_observed.csv\n", + "Importing twl_foreshore_slope_sto06.csv\n", + "Importing twl_mean_slope_sto06.csv\n", + "Done!\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_waves = df_from_csv('waves.csv', index_col=[0, 1])\n", @@ -118,35 +146,50 @@ " 'foreshore_slope_sto06': df_from_csv('twl_foreshore_slope_sto06.csv', index_col=[0, 1]),\n", " 'mean_slope_sto06':df_from_csv('twl_mean_slope_sto06.csv', index_col=[0, 1]),\n", " }\n", - "}" + "}\n", + "print('Done!')" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2018-11-27T23:02:57.631306Z", + "start_time": "2018-11-27T23:02:57.615263Z" + } + }, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "hide_input": true + }, "source": [ "The following interactive data explorer displays information on a per `site_id` basis. It can be used to examine pre/post storm cross-sections, water level time series and observed/predicted storm impacts." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2018-11-27T03:27:34.422864Z", - "start_time": "2018-11-27T03:27:31.278426Z" + "end_time": "2018-12-03T02:42:30.072305Z", + "start_time": "2018-12-03T02:42:26.548191Z" }, "code_folding": [ 408 ], - "hide_input": true, + "hide_input": false, "scrolled": false }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "80589953e2e04fecb2a0f3add40b3d5b", + "model_id": "4db27acde589487c8982ac9319257ae0", "version_major": 2, "version_minor": 0 }, @@ -166,45 +209,65 @@ "

\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), options=('swash', 'collision', 'overwash'), value=('swash', 'collision', 'overwash')))), VBox(children=(HTML(value='Forecasted: mean_slope_sto06'), SelectMultiple(index=(0, 1, 2), options=('swash', 'overwash', 'collision'), value=('swash', 'overwash', 'collision')))))))), 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", + "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': 'dede4ee7-342d-41c2-b899-daa42347f70c',\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': 'd51ed30f-dc58-4334-a0d2-e0e76b9f3ff4',\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': 'a09876d4-eebe-4a20-9f56-ddf10095c5de',\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': '329c7dd8-2f5a-42e9-9813-81b6acb08419',\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': '8cef75dd-a4eb-40de-8149-a6179a9c6ba6',\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': 'c1691092-a100-4799-a807-13d8c2dc0679',\n", + " 'uid': '96dc2836-4d14-447f-ba9d-67f9901d88e4',\n", " 'x': [0],\n", " 'y': [0]}],\n", " 'layout': {'height': 300,\n", @@ -233,7 +296,7 @@ " 'text': array(['AVOCAn0001', 'AVOCAn0002', 'AVOCAn0003', ..., 'WAMBE0025', 'WAMBE0026',\n", " 'WAMBE0027'], dtype='{}
\".format(forecast) )\n", @@ -1178,7 +1290,15 @@ " z_neg_incorrect[z_neg_incorrect==0]= -1\n", " z_neg_incorrect = (z * z_neg_incorrect).tolist()\n", " \n", - " fig = ff.create_annotated_heatmap(z_neg_incorrect, x=x, y=y, annotation_text=z)\n", + " # Also want to display percentages\n", + " z_with_pct = []\n", + " for row in z:\n", + " new_row = []\n", + " for val in row:\n", + " new_row.append('{}
({}%)'.format(val, np.around(val/np.sum(z)*100,1)))\n", + " z_with_pct.append(new_row)\n", + " \n", + " fig = ff.create_annotated_heatmap(z_neg_incorrect, x=x, y=y, annotation_text=z_with_pct)\n", " heatmap.children[1].data[0].z = z_neg_incorrect\n", " heatmap.children[1].layout.annotations = fig.layout.annotations\n", "\n", @@ -1186,55 +1306,123 @@ "beach_select.observe(update_heatmaps, names=\"value\")\n", "\n", "# Display our widgets\n", - "widgets.VBox([beach_container, widgets.VBox(heatmaps)])" + "widgets.VBox([beach_container, widgets.VBox(heatmaps)])\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 6, "metadata": { "ExecuteTime": { - "end_time": "2018-11-27T03:27:35.146616Z", - "start_time": "2018-11-27T03:27:35.112525Z" + "end_time": "2018-12-03T02:15:40.575569Z", + "start_time": "2018-12-03T02:15:25.540804Z" } }, "outputs": [ { - "data": { - "text/plain": [ - "[[-0.0, -0.0, -0.0, 0.0],\n", - " [-0.0, -0.0, 0.0, -0.0],\n", - " [-23.0, 14.0, -0.0, -0.0],\n", - " [50.0, -16.0, -6.0, -0.0]]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" + "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" + ] } ], "source": [ - "selected_site_ids = df_sites[df_sites.beach.isin(beach_select.value)].index.tolist()\n", + "# 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", + "\n", + "# fig = g_profiles\n", + "# img_bytes = pio.write_image(fig, 'fig1.png',format='png', width=600, height=200, scale=5)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-03T02:15:40.576573Z", + "start_time": "2018-12-03T02:14:51.251Z" + } + }, + "outputs": [], + "source": [ + "\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", + "\n", + "algo = rpt.Binseg(model=\"linear\").fit(signal)\n", + "\n", + "result = algo.predict(pen=100)\n", + "\n", + "result = [x for x in result if x Date: Tue, 4 Dec 2018 09:29:26 +1100 Subject: [PATCH 50/65] Fix bugs for forecasting impacts --- src/analysis/forecast_twl.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 06d7bf4..1bb29c1 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -45,7 +45,8 @@ def forecast_twl( df_twl["beta"] = pd.concat(results) elif slope == "mean": - df_temp = df_twl.join(df_profile_features, how="inner") + df_temp = df_twl.join(df_profile_features.query("profile_type=='prestorm'").reset_index(level='profile_type') + , how="inner") df_temp["mhw"] = 0.5 with Pool(processes=n_processes) as pool: results = pool.starmap( @@ -226,7 +227,12 @@ def slope_from_profile(profile_x, profile_z, top_elevation, btm_elevation, metho end_points[end_type]["x"] = intersection_x[-1] else: # For bottom elevation, take most landward intersection that is seaward of top elevation - end_points[end_type]["x"] = [x for x in intersection_x if x > end_points["top"]["x"]][0] + end_point_btm = [x for x in intersection_x if x > end_points["top"]["x"]] + if len(end_point_btm) == 0: + # If there doesn't seem to be an intersection seaward of the top elevation, return none. + return None + else: + end_points[end_type]["x"] = end_point_btm[0] if method == "end_points": x_top = end_points["top"]["x"] @@ -286,7 +292,7 @@ def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv df_waves = pd.read_csv(waves_csv, index_col=[0, 1]) df_tides = pd.read_csv(tides_csv, index_col=[0, 1]) df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) logger.info("Forecasting TWL") df_twl_foreshore_slope_sto06 = forecast_twl( From 5b9b4141b33d7687e863bbc698b782240d1ec152 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:29:51 +1100 Subject: [PATCH 51/65] Fix bugs for forecasting impacts --- src/analysis/forecasted_storm_impacts.py | 6 +- src/analysis/observed_storm_impacts.py | 72 ++++++++++++------------ 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index 28db35a..0ea92ec 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -20,7 +20,7 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): """ logger.info("Getting forecasted storm impacts") - df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index) + df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) # For each site, find the maximum R_high value and the corresponding R_low value. idx = df_forecasted_twl.groupby(level=["site_id"])["R_high"].idxmax().dropna() @@ -29,7 +29,7 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): # Join with df_profile features to find dune toe and crest elevations df_forecasted_impacts = df_forecasted_impacts.merge( - df_profile_features[["dune_toe_z", "dune_crest_z"]], how="left", left_index=True, right_index=True + df_profile_features.query("profile_type=='prestorm'")[["dune_toe_z", "dune_crest_z"]], how="left", left_index=True, right_index=True ) # Compare R_high and R_low wirth dune crest and toe elevations @@ -73,7 +73,7 @@ def storm_regime(df_forecasted_impacts): def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_file): logger.info("Creating observed wave impacts") logger.info("Importing existing data") - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) df_forecasted_twl = pd.read_csv(forecasted_twl_csv, index_col=[0, 1]) df_forecasted_impacts = forecasted_impacts(df_profile_features, df_forecasted_twl) diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 6900b31..6c76e36 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -30,14 +30,15 @@ def volume_change(df_profiles, df_profile_features, zone): """ logger.info("Calculating change in beach volume in {} zone".format(zone)) - df_vol_changes = pd.DataFrame(index=df_profile_features.index) + df_vol_changes = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) df_profiles = df_profiles.sort_index() sites = df_profiles.groupby(level=["site_id"]) for site_id, df_site in sites: logger.debug("Calculating change in beach volume at {} in {} zone".format(site_id, zone)) - prestorm_dune_toe_x = df_profile_features.loc[df_profile_features.index == site_id].dune_toe_x.tolist() - prestorm_dune_crest_x = df_profile_features.loc[df_profile_features.index == site_id].dune_crest_x.tolist() + query ="site_id=='{}'&profile_type=='prestorm'".format(site_id) + prestorm_dune_toe_x = df_profile_features.query(query).dune_toe_x.tolist() + prestorm_dune_crest_x = df_profile_features.query(query).dune_crest_x.tolist() # We may not have a dune toe or crest defined, or there may be multiple defined. prestorm_dune_crest_x = return_first_or_nan(prestorm_dune_crest_x) @@ -61,14 +62,20 @@ def volume_change(df_profiles, df_profile_features, zone): for profile_type in ["prestorm", "poststorm"] ] ) + x_first_obs = max( + [ + min(df_zone.query("profile_type == '{}'".format(profile_type)).index.get_level_values("x")) + for profile_type in ["prestorm", "poststorm"] + ] + ) # Where we want to measure pre and post storm volume is dependant on the zone selected if zone == "swash": - x_min = prestorm_dune_toe_x + x_min = max(prestorm_dune_toe_x,x_first_obs) x_max = x_last_obs elif zone == "dune_face": - x_min = prestorm_dune_crest_x - x_max = prestorm_dune_toe_x + x_min = max(prestorm_dune_crest_x, x_first_obs) + x_max = min(prestorm_dune_toe_x,x_last_obs) else: logger.warning("Zone argument not properly specified. Please check") x_min = None @@ -89,13 +96,23 @@ def volume_change(df_profiles, df_profile_features, zone): x_max=x_max, ) - # No point keeping so many decimal places, let's round them - prestorm_vol = np.round(prestorm_vol, 2) - poststorm_vol = np.round(poststorm_vol, 2) + # Volume change needs to be calculated including a tolerance for LIDAR accuracy. If difference between + # profiles is less than 20 cm, consider them as zero difference. + prestorm_z = df_zone.query("profile_type=='prestorm'").reset_index('profile_type').z + poststorm_z = df_zone.query("profile_type=='poststorm'").reset_index('profile_type').z + diff_z = prestorm_z - poststorm_z + diff_z[abs(diff_z) < 0.2] = 0 + diff_vol = beach_volume( + x=diff_z.index.get_level_values("x"), + z=diff_z, + x_min=x_min, + x_max=x_max, + ) df_vol_changes.loc[site_id, "prestorm_{}_vol".format(zone)] = prestorm_vol df_vol_changes.loc[site_id, "poststorm_{}_vol".format(zone)] = poststorm_vol - df_vol_changes.loc[site_id, "{}_vol_change".format(zone)] = prestorm_vol - poststorm_vol + df_vol_changes.loc[site_id, "{}_vol_change".format(zone)] = diff_vol + df_vol_changes.loc[site_id, "{}_pct_change".format(zone)] = diff_vol / prestorm_vol * 100 return df_vol_changes @@ -127,31 +144,14 @@ def storm_regime(df_observed_impacts): :return: """ logger.info("Getting observed storm regimes") - df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change <= 5, "storm_regime"] = "swash" - df_observed_impacts.loc[df_observed_impacts.dune_face_vol_change > 5, "storm_regime"] = "collision" - return df_observed_impacts + swash = (df_observed_impacts.dune_face_pct_change <= 2) & (df_observed_impacts.dune_face_vol_change <= 3) + collision = (df_observed_impacts.dune_face_pct_change >= 2) |(df_observed_impacts.dune_face_vol_change > 3) + + df_observed_impacts.loc[swash, "storm_regime"] = "swash" + df_observed_impacts.loc[collision, "storm_regime"] = "collision" + return df_observed_impacts -# -# if __name__ == "__main__": -# logger.info("Importing existing data") -# data_folder = "./data/interim" -# df_profiles = pd.read_csv(os.path.join(data_folder, "profiles.csv"), index_col=[0, 1, 2]) -# df_profile_features = pd.read_csv(os.path.join(data_folder, "profile_features.csv"), index_col=[0]) -# -# logger.info("Creating new dataframe for observed impacts") -# df_observed_impacts = pd.DataFrame(index=df_profile_features.index) -# -# logger.info("Getting pre/post storm volumes") -# df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") -# df_dune_face_vol_changes = volume_change(df_profiles, df_profile_features, zone="dune_face") -# df_observed_impacts = df_observed_impacts.join([df_swash_vol_changes, df_dune_face_vol_changes]) -# -# # Classify regime based on volume changes -# df_observed_impacts = storm_regime(df_observed_impacts) -# -# # Save dataframe to csv -# df_observed_impacts.to_csv(os.path.join(data_folder, "impacts_observed.csv")) @click.command() @@ -163,10 +163,10 @@ def create_observed_impacts(profiles_csv, profile_features_csv, output_file): logger.info("Creating observed wave impacts") logger.info("Importing data") df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) logger.info("Creating new dataframe for observed impacts") - df_observed_impacts = pd.DataFrame(index=df_profile_features.index) + df_observed_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) logger.info("Getting pre/post storm volumes") df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") @@ -177,7 +177,7 @@ def create_observed_impacts(profiles_csv, profile_features_csv, output_file): df_observed_impacts = storm_regime(df_observed_impacts) # Save dataframe to csv - df_observed_impacts.to_csv(output_file) + df_observed_impacts.to_csv(output_file, float_format='%.4f') logger.info("Saved to %s", output_file) logger.info("Done!") From 75f372154df31c76ab11c046ceb2852381d01338 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 4 Dec 2018 09:30:00 +1100 Subject: [PATCH 52/65] Update logging format --- src/logging.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/logging.yaml b/src/logging.yaml index fc82b31..ea78c7a 100644 --- a/src/logging.yaml +++ b/src/logging.yaml @@ -3,7 +3,8 @@ version: 1 disable_existing_loggers: False formatters: simple: - format: "%(asctime)s - %(filename)s - %(levelname)s - %(message)s" + format: "[%(asctime)s] [%(filename)15.15s:%(lineno)4.4s %(funcName)15.15s] [%(levelname)-4.4s] %(message)s" + datefmt: "%Y-%m-%d %H:%M:%S" handlers: console: @@ -46,5 +47,5 @@ loggers: propagate: no root: - level: INFO + level: DEBUG handlers: [console, info_file_handler, error_file_handler, warning_file_handler] From 4910d103f2485d6bc3981155390ddd5e048e2224 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 11:56:51 +1100 Subject: [PATCH 53/65] 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 54/65] 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 55/65] 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 56/65] 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 57/65] 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": "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\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 58/65] 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 59/65] 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!") From 9f1b80168755d85eae90f437bea3613336e24135 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 13:11:16 +1100 Subject: [PATCH 60/65] Add function for estimating twl exceedence time --- src/analysis/forecasted_storm_impacts.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index 0ea92ec..eca4b80 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -66,6 +66,18 @@ def storm_regime(df_forecasted_impacts): return df_forecasted_impacts +def twl_exceedence_time(df_profile_features, df_forecasted_twl, z_twl_col='R_high', z_exceedence_col='dune_toe_z'): + logger.info("Getting twl exceedence time") + + df_dune_toes = df_profile_features.query('profile_type=="prestorm"').reset_index('profile_type')[ + 'dune_toe_z'].to_frame() + + df_merged = df_forecasted_twl.merge(df_dune_toes,left_on=['site_id'],right_on=['site_id']) + + return (df_merged[z_twl_col] >= df_merged[z_exceedence_col]).groupby('site_id').sum().rename( + 'twl_{}_exceedance_hrs'.format(z_exceedence_col)).to_frame() + + @click.command() @click.option("--profile-features-csv", required=True, help="") @click.option("--forecasted-twl-csv", required=True, help="") @@ -77,6 +89,11 @@ def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_f df_forecasted_twl = pd.read_csv(forecasted_twl_csv, index_col=[0, 1]) df_forecasted_impacts = forecasted_impacts(df_profile_features, df_forecasted_twl) + + df_forecasted_impacts = df_profile_features.merge(twl_exceedence_time(df_profile_features, df_forecasted_twl), + left_on=['site_id'], + right_on=['site_id']) + df_forecasted_impacts.to_csv(output_file) logger.info("Saved to %s", output_file) logger.info("Done!") From 4592cb858e360dee1d19403e6f0c03c6445915ed Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Fri, 7 Dec 2018 13:11:31 +1100 Subject: [PATCH 61/65] Remove profile_type from impacts.csv --- src/analysis/forecasted_storm_impacts.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index eca4b80..51fb920 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -29,7 +29,9 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): # Join with df_profile features to find dune toe and crest elevations df_forecasted_impacts = df_forecasted_impacts.merge( - df_profile_features.query("profile_type=='prestorm'")[["dune_toe_z", "dune_crest_z"]], how="left", left_index=True, right_index=True + df_profile_features.query("profile_type=='prestorm'").reset_index('profile_type')[["dune_toe_z", + "dune_crest_z"]], how="left", + left_on=['site_id'], right_on=['site_id'] ) # Compare R_high and R_low wirth dune crest and toe elevations From ee7f7ad6cf25be07fc3027e4ce9d200343a44a53 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 10 Dec 2018 16:57:32 +1100 Subject: [PATCH 62/65] Update CLI options in Makefile for impact forecasting --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 74643fe..eb12728 100644 --- a/Makefile +++ b/Makefile @@ -118,6 +118,7 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --profile-features-csv "./data/interim/profile_features.csv" \ --runup-function "sto06" \ --slope "foreshore" \ + --profile-type "prestorm" \ --output-file "./data/interim/twl_foreshore_slope_sto06.csv" ./data/interim/twl_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 @@ -128,6 +129,7 @@ impacts: ./data/interim/impacts_forecasted_foreshore_slope_sto06.csv ./data/inte --profile-features-csv "./data/interim/profile_features.csv" \ --runup-function "sto06" \ --slope "mean" \ + --profile-type "prestorm" \ --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 From 836873b3f35c6ba1a3b35cfb1f0cffc22ff8b759 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 10 Dec 2018 17:00:31 +1100 Subject: [PATCH 63/65] Fix formatting --- src/analysis/forecast_twl.py | 45 +++++++++++----------- src/analysis/forecasted_storm_impacts.py | 49 +++++++++++++++++------- src/analysis/observed_storm_impacts.py | 28 ++++++-------- src/cli.py | 4 +- src/data/parse_mat.py | 48 +++++++++++++---------- 5 files changed, 99 insertions(+), 75 deletions(-) diff --git a/src/analysis/forecast_twl.py b/src/analysis/forecast_twl.py index 82efc65..0fab400 100644 --- a/src/analysis/forecast_twl.py +++ b/src/analysis/forecast_twl.py @@ -23,7 +23,7 @@ def forecast_twl( runup_function, n_processes=MULTIPROCESS_THREADS, slope="foreshore", - profile_type='prestorm' + profile_type="prestorm", ): # Use df_waves as a base df_twl = df_waves.copy() @@ -46,19 +46,20 @@ def forecast_twl( df_twl["beta"] = pd.concat(results) elif slope == "mean": - df_temp = df_twl.join(df_profile_features.query("profile_type=='{}'".format(profile_type)).reset_index( - level='profile_type') - , how="inner") + 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", "dune_toe_x", "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) # Estimate runup - R2, setup, S_total, S_inc, S_ig = runup_function(df_twl, Hs0_col="Hs0", Tp_col="Tp", beta_col="beta") + R2, setup, S_total, S_inc, S_ig = runup_function(Hs0=df_twl['Hs0'].tolist(), Tp=df_twl["Tp"].tolist(), beta=df_twl["beta"].tolist()) df_twl["R2"] = R2 df_twl["setup"] = setup @@ -69,13 +70,14 @@ def forecast_twl( df_twl["R_low"] = df_twl["tide"] + 1.1 * df_twl["setup"] - 1.1 / 2 * df_twl["S_total"] # Drop unneeded columns - df_twl.drop(columns=["E", "Exs", "P", "Pxs", "dir"], inplace=True, errors="ignore") + # df_twl.drop(columns=["E", "Exs", "P", "Pxs", "dir"], inplace=True, errors="ignore") return df_twl -def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, top_x_col, btm_elevation_col, - profile_type='prestorm'): +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 @@ -100,7 +102,7 @@ def mean_slope_for_site_id(site_id, df_twl, df_profiles, top_elevation_col, top_ top_elevation=row[top_elevation_col], btm_elevation=row[btm_elevation_col], method="end_points", - top_x= row[top_x_col] + top_x=row[top_x_col], ), axis=1, ) @@ -130,7 +132,7 @@ def foreshore_slope_for_site_id(site_id, df_twl, df_profiles): profile_x=profile_x, profile_z=profile_z, tide=row.tide, - runup_function=runup_models.sto06_individual, + runup_function=runup_models.sto06, Hs0=row.Hs0, Tp=row.Tp, ), @@ -216,16 +218,14 @@ 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 + 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 + if btm_x and end_type == "top": + end_points["btm"]["x"] = btm_x continue elevation = end_points[end_type]["z"] @@ -306,14 +306,15 @@ def crossings(profile_x, profile_z, constant_z): @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, - profile_type,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]) df_tides = pd.read_csv(tides_csv, index_col=[0, 1]) df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0, 1]) logger.info("Forecasting TWL") df_twl = forecast_twl( @@ -323,7 +324,7 @@ def create_twl_forecast(waves_csv, tides_csv, profiles_csv, profile_features_csv df_profile_features, runup_function=getattr(runup_models, runup_function), slope=slope, - profile_type=profile_type + profile_type=profile_type, ) df_twl.to_csv(output_file) diff --git a/src/analysis/forecasted_storm_impacts.py b/src/analysis/forecasted_storm_impacts.py index 51fb920..0a04ea1 100644 --- a/src/analysis/forecasted_storm_impacts.py +++ b/src/analysis/forecasted_storm_impacts.py @@ -20,7 +20,7 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): """ logger.info("Getting forecasted storm impacts") - df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) + df_forecasted_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values("site_id").unique()) # For each site, find the maximum R_high value and the corresponding R_low value. idx = df_forecasted_twl.groupby(level=["site_id"])["R_high"].idxmax().dropna() @@ -29,9 +29,12 @@ def forecasted_impacts(df_profile_features, df_forecasted_twl): # Join with df_profile features to find dune toe and crest elevations df_forecasted_impacts = df_forecasted_impacts.merge( - df_profile_features.query("profile_type=='prestorm'").reset_index('profile_type')[["dune_toe_z", - "dune_crest_z"]], how="left", - left_on=['site_id'], right_on=['site_id'] + df_profile_features.query("profile_type=='prestorm'").reset_index("profile_type")[ + ["dune_toe_z", "dune_crest_z"] + ], + how="left", + left_on=["site_id"], + right_on=["site_id"], ) # Compare R_high and R_low wirth dune crest and toe elevations @@ -68,16 +71,34 @@ def storm_regime(df_forecasted_impacts): return df_forecasted_impacts -def twl_exceedence_time(df_profile_features, df_forecasted_twl, z_twl_col='R_high', z_exceedence_col='dune_toe_z'): +def twl_exceedence_time(df_profile_features, df_forecasted_twl, z_twl_col="R_high", z_exceedence_col="dune_toe_z"): + """ + Returns a dataframe of number of hours the twl exceeded a certain z elevation. + May need to use this https://stackoverflow.com/a/53656968 if datetimes are not consistent. + :param df_profile_features: + :param df_forecasted_twl: + :param z_twl_col: + :param z_exceedence_col: + :return: + """ logger.info("Getting twl exceedence time") - df_dune_toes = df_profile_features.query('profile_type=="prestorm"').reset_index('profile_type')[ - 'dune_toe_z'].to_frame() + # Get a dataframe of prestorm dune toes organised by site_id + df_dune_toes = ( + df_profile_features.query('profile_type=="prestorm"').reset_index("profile_type")[z_exceedence_col].to_frame() + ) - df_merged = df_forecasted_twl.merge(df_dune_toes,left_on=['site_id'],right_on=['site_id']) + # Merge dune toes into site_id + df_merged = df_forecasted_twl.merge(df_dune_toes, left_on=["site_id"], right_on=["site_id"]) - return (df_merged[z_twl_col] >= df_merged[z_exceedence_col]).groupby('site_id').sum().rename( - 'twl_{}_exceedance_hrs'.format(z_exceedence_col)).to_frame() + # Return the sum of hours that twl exceeded the level + return ( + (df_merged[z_twl_col] >= df_merged[z_exceedence_col]) + .groupby("site_id") + .sum() + .rename("twl_{}_exceedance_hrs".format(z_exceedence_col)) + .to_frame() + ) @click.command() @@ -87,14 +108,14 @@ def twl_exceedence_time(df_profile_features, df_forecasted_twl, z_twl_col='R_hig def create_forecasted_impacts(profile_features_csv, forecasted_twl_csv, output_file): logger.info("Creating observed wave impacts") logger.info("Importing existing data") - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0, 1]) df_forecasted_twl = pd.read_csv(forecasted_twl_csv, index_col=[0, 1]) df_forecasted_impacts = forecasted_impacts(df_profile_features, df_forecasted_twl) - df_forecasted_impacts = df_profile_features.merge(twl_exceedence_time(df_profile_features, df_forecasted_twl), - left_on=['site_id'], - right_on=['site_id']) + df_forecasted_impacts = df_forecasted_impacts.merge( + twl_exceedence_time(df_profile_features, df_forecasted_twl), left_on=["site_id"], right_on=["site_id"] + ) df_forecasted_impacts.to_csv(output_file) logger.info("Saved to %s", output_file) diff --git a/src/analysis/observed_storm_impacts.py b/src/analysis/observed_storm_impacts.py index 6c76e36..6c4c0e1 100644 --- a/src/analysis/observed_storm_impacts.py +++ b/src/analysis/observed_storm_impacts.py @@ -30,13 +30,13 @@ def volume_change(df_profiles, df_profile_features, zone): """ logger.info("Calculating change in beach volume in {} zone".format(zone)) - df_vol_changes = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) + df_vol_changes = pd.DataFrame(index=df_profile_features.index.get_level_values("site_id").unique()) df_profiles = df_profiles.sort_index() sites = df_profiles.groupby(level=["site_id"]) for site_id, df_site in sites: logger.debug("Calculating change in beach volume at {} in {} zone".format(site_id, zone)) - query ="site_id=='{}'&profile_type=='prestorm'".format(site_id) + query = "site_id=='{}'&profile_type=='prestorm'".format(site_id) prestorm_dune_toe_x = df_profile_features.query(query).dune_toe_x.tolist() prestorm_dune_crest_x = df_profile_features.query(query).dune_crest_x.tolist() @@ -71,11 +71,11 @@ def volume_change(df_profiles, df_profile_features, zone): # Where we want to measure pre and post storm volume is dependant on the zone selected if zone == "swash": - x_min = max(prestorm_dune_toe_x,x_first_obs) + x_min = max(prestorm_dune_toe_x, x_first_obs) x_max = x_last_obs elif zone == "dune_face": x_min = max(prestorm_dune_crest_x, x_first_obs) - x_max = min(prestorm_dune_toe_x,x_last_obs) + x_max = min(prestorm_dune_toe_x, x_last_obs) else: logger.warning("Zone argument not properly specified. Please check") x_min = None @@ -98,16 +98,11 @@ def volume_change(df_profiles, df_profile_features, zone): # Volume change needs to be calculated including a tolerance for LIDAR accuracy. If difference between # profiles is less than 20 cm, consider them as zero difference. - prestorm_z = df_zone.query("profile_type=='prestorm'").reset_index('profile_type').z - poststorm_z = df_zone.query("profile_type=='poststorm'").reset_index('profile_type').z + prestorm_z = df_zone.query("profile_type=='prestorm'").reset_index("profile_type").z + poststorm_z = df_zone.query("profile_type=='poststorm'").reset_index("profile_type").z diff_z = prestorm_z - poststorm_z diff_z[abs(diff_z) < 0.2] = 0 - diff_vol = beach_volume( - x=diff_z.index.get_level_values("x"), - z=diff_z, - x_min=x_min, - x_max=x_max, - ) + diff_vol = beach_volume(x=diff_z.index.get_level_values("x"), z=diff_z, x_min=x_min, x_max=x_max) df_vol_changes.loc[site_id, "prestorm_{}_vol".format(zone)] = prestorm_vol df_vol_changes.loc[site_id, "poststorm_{}_vol".format(zone)] = poststorm_vol @@ -146,14 +141,13 @@ def storm_regime(df_observed_impacts): logger.info("Getting observed storm regimes") swash = (df_observed_impacts.dune_face_pct_change <= 2) & (df_observed_impacts.dune_face_vol_change <= 3) - collision = (df_observed_impacts.dune_face_pct_change >= 2) |(df_observed_impacts.dune_face_vol_change > 3) + collision = (df_observed_impacts.dune_face_pct_change >= 2) | (df_observed_impacts.dune_face_vol_change > 3) df_observed_impacts.loc[swash, "storm_regime"] = "swash" df_observed_impacts.loc[collision, "storm_regime"] = "collision" return df_observed_impacts - @click.command() @click.option("--profiles-csv", required=True, help="") @click.option("--profile-features-csv", required=True, help="") @@ -163,10 +157,10 @@ def create_observed_impacts(profiles_csv, profile_features_csv, output_file): logger.info("Creating observed wave impacts") logger.info("Importing data") df_profiles = pd.read_csv(profiles_csv, index_col=[0, 1, 2]) - df_profile_features = pd.read_csv(profile_features_csv, index_col=[0,1]) + df_profile_features = pd.read_csv(profile_features_csv, index_col=[0, 1]) logger.info("Creating new dataframe for observed impacts") - df_observed_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values('site_id').unique()) + df_observed_impacts = pd.DataFrame(index=df_profile_features.index.get_level_values("site_id").unique()) logger.info("Getting pre/post storm volumes") df_swash_vol_changes = volume_change(df_profiles, df_profile_features, zone="swash") @@ -177,7 +171,7 @@ def create_observed_impacts(profiles_csv, profile_features_csv, output_file): df_observed_impacts = storm_regime(df_observed_impacts) # Save dataframe to csv - df_observed_impacts.to_csv(output_file, float_format='%.4f') + df_observed_impacts.to_csv(output_file, float_format="%.4f") logger.info("Saved to %s", output_file) logger.info("Done!") diff --git a/src/cli.py b/src/cli.py index 10b79e4..9b1d3e5 100644 --- a/src/cli.py +++ b/src/cli.py @@ -13,7 +13,9 @@ import analysis.observed_storm_impacts as observed_storm_impacts # Disable numpy warnings import warnings -warnings.simplefilter(action='ignore', category=FutureWarning) + +warnings.simplefilter(action="ignore", category=FutureWarning) + @click.group() def cli(): diff --git a/src/data/parse_mat.py b/src/data/parse_mat.py index e7afd84..b2e73c6 100644 --- a/src/data/parse_mat.py +++ b/src/data/parse_mat.py @@ -58,35 +58,41 @@ def parse_dune_crest_toes(df_sites, crest_mat, toe_mat): crest_data = loadmat(crest_mat) toe_data = loadmat(toe_mat) - for n, _ in enumerate(crest_data['xc1']): - rows.extend([{ - 'dune_crest_x': crest_data['xc1'][n], - 'dune_crest_z': crest_data['zc1'][n], - 'dune_toe_x': toe_data['xt1'][n], - 'dune_toe_z': toe_data['zt1'][n], - 'profile_type': 'prestorm', - 'site_no': n+1 - },{ - 'dune_crest_x': crest_data['xc2'][n], - 'dune_crest_z': crest_data['zc2'][n], - 'dune_toe_x': toe_data['xt2'][n], - 'dune_toe_z': toe_data['zt2'][n], - 'profile_type': 'poststorm', - 'site_no': n + 1 - }]) + for n, _ in enumerate(crest_data["xc1"]): + rows.extend( + [ + { + "dune_crest_x": crest_data["xc1"][n], + "dune_crest_z": crest_data["zc1"][n], + "dune_toe_x": toe_data["xt1"][n], + "dune_toe_z": toe_data["zt1"][n], + "profile_type": "prestorm", + "site_no": n + 1, + }, + { + "dune_crest_x": crest_data["xc2"][n], + "dune_crest_z": crest_data["zc2"][n], + "dune_toe_x": toe_data["xt2"][n], + "dune_toe_z": toe_data["zt2"][n], + "profile_type": "poststorm", + "site_no": n + 1, + }, + ] + ) df_profile_features = pd.DataFrame(rows) # Want the site_id instead of the site_no, so merge in df_sites df_sites.reset_index(inplace=True) - df_profile_features = df_sites[['site_no','site_id']].merge(df_profile_features, how='outer', on=['site_no']) - df_profile_features.drop(columns=['site_no'],inplace=True) - df_profile_features.set_index(['site_id','profile_type'], inplace=True) + df_profile_features = df_sites[["site_no", "site_id"]].merge(df_profile_features, how="outer", on=["site_no"]) + df_profile_features.drop(columns=["site_no"], inplace=True) + df_profile_features.set_index(["site_id", "profile_type"], inplace=True) df_profile_features.sort_index(inplace=True) df_profile_features = df_profile_features.round(3) return df_profile_features + def combine_sites_and_orientaions(df_sites, df_orientations): """ Replaces beach/lat/lon columns with the unique site_id. @@ -193,7 +199,7 @@ def parse_profiles_and_sites(profiles_mat): site_counter = 0 for i, site in enumerate(mat_data["site"]): - logger.debug('Processing site {} of {}'.format(i+1, len(mat_data['site']))) + logger.debug("Processing site {} of {}".format(i + 1, len(mat_data["site"]))) # Give each site a unique id if len(site_rows) == 0 or site_rows[-1]["beach"] != site: @@ -248,7 +254,6 @@ def parse_profiles_and_sites(profiles_mat): profile_rows.append( { "site_id": site_id, - "lon": lon[0], "lat": lat[0], "profile_type": profile_type, @@ -387,6 +392,7 @@ def create_profile_features(crest_mat, toe_mat, sites_csv, output_file): df_profile_features.to_csv(output_file) logger.info("Created %s", output_file) + @click.command(short_help="create profiles.csv") @click.option("--profiles-mat", required=True, help=".mat file containing beach profiles") @click.option("--profiles-output-file", required=True, help="where to save profiles.csv") From 3a1a3dddf19e7e084ceb1a1dded01ad5fd1ba713 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Mon, 10 Dec 2018 17:03:11 +1100 Subject: [PATCH 64/65] Update Stockdon 2006 runup function to accept either a list or a float This is an improvement over having two separate functions, depending on the parameter type. Other runup functions should be written in a similar style. --- src/analysis/runup_models.py | 71 ++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 36 deletions(-) diff --git a/src/analysis/runup_models.py b/src/analysis/runup_models.py index e088aeb..9176adb 100644 --- a/src/analysis/runup_models.py +++ b/src/analysis/runup_models.py @@ -2,52 +2,51 @@ import numpy as np import pandas as pd -def sto06_individual(Hs0, Tp, beta): +def sto06(Hs0, Tp, beta): + """ + :param Hs0: List or float of offshore significant wave height values + :param Tp: List or float of peak wave period + :param beta: List of float of beach slope + :return: Float or list of R2, setup, S_total, S_inc and S_ig values + """ - Lp = 9.8 * Tp ** 2 / 2 / np.pi + df = pd.DataFrame({"Hs0": Hs0, "Tp": Tp, "beta": beta}, index=[x for x in range(0, np.size(Hs0))]) - S_ig = 0.06 * np.sqrt(Hs0 * Lp) - S_inc = 0.75 * beta * np.sqrt(Hs0 * Lp) + df["Lp"] = 9.8 * df['Tp'] ** 2 / 2 / np.pi + + # General equation + df["S_ig"] = pd.to_numeric(0.06 * np.sqrt(df["Hs0"] * df["Lp"]), errors="coerce") + df["S_inc"] = pd.to_numeric(0.75 * df["beta"] * np.sqrt(df["Hs0"] * df["Lp"]), errors="coerce") + df["setup"] = pd.to_numeric(0.35 * df["beta"] * np.sqrt(df["Hs0"] * df["Lp"]), errors="coerce") + df["S_total"] = np.sqrt(df["S_inc"] ** 2 + df["S_ig"] ** 2) + df["R2"] = 1.1 * (df["setup"] + df["S_total"] / 2) # Dissipative conditions - if beta / (Hs0 / Lp) ** (0.5) <= 0.3: - setup = 0.016 * (Hs0 * Lp) ** 0.5 - S_total = 0.046 * (Hs0 * Lp) ** 0.5 - R2 = 0.043 * (Hs0 * Lp) ** 0.5 - else: - setup = 0.35 * beta * (Hs0 * Lp) ** 0.5 - S_total = np.sqrt(S_inc ** 2 + S_ig ** 2) - R2 = 1.1 * (setup + S_total / 2) + dissipative = df["beta"] / (df["Hs0"] / df["Lp"]) ** (0.5) <= 0.3 + + df.loc[dissipative, "setup"] = 0.016 * (df["Hs0"] * df["Lp"]) ** (0.5) # eqn 16 + df.loc[dissipative, "S_total"] = 0.046 * (df["Hs0"] * df["Lp"]) ** (0.5) # eqn 17 + df.loc[dissipative, "R2"] = 0.043 * (df["Hs0"] * df["Lp"]) ** (0.5) # eqn 18 - return R2, setup, S_total, S_inc, S_ig + return ( + float_or_list(df["R2"].tolist()), + float_or_list(df["setup"].tolist()), + float_or_list(df["S_total"].tolist()), + float_or_list(df["S_inc"].tolist()), + float_or_list(df["S_ig"].tolist()), + ) -def sto06(df, Hs0_col, Tp_col, beta_col): +def float_or_list(a): """ - Vectorized version of Stockdon06 which can be used with dataframes - :param df: - :param Hs0_col: - :param Tp_col: - :param beta_col: + If only one value in the array, return the float, else return a list + :param a: :return: """ - - Lp = 9.8 * df[Tp_col] ** 2 / 2 / np.pi - - # General equation - S_ig = pd.to_numeric(0.06 * np.sqrt(df[Hs0_col] * Lp), errors="coerce") - S_inc = pd.to_numeric(0.75 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors="coerce") - setup = pd.to_numeric(0.35 * df[beta_col] * np.sqrt(df[Hs0_col] * Lp), errors="coerce") - S_total = np.sqrt(S_inc ** 2 + S_ig ** 2) - R2 = 1.1 * (setup + S_total / 2) - - # Dissipative conditions - dissipative = df[beta_col] / (df[Hs0_col] / Lp) ** (0.5) <= 0.3 - setup.loc[dissipative, :] = 0.016 * (df[Hs0_col] * Lp) ** (0.5) # eqn 16 - S_total.loc[dissipative, :] = 0.046 * (df[Hs0_col] * Lp) ** (0.5) # eqn 17 - R2.loc[dissipative, :] = 0.043 * (df[Hs0_col] * Lp) ** (0.5) # eqn 18 - - return R2, setup, S_total, S_inc, S_ig + if len(a) == 1: + return a[0] + else: + return list(a) if __name__ == "__main__": From 25d2518fbbdc2271b189e930cb9bd132bba63744 Mon Sep 17 00:00:00 2001 From: Chris Leaman Date: Tue, 11 Dec 2018 16:19:29 +1100 Subject: [PATCH 65/65] Update notebooks --- notebooks/01_exploration.ipynb | 1012 ++++++++++++++++++++++- notebooks/03_dune_to_vs_runup.ipynb | 1189 ++++++++++++++++++++++----- 2 files changed, 1989 insertions(+), 212 deletions(-) diff --git a/notebooks/01_exploration.ipynb b/notebooks/01_exploration.ipynb index 07a9649..deb0348 100644 --- a/notebooks/01_exploration.ipynb +++ b/notebooks/01_exploration.ipynb @@ -1001,9 +1001,1012 @@ " g_profiles\n", "])" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scatter plot" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-07T05:08:12.117885Z", + "start_time": "2018-12-07T05:08:12.078780Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
prestorm_swash_volpoststorm_swash_volswash_vol_changeswash_pct_changeprestorm_dune_face_volpoststorm_dune_face_voldune_face_vol_changedune_face_pct_changestorm_regime
site_id
AVOCAn0001113.909177.983035.610331.2620165.4760166.72960.00000.0000swash
AVOCAn0002106.895967.091339.637337.0803256.4137258.91740.00000.0000swash
AVOCAn000399.048453.656345.162145.5960372.7031373.9198-0.3147-0.0844swash
AVOCAn000474.754329.328045.426260.7674275.1689276.04760.41040.1492swash
AVOCAn000570.596824.107146.489765.8524268.5194263.42627.41962.7631collision
AVOCAn000668.758323.966544.791865.1438202.6770198.23974.79442.3655collision
AVOCAn000775.789527.271548.518064.0168149.8479143.13127.13234.7597collision
AVOCAn000893.310742.496850.813954.4567187.9201187.34592.82971.5058collision
AVOCAn00093.69550.10383.591797.1908NaNNaNNaNNaNNaN
AVOCAs0001NaNNaNNaNNaNNaNNaNNaNNaNNaN
AVOCAs000297.386426.661970.724672.6226NaNNaNNaNNaNNaN
AVOCAs000370.740140.060830.791943.5282NaNNaNNaNNaNNaN
AVOCAs000497.838945.484552.215753.3691NaNNaNNaNNaNNaN
AVOCAs000595.171154.972240.170642.2088NaNNaNNaNNaNNaN
AVOCAs0006112.581867.871844.825239.8157NaNNaNNaNNaNNaN
AVOCAs000765.353144.153721.522832.9331NaNNaNNaNNaNNaN
AVOCAs000852.394044.91527.480314.2770NaNNaNNaNNaNNaN
BILG000119.41777.574611.843160.9913NaNNaNNaNNaNNaN
BILG0002155.699898.169357.434036.8876NaNNaNNaNNaNNaN
BILG000383.521952.805930.553736.581741.146940.60810.00000.0000swash
BILG0004158.6283116.618942.117826.551211.221111.0892-0.0132-0.1179swash
BILG0005212.8478164.004448.431222.7539613.6156606.27665.77380.9410collision
BLUEYS000165.462819.293846.169070.5270130.7447120.54469.56017.3121collision
BLUEYS000250.208410.300939.907479.4836512.0154477.177433.28256.5003collision
BLUEYS000350.630811.168239.462577.9418443.0853414.390124.88705.6167collision
BLUEYS000495.160831.333063.827967.0737287.5805272.426712.96414.5080collision
BLUEYS0005141.064358.254582.809858.7036539.3864520.073212.04702.2335collision
BLUEYS000688.420751.620536.255341.0032271.6036267.19543.60451.3271collision
BOAT000123.851023.5660-0.0264-0.1108NaNNaNNaNNaNNaN
BOAT000237.652414.020923.631662.7624NaNNaNNaNNaNNaN
..............................
TREACH001497.532346.299451.081652.3740508.7400505.78770.42540.0836swash
TREACH001596.832745.196251.636453.3254690.8275683.44581.50860.2184NaN
TREACH0016106.908366.056740.362937.7547508.0014499.63150.33860.0667swash
WAMBE0001132.3413143.4459-9.7255-7.3488665.9898667.59230.04100.0062swash
WAMBE0002151.1833126.984423.954815.8449385.8467386.7284-0.0449-0.0116swash
WAMBE0003154.1788117.944136.242523.5068694.2226700.5105-4.2136-0.6070swash
WAMBE0004137.844976.600761.272544.4503559.5485569.8591-4.4590-0.7969swash
WAMBE0005NaNNaNNaNNaNNaNNaNNaNNaNNaN
WAMBE0006205.8453186.078422.589210.973955.089855.89190.00000.0000swash
WAMBE000780.467435.461445.005955.9307178.1005178.54390.47270.2654swash
WAMBE000888.457440.320048.137454.4187258.7513258.3849-1.2073-0.4666swash
WAMBE000970.915926.174244.741863.0913267.3725258.37209.80413.6668collision
WAMBE001058.660418.041840.618669.2437187.5259161.974825.308713.4961collision
WAMBE001159.241516.316542.925072.4577197.0129175.251221.988211.1608collision
WAMBE001274.418923.023251.395769.0627178.4783168.347510.03865.6246collision
WAMBE001370.496422.754647.741967.7224231.1513195.258135.807215.4908collision
WAMBE001468.089624.185343.904364.480282.426861.260121.171825.6856collision
WAMBE001555.078016.011939.066070.9286NaNNaNNaNNaNNaN
WAMBE001696.768739.822456.946358.8479NaNNaNNaNNaNNaN
WAMBE001735.29878.514026.784775.8801NaNNaNNaNNaNNaN
WAMBE001840.940710.514730.426074.3173NaNNaNNaNNaNNaN
WAMBE001938.28389.215629.068275.9282NaNNaNNaNNaNNaN
WAMBE0020NaNNaNNaNNaNNaNNaNNaNNaNNaN
WAMBE0021NaNNaNNaNNaNNaNNaNNaNNaNNaN
WAMBE00220.55160.28400.267548.5063NaNNaNNaNNaNNaN
WAMBE00233.37610.30203.074191.0554NaNNaNNaNNaNNaN
WAMBE002460.864831.279429.585448.6084NaNNaNNaNNaNNaN
WAMBE002545.105514.602830.502867.6253NaNNaNNaNNaNNaN
WAMBE002632.150212.933519.216759.7716NaNNaNNaNNaNNaN
WAMBE002726.231018.68287.548228.7759NaNNaNNaNNaNNaN
\n", + "

1768 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " prestorm_swash_vol poststorm_swash_vol swash_vol_change \\\n", + "site_id \n", + "AVOCAn0001 113.9091 77.9830 35.6103 \n", + "AVOCAn0002 106.8959 67.0913 39.6373 \n", + "AVOCAn0003 99.0484 53.6563 45.1621 \n", + "AVOCAn0004 74.7543 29.3280 45.4262 \n", + "AVOCAn0005 70.5968 24.1071 46.4897 \n", + "AVOCAn0006 68.7583 23.9665 44.7918 \n", + "AVOCAn0007 75.7895 27.2715 48.5180 \n", + "AVOCAn0008 93.3107 42.4968 50.8139 \n", + "AVOCAn0009 3.6955 0.1038 3.5917 \n", + "AVOCAs0001 NaN NaN NaN \n", + "AVOCAs0002 97.3864 26.6619 70.7246 \n", + "AVOCAs0003 70.7401 40.0608 30.7919 \n", + "AVOCAs0004 97.8389 45.4845 52.2157 \n", + "AVOCAs0005 95.1711 54.9722 40.1706 \n", + "AVOCAs0006 112.5818 67.8718 44.8252 \n", + "AVOCAs0007 65.3531 44.1537 21.5228 \n", + "AVOCAs0008 52.3940 44.9152 7.4803 \n", + "BILG0001 19.4177 7.5746 11.8431 \n", + "BILG0002 155.6998 98.1693 57.4340 \n", + "BILG0003 83.5219 52.8059 30.5537 \n", + "BILG0004 158.6283 116.6189 42.1178 \n", + "BILG0005 212.8478 164.0044 48.4312 \n", + "BLUEYS0001 65.4628 19.2938 46.1690 \n", + "BLUEYS0002 50.2084 10.3009 39.9074 \n", + "BLUEYS0003 50.6308 11.1682 39.4625 \n", + "BLUEYS0004 95.1608 31.3330 63.8279 \n", + "BLUEYS0005 141.0643 58.2545 82.8098 \n", + "BLUEYS0006 88.4207 51.6205 36.2553 \n", + "BOAT0001 23.8510 23.5660 -0.0264 \n", + "BOAT0002 37.6524 14.0209 23.6316 \n", + "... ... ... ... \n", + "TREACH0014 97.5323 46.2994 51.0816 \n", + "TREACH0015 96.8327 45.1962 51.6364 \n", + "TREACH0016 106.9083 66.0567 40.3629 \n", + "WAMBE0001 132.3413 143.4459 -9.7255 \n", + "WAMBE0002 151.1833 126.9844 23.9548 \n", + "WAMBE0003 154.1788 117.9441 36.2425 \n", + "WAMBE0004 137.8449 76.6007 61.2725 \n", + "WAMBE0005 NaN NaN NaN \n", + "WAMBE0006 205.8453 186.0784 22.5892 \n", + "WAMBE0007 80.4674 35.4614 45.0059 \n", + "WAMBE0008 88.4574 40.3200 48.1374 \n", + "WAMBE0009 70.9159 26.1742 44.7418 \n", + "WAMBE0010 58.6604 18.0418 40.6186 \n", + "WAMBE0011 59.2415 16.3165 42.9250 \n", + "WAMBE0012 74.4189 23.0232 51.3957 \n", + "WAMBE0013 70.4964 22.7546 47.7419 \n", + "WAMBE0014 68.0896 24.1853 43.9043 \n", + "WAMBE0015 55.0780 16.0119 39.0660 \n", + "WAMBE0016 96.7687 39.8224 56.9463 \n", + "WAMBE0017 35.2987 8.5140 26.7847 \n", + "WAMBE0018 40.9407 10.5147 30.4260 \n", + "WAMBE0019 38.2838 9.2156 29.0682 \n", + "WAMBE0020 NaN NaN NaN \n", + "WAMBE0021 NaN NaN NaN \n", + "WAMBE0022 0.5516 0.2840 0.2675 \n", + "WAMBE0023 3.3761 0.3020 3.0741 \n", + "WAMBE0024 60.8648 31.2794 29.5854 \n", + "WAMBE0025 45.1055 14.6028 30.5028 \n", + "WAMBE0026 32.1502 12.9335 19.2167 \n", + "WAMBE0027 26.2310 18.6828 7.5482 \n", + "\n", + " swash_pct_change prestorm_dune_face_vol poststorm_dune_face_vol \\\n", + "site_id \n", + "AVOCAn0001 31.2620 165.4760 166.7296 \n", + "AVOCAn0002 37.0803 256.4137 258.9174 \n", + "AVOCAn0003 45.5960 372.7031 373.9198 \n", + "AVOCAn0004 60.7674 275.1689 276.0476 \n", + "AVOCAn0005 65.8524 268.5194 263.4262 \n", + "AVOCAn0006 65.1438 202.6770 198.2397 \n", + "AVOCAn0007 64.0168 149.8479 143.1312 \n", + "AVOCAn0008 54.4567 187.9201 187.3459 \n", + "AVOCAn0009 97.1908 NaN NaN \n", + "AVOCAs0001 NaN NaN NaN \n", + "AVOCAs0002 72.6226 NaN NaN \n", + "AVOCAs0003 43.5282 NaN NaN \n", + "AVOCAs0004 53.3691 NaN NaN \n", + "AVOCAs0005 42.2088 NaN NaN \n", + "AVOCAs0006 39.8157 NaN NaN \n", + "AVOCAs0007 32.9331 NaN NaN \n", + "AVOCAs0008 14.2770 NaN NaN \n", + "BILG0001 60.9913 NaN NaN \n", + "BILG0002 36.8876 NaN NaN \n", + "BILG0003 36.5817 41.1469 40.6081 \n", + "BILG0004 26.5512 11.2211 11.0892 \n", + "BILG0005 22.7539 613.6156 606.2766 \n", + "BLUEYS0001 70.5270 130.7447 120.5446 \n", + "BLUEYS0002 79.4836 512.0154 477.1774 \n", + "BLUEYS0003 77.9418 443.0853 414.3901 \n", + "BLUEYS0004 67.0737 287.5805 272.4267 \n", + "BLUEYS0005 58.7036 539.3864 520.0732 \n", + "BLUEYS0006 41.0032 271.6036 267.1954 \n", + "BOAT0001 -0.1108 NaN NaN \n", + "BOAT0002 62.7624 NaN NaN \n", + "... ... ... ... \n", + "TREACH0014 52.3740 508.7400 505.7877 \n", + "TREACH0015 53.3254 690.8275 683.4458 \n", + "TREACH0016 37.7547 508.0014 499.6315 \n", + "WAMBE0001 -7.3488 665.9898 667.5923 \n", + "WAMBE0002 15.8449 385.8467 386.7284 \n", + "WAMBE0003 23.5068 694.2226 700.5105 \n", + "WAMBE0004 44.4503 559.5485 569.8591 \n", + "WAMBE0005 NaN NaN NaN \n", + "WAMBE0006 10.9739 55.0898 55.8919 \n", + "WAMBE0007 55.9307 178.1005 178.5439 \n", + "WAMBE0008 54.4187 258.7513 258.3849 \n", + "WAMBE0009 63.0913 267.3725 258.3720 \n", + "WAMBE0010 69.2437 187.5259 161.9748 \n", + "WAMBE0011 72.4577 197.0129 175.2512 \n", + "WAMBE0012 69.0627 178.4783 168.3475 \n", + "WAMBE0013 67.7224 231.1513 195.2581 \n", + "WAMBE0014 64.4802 82.4268 61.2601 \n", + "WAMBE0015 70.9286 NaN NaN \n", + "WAMBE0016 58.8479 NaN NaN \n", + "WAMBE0017 75.8801 NaN NaN \n", + "WAMBE0018 74.3173 NaN NaN \n", + "WAMBE0019 75.9282 NaN NaN \n", + "WAMBE0020 NaN NaN NaN \n", + "WAMBE0021 NaN NaN NaN \n", + "WAMBE0022 48.5063 NaN NaN \n", + "WAMBE0023 91.0554 NaN NaN \n", + "WAMBE0024 48.6084 NaN NaN \n", + "WAMBE0025 67.6253 NaN NaN \n", + "WAMBE0026 59.7716 NaN NaN \n", + "WAMBE0027 28.7759 NaN NaN \n", + "\n", + " dune_face_vol_change dune_face_pct_change storm_regime \n", + "site_id \n", + "AVOCAn0001 0.0000 0.0000 swash \n", + "AVOCAn0002 0.0000 0.0000 swash \n", + "AVOCAn0003 -0.3147 -0.0844 swash \n", + "AVOCAn0004 0.4104 0.1492 swash \n", + "AVOCAn0005 7.4196 2.7631 collision \n", + "AVOCAn0006 4.7944 2.3655 collision \n", + "AVOCAn0007 7.1323 4.7597 collision \n", + "AVOCAn0008 2.8297 1.5058 collision \n", + "AVOCAn0009 NaN NaN NaN \n", + "AVOCAs0001 NaN NaN NaN \n", + "AVOCAs0002 NaN NaN NaN \n", + "AVOCAs0003 NaN NaN NaN \n", + "AVOCAs0004 NaN NaN NaN \n", + "AVOCAs0005 NaN NaN NaN \n", + "AVOCAs0006 NaN NaN NaN \n", + "AVOCAs0007 NaN NaN NaN \n", + "AVOCAs0008 NaN NaN NaN \n", + "BILG0001 NaN NaN NaN \n", + "BILG0002 NaN NaN NaN \n", + "BILG0003 0.0000 0.0000 swash \n", + "BILG0004 -0.0132 -0.1179 swash \n", + "BILG0005 5.7738 0.9410 collision \n", + "BLUEYS0001 9.5601 7.3121 collision \n", + "BLUEYS0002 33.2825 6.5003 collision \n", + "BLUEYS0003 24.8870 5.6167 collision \n", + "BLUEYS0004 12.9641 4.5080 collision \n", + "BLUEYS0005 12.0470 2.2335 collision \n", + "BLUEYS0006 3.6045 1.3271 collision \n", + "BOAT0001 NaN NaN NaN \n", + "BOAT0002 NaN NaN NaN \n", + "... ... ... ... \n", + "TREACH0014 0.4254 0.0836 swash \n", + "TREACH0015 1.5086 0.2184 NaN \n", + "TREACH0016 0.3386 0.0667 swash \n", + "WAMBE0001 0.0410 0.0062 swash \n", + "WAMBE0002 -0.0449 -0.0116 swash \n", + "WAMBE0003 -4.2136 -0.6070 swash \n", + "WAMBE0004 -4.4590 -0.7969 swash \n", + "WAMBE0005 NaN NaN NaN \n", + "WAMBE0006 0.0000 0.0000 swash \n", + "WAMBE0007 0.4727 0.2654 swash \n", + "WAMBE0008 -1.2073 -0.4666 swash \n", + "WAMBE0009 9.8041 3.6668 collision \n", + "WAMBE0010 25.3087 13.4961 collision \n", + "WAMBE0011 21.9882 11.1608 collision \n", + "WAMBE0012 10.0386 5.6246 collision \n", + "WAMBE0013 35.8072 15.4908 collision \n", + "WAMBE0014 21.1718 25.6856 collision \n", + "WAMBE0015 NaN NaN NaN \n", + "WAMBE0016 NaN NaN NaN \n", + "WAMBE0017 NaN NaN NaN \n", + "WAMBE0018 NaN NaN NaN \n", + "WAMBE0019 NaN NaN NaN \n", + "WAMBE0020 NaN NaN NaN \n", + "WAMBE0021 NaN NaN NaN \n", + "WAMBE0022 NaN NaN NaN \n", + "WAMBE0023 NaN NaN NaN \n", + "WAMBE0024 NaN NaN NaN \n", + "WAMBE0025 NaN NaN NaN \n", + "WAMBE0026 NaN NaN NaN \n", + "WAMBE0027 NaN NaN NaN \n", + "\n", + "[1768 rows x 9 columns]" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] } ], "metadata": { + "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python", @@ -1033,9 +2036,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": "275.797px" + }, "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 b99ab01..86154e4 100644 --- a/notebooks/03_dune_to_vs_runup.ipynb +++ b/notebooks/03_dune_to_vs_runup.ipynb @@ -4,17 +4,27 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Investigate how dune toe compares to R_high" + "## Setup " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "heading_collapsed": true + }, + "source": [ + "### Import packages" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T23:04:57.331037Z", - "start_time": "2018-12-03T23:04:57.006071Z" - } + "end_time": "2018-12-10T04:02:38.872624Z", + "start_time": "2018-12-10T04:02:38.448908Z" + }, + "hidden": true }, "outputs": [], "source": [ @@ -25,12 +35,13 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 7, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T23:04:58.749827Z", - "start_time": "2018-12-03T23:04:57.333943Z" - } + "end_time": "2018-12-10T04:03:27.147221Z", + "start_time": "2018-12-10T04:03:27.141204Z" + }, + "hidden": true }, "outputs": [], "source": [ @@ -39,18 +50,29 @@ "import pandas as pd\n", "import numpy as np\n", "import os\n", - "\n", + "import matplotlib\n", "import plotly\n", "import plotly.graph_objs as go\n", "import plotly.plotly as py\n", "import plotly.tools as tls\n", "import plotly.figure_factory as ff\n", - "import plotly.io as pio" + "import plotly.io as pio\n", + "from plotly import tools\n", + "\n", + "from copy import copy\n", + "import scipy\n", + "from sklearn import svm\n", + "\n", + "# Disable numpy warnings\n", + "import warnings\n", + "warnings.simplefilter(action=\"ignore\", category=FutureWarning)" ] }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ "### Load data\n", "Load data from the `./data/interim/` folder and parse into `pandas` dataframes." @@ -58,35 +80,20 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 8, "metadata": { "ExecuteTime": { - "end_time": "2018-12-03T23:05:05.800496Z", - "start_time": "2018-12-03T23:04:58.751721Z" - } + "end_time": "2018-12-10T04:03:40.638982Z", + "start_time": "2018-12-10T04:03:31.765531Z" + }, + "hidden": true }, "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:\n", - "\n", - "elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ + "Importing profiles.csv\n", "Importing profile_features.csv\n", "Importing impacts_forecasted_foreshore_slope_sto06.csv\n", "Importing impacts_forecasted_mean_slope_sto06.csv\n", @@ -125,31 +132,49 @@ }, { "cell_type": "markdown", - "metadata": {}, + "metadata": { + "heading_collapsed": true + }, "source": [ - "### 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?" + "## Difference between $R_{high}$ and $D_{low}$\n", + "Since the Storm Impact Regime is so dependant on the predicted $R_{high}$ and obsereved $D_{low}$ levels, let's investigate the difference between these two variables in more detail.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "### Gather data\n", + "\n", + "First, let's split the `site_ids` by whether we observed swash or collision and by whether we predicted swash or collision. We want to identify if there are any difference between these four groups." ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 10, "metadata": { "ExecuteTime": { - "end_time": "2018-12-04T02:20:58.446500Z", - "start_time": "2018-12-04T02:20:58.439480Z" - } + "end_time": "2018-12-10T04:05:15.741391Z", + "start_time": "2018-12-10T04:05:15.734352Z" + }, + "hidden": true }, "outputs": [], "source": [ - "def get_site_ids(df_forecasted, df_observed, forecasted_regime, observed_regime):\n", + "def get_site_ids(df_forecasted, df_observed, forecasted_regime,\n", + " 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", + " set1 = set(\n", + " df_forecasted.query(\"storm_regime == '{}'\".format(forecasted_regime)).\n", + " index.get_level_values('site_id'))\n", + " set2 = set(\n", + " df_observed.query(\"storm_regime == '{}'\".format(observed_regime)).\n", + " index.get_level_values('site_id'))\n", " return sorted(list(set1.intersection(set2)))\n", "\n", "\n", @@ -166,23 +191,104 @@ " # 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" + " return df_twl_toes['diff']" ] }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 15, "metadata": { "ExecuteTime": { - "end_time": "2018-12-04T03:55:51.858020Z", - "start_time": "2018-12-04T03:55:50.879155Z" - } + "end_time": "2018-12-10T04:13:00.035545Z", + "start_time": "2018-12-10T04:12:59.176352Z" + }, + "hidden": true + }, + "outputs": [], + "source": [ + "# Identify sites where swash regime was correctly or overpredicted\n", + "\n", + "swash_overpredicted_site_ids = get_site_ids(\n", + " 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(\n", + " 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(\n", + " 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(\n", + " site_ids=swash_correct_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T04:12:58.434634Z", + "start_time": "2018-12-10T04:12:57.096839Z" + }, + "hidden": true + }, + "outputs": [], + "source": [ + "# Identify sites where collision regime was correctly or underpredicted\n", + "\n", + "collision_underpredicted_site_ids = get_site_ids(\n", + " 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(\n", + " 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(\n", + " 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(\n", + " site_ids=collision_correct_site_ids,\n", + " df_profile_features=df_profile_features,\n", + " df_twls=twls['forecasted']['mean_slope_sto06'])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "### Plot difference in $R_{high}$ and $D_{low}$ for swash and collision regimes\n", + "What does the distribution of elevations look like for when we observe swash and collision regimes? Are there any difference between correctly and incorrectly predicted swash regime impacts?" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T04:06:02.634355Z", + "start_time": "2018-12-10T04:05:42.644585Z" + }, + "hidden": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "94883b85733444528fe8a73379ce4611", + "model_id": "f53f0ffc577b406ab56c1357c1145683", "version_major": 2, "version_minor": 0 }, @@ -198,79 +304,70 @@ } ], "source": [ - "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", + "trace1 = go.Histogram(\n", + " y=swash_correct_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Correctly predicted',\n", + " marker=dict(color='#67a9cf', ),\n", + " ybins=dict(size=0.1),\n", + ")\n", + "trace2 = go.Histogram(\n", + " y=swash_overpredicted_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Overpredicted',\n", + " marker=dict(color='#ef8a62', ),\n", + " ybins=dict(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", + " yaxis=dict(title='z (m AHD)'),\n", + " xaxis=dict(title='Count'),\n", " bargap=0.2,\n", " bargroupgap=0.1,\n", - " legend=dict(x=.6, y=1)\n", - ")\n", + " legend=dict(x=.6, y=1))\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", + "img_bytes = pio.write_image(\n", + " g_plot_swash,\n", + " '02_R_high_D_low_swash.png',\n", + " format='png',\n", + " width=600,\n", + " height=400,\n", + " scale=5)\n", "\n", - "g_plot_swash\n", - "\n" + "g_plot_swash" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "The plot above shows that when $R_{high}$ - $D_{low}$ is $<0$, swash is correctly predicted. This is by definition, so is not surprising. The biggest occurance of $R_{high}$ - $D_{low}$ is slightly below $0$, so it appears that we have correctly predicted a majority of the observed swash regime events. \n", + "\n", + "Let's do the same thing, now considering `site_ids` where we have observed collision." ] }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 16, "metadata": { "ExecuteTime": { - "end_time": "2018-12-04T04:10:47.339268Z", - "start_time": "2018-12-04T04:10:45.796887Z" - } + "end_time": "2018-12-10T04:13:03.703119Z", + "start_time": "2018-12-10T04:13:03.463485Z" + }, + "hidden": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "3933da9295fe446f9413bca8842100c2", + "model_id": "4ec08bf2ea6f482ea3c52aa3348a05e2", "version_major": 2, "version_minor": 0 }, @@ -286,105 +383,794 @@ } ], "source": [ - "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", + "trace1 = go.Histogram(\n", + " y=collision_correct_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Correctly predicted',\n", + " marker=dict(color='#67a9cf', ),\n", + " ybins=dict(size=0.1),\n", + ")\n", + "trace2 = go.Histogram(\n", + " y=collision_underpredicted_diffs.tolist(),\n", + " opacity=0.75,\n", + " name='Underpredicted',\n", + " marker=dict(color='#ef8a62', ),\n", + " ybins=dict(size=0.1),\n", + ")\n", "\n", "layout = go.Layout(\n", " title='R_high - D_low
Collision Regime',\n", " barmode='overlay',\n", - " yaxis=dict(\n", - " title='z (m AHD)'\n", - " ),\n", - " xaxis=dict(\n", - " title='Count'\n", - " ),\n", + " yaxis=dict(title='z (m AHD)'),\n", + " xaxis=dict(title='Count'),\n", " bargap=0.2,\n", " bargroupgap=0.1,\n", - " legend=dict(x=.6, y=1)\n", - ")\n", + " legend=dict(x=.6, y=1))\n", "\n", "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", + "img_bytes = pio.write_image(\n", + " g_plot_collision,\n", + " '02_R_high_D_low_collision.png',\n", + " format='png',\n", + " width=600,\n", + " height=400,\n", + " scale=5)\n", "\n", "g_plot_collision" ] }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "We can see a trend similar to the swash regime, except flipped. A majority of the correctly forecasted collision regimes occur when $R_{high}$ - $D_{low}$ is $>0$, by definition. " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "hidden": true + }, + "source": [ + "### TODO Does dune toe lower?\n", + "Is there any patterns that dictate whether the dune toe raises or lowers when subject to collision. Is it just based on the peak $R_{high}$ level, similar to equilibrium theory?\n" + ] + }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Does dune toe lower?\n" + "## Relationship between parameters\n", + "Let's further investigate the relationship between hydrodynamic and morphodynamic parameters and see if they can tell us any more about how the storm regime may be correctly or incorrectly predicted." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Add functions for adding parameters to the dataframe\n", + "We need some additional functions which will add parameters to our dataframe so we can plot them." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T04:55:43.229433Z", + "start_time": "2018-12-10T04:55:43.218402Z" + } + }, + "outputs": [], + "source": [ + "def add_berm_width(df, df_profiles, df__profile_features):\n", + " \"\"\"\n", + " Adds a new column to the dataframe, with the prestorm berm width\n", + " \"\"\"\n", + " # Get x coorindates of dune toe and limit of survey (z=0)\n", + " df_profile_end_x = df_profiles.query('profile_type==\"prestorm\"').dropna(\n", + " subset=['z']).groupby('site_id').tail(1).reset_index(\n", + " ['profile_type', 'x']).x.rename('x_end').to_frame()\n", + " df_profile_dune_toe_x = df_profile_features.query(\n", + " 'profile_type==\"prestorm\"').dune_toe_x.to_frame()\n", + "\n", + " # Merge and take the difference to calculate berm width\n", + " df_merged = df_profile_end_x.merge(\n", + " df_profile_dune_toe_x, left_index=True, right_index=True)\n", + " berm_width = (df_merged['x_end'] -\n", + " df_merged['dune_toe_x']).rename('berm_width').to_frame()\n", + "\n", + " # Return the dataframe with the berm_width col merged\n", + " return df.merge(berm_width, left_index=True, right_index=True)\n", + "\n", + "\n", + "def add_observed_regime(df, df_observed, new_col='observed_storm_regime'):\n", + " \"\"\"\n", + " Adds a new column to the dataframe, with the observed storm regime\n", + " \"\"\"\n", + " return df.merge(\n", + " impacts['observed'].storm_regime.rename(new_col).to_frame(),\n", + " left_index=True,\n", + " right_index=True)\n", + "\n", + "\n", + "def add_mean_slope(df, df_twl):\n", + " \"\"\"\n", + " Adds a new column to the dataframe with prestorm mean slope\n", + " \"\"\"\n", + " df_mean_slope = df_twl.groupby('site_id').first().beta.rename(\n", + " 'mean_slope').to_frame()\n", + " return df.merge(df_mean_slope, left_index=True, right_index=True)\n", + "\n", + "\n", + "def add_prestorm_berm_vol(df, df_impacts_observed):\n", + " \"\"\"\n", + " Adds a new column to the dataframe with prestorm berm volume\n", + " \"\"\"\n", + " return df.merge(\n", + " df_impacts_observed.prestorm_swash_vol.rename('prestorm_berm_vol').\n", + " to_frame(),\n", + " left_index=True,\n", + " right_index=True)\n", + "\n", + "\n", + "def add_prediction_class(df_impacts, prediction_classes):\n", + " \"\"\"\n", + " Adds a column which groups site_ids into the predicted and observed storm regime combination\n", + " \"\"\"\n", + " for prediction_class in prediction_classes:\n", + " df_impacts.loc[df_impacts.index.isin(prediction_class['site_ids']),\n", + " 'prediction_class'] = prediction_class['class']\n", + " return df_impacts" + ] + }, + { + "cell_type": "markdown", "metadata": {}, + "source": [ + "### Create the dataframe\n", + "We need to combine and add data into a single dataframe for comparison purposes." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T04:55:45.293320Z", + "start_time": "2018-12-10T04:55:44.802910Z" + } + }, "outputs": [], - "source": [] + "source": [ + "# Start with the forecasted impact dataframe\n", + "df = impacts['forecasted']['mean_slope_sto06']\n", + "\n", + "# Add a column which groups site_ids into the predicted and observed storm regime combination\n", + "prediction_classes = [\n", + " {\n", + " 'site_ids': collision_underpredicted_site_ids,\n", + " 'class': 'collision_underpredicted'\n", + " },\n", + " {\n", + " 'site_ids': collision_correct_site_ids,\n", + " 'class': 'collision_correct'\n", + " },\n", + " {\n", + " 'site_ids': swash_overpredicted_site_ids,\n", + " 'class': 'swash_overpredicted'\n", + " },\n", + " {\n", + " 'site_ids': swash_correct_site_ids,\n", + " 'class': 'swash_correct'\n", + " },\n", + "]\n", + "df = add_prediction_class(df, prediction_classes)\n", + "\n", + "# Drop site_ids where we do not have a prediction class (caused by NaNs)\n", + "df = df.dropna(subset=['prediction_class'])\n", + "\n", + "# Add additional parameters\n", + "df = add_observed_regime(df, impacts['observed'])\n", + "df = add_berm_width(df, df_profiles, df_profile_features)\n", + "df = add_mean_slope(df, df_twl=twls['forecasted']['mean_slope_sto06'])\n", + "df = add_prestorm_berm_vol(df, df_impacts_observed=impacts['observed'])\n", + "df['R_high_dune_toe_diff'] = df['R_high'] - df['dune_toe_z']\n", + "df['R_high_dune_toe_ratio'] = df['R_high'] / df['dune_toe_z']" + ] }, { "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create scatter plot matrix of parameter interactions\n", + "Plot each hydrodynamic and morphodynamic parameter against each other and see if we can identify any patterns." + ] + }, + { + "cell_type": "code", + "execution_count": 46, "metadata": { - "heading_collapsed": true + "ExecuteTime": { + "end_time": "2018-12-10T05:52:23.384061Z", + "start_time": "2018-12-10T05:52:21.345652Z" + } }, + "outputs": [], + "source": [ + "# Setup colors for different classes\n", + "text = df['prediction_class'].tolist()\n", + "class_code = {x['class']: n for n, x in enumerate(prediction_classes)}\n", + "color_vals = [class_code[cl] for cl in df['prediction_class']]\n", + "\n", + "# Each prediction class will have its own color\n", + "pl_colorscale = [[0.0, '#d7191c'], [0.25, '#d7191c'], [0.25, '#fdae61'],\n", + " [0.5, '#fdae61'], [0.5, '#2c7bb6'], [0.75, '#2c7bb6'],\n", + " [0.75, '#abd9e9'], [1, '#abd9e9']]\n", + "\n", + "# Setup plotly scatterplot matrix\n", + "trace1 = go.Splom(\n", + " dimensions=[\n", + " dict(label='dune_toe_z', values=df['dune_toe_z']),\n", + " dict(label='R_high', values=df['R_high']),\n", + " dict(label='berm_width', values=df['berm_width']),\n", + " dict(\n", + " label='twl_dune_toe_z_exceedance_hrs',\n", + " values=df['twl_dune_toe_z_exceedance_hrs']),\n", + " dict(label='R_high_dune_toe_diff', values=df['R_high_dune_toe_diff']),\n", + " dict(\n", + " label='R_high_dune_toe_ratio', values=df['R_high_dune_toe_ratio']),\n", + " dict(label='mean_slope', values=df['mean_slope']),\n", + " dict(label='prestorm_berm_vol', values=df['prestorm_berm_vol']),\n", + " ],\n", + " text=text,\n", + " diagonal=dict(visible=False),\n", + " showupperhalf=False,\n", + " marker=dict(\n", + " color=color_vals,\n", + " size=2,\n", + " colorscale=pl_colorscale,\n", + " showscale=False,\n", + " line=dict(width=0.1, color='rgb(230,230,230)')))\n", + "\n", + "axis = dict(showline=True, zeroline=False, gridcolor='#fff', ticklen=4)\n", + "\n", + "layout = go.Layout(\n", + " title='Storm Impact Scatter Plot Matrix',\n", + " dragmode='select',\n", + " width=800,\n", + " height=800,\n", + " autosize=False,\n", + " hovermode='closest',\n", + " plot_bgcolor='rgba(240,240,240, 0.95)',\n", + " xaxis1=dict(axis),\n", + " xaxis2=dict(axis),\n", + " xaxis3=dict(axis),\n", + " xaxis4=dict(axis),\n", + " xaxis5=dict(axis),\n", + " xaxis6=dict(axis),\n", + " xaxis7=dict(axis),\n", + " xaxis8=dict(axis),\n", + " yaxis1=dict(axis),\n", + " yaxis2=dict(axis),\n", + " yaxis3=dict(axis),\n", + " yaxis4=dict(axis),\n", + " yaxis5=dict(axis),\n", + " yaxis6=dict(axis),\n", + " yaxis7=dict(axis),\n", + " yaxis8=dict(axis),\n", + ")\n", + "\n", + "# Change font of axis labels\n", + "for ax in layout:\n", + " if 'xaxis' in ax or 'yaxis' in ax:\n", + " layout[ax]['titlefont'] = {'size': 12}\n", + "\n", + "fig_scatter = go.FigureWidget(data=[trace1], layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(\n", + " fig_scatter,\n", + " '02_scatter_plot.png',\n", + " format='png',\n", + " width=1500,\n", + " height=1500,\n", + " scale=5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "### What do over predicted and underpredicted profiles look like?" + "Jupyter get's a little bit slow when trying to display this plot interactively, so let's output it as an image to view.\n", + "![02_scatter_plot.png](02_scatter_plot.png)" ] }, { "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create parameter confusion matrix\n", + "It's a bit hard to see the difference between the different categories, lets do a confusion matrix but with plots showing two variables on each axis. First, list all the different parameters we have available to plot against:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, "metadata": { - "hidden": true + "ExecuteTime": { + "end_time": "2018-12-10T05:27:34.225427Z", + "start_time": "2018-12-10T05:27:34.218427Z" + } }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['datetime', 'R_high', 'R_low', 'dune_toe_z', 'dune_crest_z',\n", + " 'storm_regime', 'twl_dune_toe_z_exceedance_hrs', 'prediction_class',\n", + " 'observed_storm_regime', 'berm_width', 'mean_slope',\n", + " 'prestorm_berm_vol', 'R_high_dune_toe_diff', 'R_high_dune_toe_ratio'],\n", + " dtype='object')" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "Define a function for getting the average beach profile for a number of given site_ids:" + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T05:29:42.927017Z", + "start_time": "2018-12-10T05:29:38.603905Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This is the format of your plot grid:\n", + "[ (1,1) x1,y1 ] [ (1,2) x2,y2 ]\n", + "[ (2,1) x3,y3 ] [ (2,2) x4,y4 ]\n", + "\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "397f170343fe45b4acf9aded46595ac8", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FigureWidget({\n", + " 'data': [{'marker': {'color': 'rgb(200,200,200)', 'size': 4},\n", + " 'mode': 'marker…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Define which columns we want to plot\n", + "x_col = 'prestorm_berm_vol'\n", + "y_col = 'R_high_dune_toe_diff'\n", + "marker_size = 4\n", + "\n", + "# Create 2x2 subplot figure confusion matrix\n", + "fig = tools.make_subplots(\n", + " rows=2,\n", + " cols=2,\n", + " vertical_spacing=0.09,\n", + " subplot_titles=(\n", + " 'Predicted Swash',\n", + " 'Predicted Collision',\n", + " '',\n", + " '',\n", + " ))\n", + "\n", + "# Get data for all traces\n", + "x_all = df.loc[:, x_col]\n", + "y_all = df.loc[:, y_col]\n", + "\n", + "# Create underlying grey traces of all data, so we can compare each subplot with the all the data.\n", + "trace5 = go.Scatter(\n", + " mode='markers',\n", + " x=x_all,\n", + " y=y_all,\n", + " showlegend=False,\n", + " marker=dict(\n", + " color='rgb(200,200,200)',\n", + " size=marker_size,\n", + " ))\n", + "fig.append_trace(trace5, 1, 1)\n", + "\n", + "trace6 = copy(trace5)\n", + "trace6.xaxis = 'x2'\n", + "trace6.yaxis = 'y'\n", + "fig.append_trace(trace6, 1, 2)\n", + "\n", + "trace7 = copy(trace5)\n", + "trace7.xaxis = 'x'\n", + "trace7.yaxis = 'y2'\n", + "fig.append_trace(trace7, 2, 1)\n", + "\n", + "trace8 = copy(trace5)\n", + "trace8.xaxis = 'x2'\n", + "trace8.yaxis = 'y2'\n", + "fig.append_trace(trace8, 2, 2)\n", + "\n", + "# Add actual data for each subplot\n", + "\n", + "# Predicted swash, observed collision\n", + "trace1 = go.Scatter(\n", + " mode='markers',\n", + " x=df.loc[df.index.isin(collision_underpredicted_site_ids), x_col],\n", + " y=df.loc[df.index.isin(collision_underpredicted_site_ids), y_col],\n", + " marker=dict(\n", + " color='#fc8d59',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "fig.append_trace(trace1, 2, 1)\n", + "\n", + "# Predicted collision, observed collision\n", + "trace2 = go.Scatter(\n", + " mode='markers',\n", + " x=df.loc[df.index.isin(collision_correct_site_ids), x_col],\n", + " y=df.loc[df.index.isin(collision_correct_site_ids), y_col],\n", + " marker=dict(\n", + " color='#fc8d59',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "fig.append_trace(trace2, 2, 2)\n", + "\n", + "# Predicted swash, observed swash\n", + "trace3 = go.Scatter(\n", + " mode='markers',\n", + " x=df.loc[df.index.isin(swash_correct_site_ids), x_col],\n", + " y=df.loc[df.index.isin(swash_correct_site_ids), y_col],\n", + " marker=dict(\n", + " color='#3182bd',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "fig.append_trace(trace3, 1, 1)\n", + "\n", + "# Predicted collision, observed swash\n", + "trace4 = go.Scatter(\n", + " mode='markers',\n", + " x=df.loc[df.index.isin(swash_overpredicted_site_ids), x_col],\n", + " y=df.loc[df.index.isin(swash_overpredicted_site_ids), y_col],\n", + " marker=dict(\n", + " color='#3182bd',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "fig.append_trace(trace4, 1, 2)\n", + "\n", + "# Update formatting, titles, sizes etc.\n", + "fig['layout']['yaxis1'].update(\n", + " title='{}
{}'.format('Observed swash', y_col))\n", + "fig['layout']['yaxis3'].update(\n", + " title='{}
{}'.format('Observed collision', y_col))\n", + "fig['layout']['xaxis3'].update(title=x_col)\n", + "fig['layout']['xaxis4'].update(title=x_col)\n", + "fig['layout'].update(\n", + " height=700, width=900, title='Storm Regime Confusion Matrix')\n", + "fig['layout']['showlegend'] = False\n", + "fig_to_plot = go.FigureWidget(data=fig.data, layout=fig.layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(\n", + " fig_to_plot,\n", + " '02_storm_regime_confusion.png',\n", + " format='png',\n", + " width=600,\n", + " height=600,\n", + " scale=5)\n", + "\n", + "fig_to_plot" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-09T00:30:34.940581Z", + "start_time": "2018-12-09T00:30:34.825247Z" + } + }, + "source": [ + "Plotting `prestorm_berm_vol` vs `R_high_dune_toe_diff` shows there is a difference between observed swash and collision. It appears when the `prestorm_berm_vol` is smaller than 80 m, we will get collision, regardless of whether `R_high_dune_toe_diff` is greater than 0 m. Let's confirm that there it is a vertical line to differentiate between these two regimes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create regime predictor which includes berm volume\n", + "\n", + "The technique for finding the boundary between two clusters is taken from [StackExchange](https://stackoverflow.com/a/22356267)." + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T05:37:35.785659Z", + "start_time": "2018-12-10T05:37:34.355843Z" + } + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "09471a2157774aa2b17f5b88c2bfaab4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FigureWidget({\n", + " 'data': [{'marker': {'color': '#3182bd', 'line': {'color': 'rgb(231,231,231)', 'width': 0.5…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Get data\n", + "df = df.dropna(subset=['prestorm_berm_vol', 'R_high_dune_toe_diff'])\n", + "\n", + "swash_x = df.query('observed_storm_regime==\"swash\"').prestorm_berm_vol\n", + "swash_y = df.query('observed_storm_regime==\"swash\"').R_high_dune_toe_diff\n", + "swash_samples = np.array([[x, y] for x, y in zip(swash_x, swash_y)])\n", + "\n", + "collision_x = df.query('observed_storm_regime==\"collision\"').prestorm_berm_vol\n", + "collision_y = df.query(\n", + " 'observed_storm_regime==\"collision\"').R_high_dune_toe_diff\n", + "collision_samples = np.array(\n", + " [[x, y] for x, y in zip(collision_x, collision_y)])\n", + "\n", + "# Fit SVM\n", + "X = np.concatenate((swash_samples, collision_samples), axis=0)\n", + "Y = np.array([0] * swash_x.shape[0] + [1] * collision_x.shape[0])\n", + "\n", + "C = 1.0 # SVM regularization parameter\n", + "clf = svm.SVC(kernel='linear', gamma=0.7, C=C)\n", + "clf.fit(X, Y)\n", + "\n", + "w = clf.coef_[0]\n", + "a = -w[0] / w[1]\n", + "y_vals = swash_y.tolist() + collision_y.tolist()\n", + "yy = np.linspace(min(y_vals), max(y_vals))\n", + "xx = (yy + (clf.intercept_[0]) / w[1]) / a\n", + "\n", + "# Prepare plot\n", + "trace_swash = go.Scatter(\n", + " x=swash_x,\n", + " y=swash_y,\n", + " name='Swash',\n", + " mode='markers',\n", + " marker=dict(\n", + " color='#3182bd',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "\n", + "trace_collision = go.Scatter(\n", + " x=collision_x,\n", + " y=collision_y,\n", + " name='Collision',\n", + " mode='markers',\n", + " marker=dict(\n", + " color='#fc8d59',\n", + " size=marker_size,\n", + " line=dict(color='rgb(231,231,231)', width=0.5)))\n", + "\n", + "trace_split = go.Scatter(\n", + " x=xx,\n", + " y=yy,\n", + " name='Split (y={:.1f}x-{:.1f})'.format(a, (clf.intercept_[0]) / w[1]),\n", + ")\n", + "\n", + "layout = dict(\n", + " title='Observed Swash/Collision Regime Split',\n", + " xaxis=dict(title='Prestorm berm volume', ),\n", + " yaxis=dict(title='R_high - D_low'),\n", + " legend=dict(x=.6, y=1.))\n", + "\n", + "fig_to_plot = go.FigureWidget(\n", + " data=[trace_swash, trace_collision, trace_split], layout=layout)\n", + "\n", + "# To output to file\n", + "img_bytes = pio.write_image(\n", + " fig_to_plot,\n", + " '02_storm_regime_split.png',\n", + " format='png',\n", + " width=600,\n", + " height=600,\n", + " scale=5)\n", + "\n", + "fig_to_plot" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Looking at the plot above, it appears when the `prestorm_berm_vol` is less than 80 m, then we should classify it as collision, even if wave runup does not reach the toe of the dune." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Test new berm vol predictor\n", + "\n", + "Now lets go back to our predicted forecasts and see if our confusion matrix improves if we adopt this new criteria for differentiating between swash and collision.\n", + "\n", + "First define a custom function to get colormap for our confusion matrix." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T02:18:08.658221Z", + "start_time": "2018-12-10T02:18:08.653186Z" + } + }, + "outputs": [], + "source": [ + "def matplotlib_to_plotly(cmap_name='RdYlGn', pl_entries=255):\n", + " \"\"\"\n", + " Function to convert matplotlib colorscale to plotly\n", + " \"\"\"\n", + " cmap = matplotlib.cm.get_cmap(cmap_name)\n", + " h = 1.0 / (pl_entries - 1)\n", + " pl_colorscale = []\n", + "\n", + " for k in range(pl_entries):\n", + " C = list(map(np.uint8, np.array(cmap(k * h)[:3]) * 255))\n", + " pl_colorscale.append([k * h, 'rgb' + str((C[0], C[1], C[2]))])\n", + "\n", + " return pl_colorscale" ] }, { "cell_type": "code", - "execution_count": 156, + "execution_count": 40, "metadata": { "ExecuteTime": { - "end_time": "2018-12-04T23:11:08.853877Z", - "start_time": "2018-12-04T23:11:08.846876Z" + "end_time": "2018-12-10T05:44:27.306253Z", + "start_time": "2018-12-10T05:44:25.791799Z" }, - "hidden": true + "code_folding": [] + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "97d8283101e748dd8e2fd7811c97973b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FigureWidget({\n", + " 'data': [{'colorscale': [[0.0, 'rgb(165, 0, 38)'], [0.003937007874015748,\n", + " …" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import confusion_matrix\n", + "\n", + "# Create colorscale\n", + "rdylgr = matplotlib_to_plotly()\n", + "\n", + "# Add new column with our new prediction technique.\n", + "df.loc[df['prestorm_berm_vol'] * 2.7 - 221.1 <= df['R_high_dune_toe_diff'],\n", + " 'new_predicted_storm_regime'] = 'collision'\n", + "df.loc[df['prestorm_berm_vol'] * 2.7 - 221.1 > df['R_high_dune_toe_diff'],\n", + " 'new_predicted_storm_regime'] = 'swash'\n", + "\n", + "# Get observed and forecasted regimes, and merge\n", + "observed_regimes = df.observed_storm_regime.rename(\n", + " 'observed_regime').to_frame()\n", + "forecasted_regimes = df.new_predicted_storm_regime.rename(\n", + " 'forecasted_regime').to_frame()\n", + "df_compare = pd.concat([observed_regimes, forecasted_regimes],\n", + " axis='columns',\n", + " names=['a', 'b'],\n", + " sort=True)\n", + "df_compare.dropna(axis='index', inplace=True)\n", + "\n", + "# Create a confusion matrix based on the observed/forecasted regimes.\n", + "# Need to do some flipping and reversing to get it in the correct\n", + "# order for the plotly heatmap.\n", + "z = confusion_matrix(\n", + " df_compare.observed_regime.tolist(),\n", + " df_compare.forecasted_regime.tolist(),\n", + " labels=['swash', 'collision', 'overwash', 'inundation'])\n", + "z = np.flip(z, axis=0)\n", + "z_list = list(reversed(z.tolist()))\n", + "\n", + "# Make incorrect values negative, so they get assigned a different color.\n", + "# Better for visualization\n", + "z_neg_incorrect = np.flip(np.identity(4), axis=0)\n", + "z_neg_incorrect[z_neg_incorrect == 0] = -1\n", + "z_neg_incorrect = (z * z_neg_incorrect).tolist()\n", + "\n", + "# Change the text on the heatmap so it also displays percentages.\n", + "z_with_pct = []\n", + "for row in z:\n", + " new_row = []\n", + " for val in row:\n", + " new_row.append('{}
({}%)'.format(\n", + " val, np.around(val / np.sum(z) * 100, 1)))\n", + " z_with_pct.append(new_row)\n", + "\n", + "# Create the heatmap figure\n", + "x = ['swash', 'collision', 'overwash', 'inundation']\n", + "y = list(reversed(x))\n", + "fig = ff.create_annotated_heatmap(\n", + " z_neg_incorrect, x=x, y=y, annotation_text=z_with_pct, colorscale=rdylgr)\n", + "heatmap = go.FigureWidget(data=fig.data, layout=fig.layout)\n", + "\n", + "# Update axis titles\n", + "heatmap.layout.xaxis.update(title='Predicted')\n", + "heatmap.layout.yaxis.update(title='Observed')\n", + "\n", + "# Write to file\n", + "img_bytes = pio.write_image(\n", + " heatmap,\n", + " '02_confusion_matrix_berm_vol_predictor.png',\n", + " format='png',\n", + " width=600,\n", + " height=600,\n", + " scale=5)\n", + "\n", + "heatmap" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## TODO Compare predicted and underpredicted profiles" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Define a function for getting the average beach profile for a number of given site_ids:" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": { + "ExecuteTime": { + "end_time": "2018-12-10T03:08:49.904157Z", + "start_time": "2018-12-10T03:08:49.896136Z" + } }, "outputs": [], "source": [ @@ -422,41 +1208,46 @@ }, { "cell_type": "markdown", - "metadata": { - "hidden": true - }, + "metadata": {}, "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, + "execution_count": 225, "metadata": { "ExecuteTime": { - "end_time": "2018-12-05T02:00:36.853374Z", - "start_time": "2018-12-05T01:58:21.839366Z" + "end_time": "2018-12-10T03:11:20.818875Z", + "start_time": "2018-12-10T03:08:49.906163Z" }, - "code_folding": [], - "hidden": true + "code_folding": [] }, "outputs": [ { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "03f2e99d20a347f3922a0e6a36f99ccd", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FigureWidget({\n", - " 'data': [{'line': {'color': 'rgb(205, 0, 0)', 'width': 2},\n", - " 'mode': 'lines',\n", - " …" - ] - }, - "metadata": {}, - "output_type": "display_data" + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\z5189959\\Desktop\\nsw-2016-storm-impact\\.venv\\lib\\site-packages\\pandas\\core\\groupby\\groupby.py:1062: RuntimeWarning:\n", + "\n", + "Mean of empty slice\n", + "\n", + "C:\\Users\\z5189959\\Desktop\\nsw-2016-storm-impact\\.venv\\lib\\site-packages\\numpy\\lib\\nanfunctions.py:1545: RuntimeWarning:\n", + "\n", + "Degrees of freedom <= 0 for slice.\n", + "\n" + ] + }, + { + "ename": "NameError", + "evalue": "name 'avg_correct_x' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\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 41\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 42\u001b[0m trace_correct_mean = go.Scatter(\n\u001b[1;32m---> 43\u001b[1;33m \u001b[0mx\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mavg_correct_x\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 44\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mavg_correct_z\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 45\u001b[0m \u001b[0mopacity\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'avg_correct_x' is not defined" + ] } ], "source": [ @@ -563,42 +1354,21 @@ }, { "cell_type": "markdown", - "metadata": { - "hidden": true - }, + "metadata": {}, "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": 162, + "execution_count": null, "metadata": { "ExecuteTime": { - "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": "1255bccc024e4690b4b8ff4ccc8e9e35", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "FigureWidget({\n", - " 'data': [{'line': {'color': 'rgb(205, 0, 0)', 'width': 2},\n", - " 'mode': 'lines',\n", - " …" - ] - }, - "metadata": {}, - "output_type": "display_data" + "end_time": "2018-12-10T03:11:20.824874Z", + "start_time": "2018-12-10T03:08:27.623Z" } - ], + }, + "outputs": [], "source": [ "underpredicted = get_avg_profile(collision_underpredicted_site_ids)\n", "correct = get_avg_profile(collision_correct_site_ids)\n", @@ -703,15 +1473,14 @@ }, { "cell_type": "markdown", - "metadata": { - "hidden": true - }, + "metadata": {}, "source": [ "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? " ] } ], "metadata": { + "hide_input": false, "kernelspec": { "display_name": "Python 3", "language": "python",