From 89fc000ac32ac20801acfa727216c57b3ad93175 Mon Sep 17 00:00:00 2001 From: tobin-ford Date: Thu, 1 Aug 2024 15:52:43 -0600 Subject: [PATCH] Templating Testing --- contributors/tobin-ford.md | 12 + pvdeg/geospatial.py | 2 + pvdeg/utilities.py | 30 ++ tests/data/humidity_template.nc | Bin 0 -> 6315480 bytes tests/sandbox.ipynb | 918 +++++--------------------------- tests/test_geospatial.py | 41 +- 6 files changed, 205 insertions(+), 798 deletions(-) create mode 100644 contributors/tobin-ford.md create mode 100644 tests/data/humidity_template.nc diff --git a/contributors/tobin-ford.md b/contributors/tobin-ford.md new file mode 100644 index 00000000..6a71060c --- /dev/null +++ b/contributors/tobin-ford.md @@ -0,0 +1,12 @@ +2024-08-01 + +I hereby agree to the terms of the Contributors License Agreement, +version 1.0, with MD5 checksum 46ea45f996295bdb0652333d516a6d0a. + +I furthermore declare that I am authorized and able to make this +agreement and sign this declaration. + +Signed, + +Tobin Ford https://github.com/tobin-ford + diff --git a/pvdeg/geospatial.py b/pvdeg/geospatial.py index 1286e7e7..2cc87816 100644 --- a/pvdeg/geospatial.py +++ b/pvdeg/geospatial.py @@ -262,6 +262,8 @@ def output_template( # we should be able to get rid of this with the new autotemplating function and decorator +# this is helpful for users so we should move it to a section in the documenation, +# discuss with group def template_parameters(func): """ Output parameters for xarray template. diff --git a/pvdeg/utilities.py b/pvdeg/utilities.py index 6379b851..46607bae 100644 --- a/pvdeg/utilities.py +++ b/pvdeg/utilities.py @@ -7,6 +7,7 @@ from typing import Callable import inspect import math +import xarray as xr def gid_downsampling(meta, n): @@ -471,3 +472,32 @@ def tilt_azimuth_scan( print("\r ", end="") print("\r", end="") return tilt_azimuth_series + +def compare_templates(ds1: xr.Dataset, ds2: xr.Dataset, atol=1e-10, consider_nan_equal=True) -> bool: + """Compare loaded datasets with "empty-like" values""" + + if ds1.dims != ds2.dims: + return False + + if set(ds1.coords.keys()) != set(ds2.coords.keys()): + return False + + for coord in ds1.coords: + if ds1.coords[coord].dtype.kind in {'i', 'f'}: + if not np.allclose(ds1.coords[coord], ds2.coords[coord], atol=atol): # Use np.allclose for numeric coordinates + return False + elif ds1.coords[coord].dtype.kind == 'M': # datetime64 + if not np.array_equal(ds1.coords[coord], ds2.coords[coord]): # Use array equality for datetime coordinates + return False + else: + if not np.array_equal(ds1.coords[coord], ds2.coords[coord]): + return False + + if set(ds1.data_vars.keys()) != set(ds2.data_vars.keys()): + return False + + for dim in ds1.dims: + if not ds1.indexes[dim].equals(ds2.indexes[dim]): + return False + + return True \ No newline at end of file diff --git a/tests/data/humidity_template.nc b/tests/data/humidity_template.nc new file mode 100644 index 0000000000000000000000000000000000000000..63bbc255e4cdfb35f01babc28656d532013d6da2 GIT binary patch literal 6315480 zcmeF$Pi$OA9RT22uj9JO#z{j76qR<<&`W8Pjb%VYMAX<0iIOObw?S&%;5OAr~LlNRou0;ZcnfKnfj@1hG&@_i{V(;_J z&YL&yH^2Gzt#bX`?Ae3+KeT^jd_3fGyDESA@>h$dR`tdg|FOP&`P}TnNaL3yj}>k8 zd{RDT?{WV~sHL8V52x2#_odemE|iBbb~OD_8y&0a^()<#4<0BhV~>~bja2U)Sva?} zxz%57FL##Kw+5TtmCm>7<$LAet!k95>V!}YG@9#g{5)K_Jag{C_>t67uZ7cJDc*Xn z>d<&0g!@80915-QUqVJ0S?}%)#4OG zag~kPvR6LV8!6_8f{fO|NmDE;hAUOc%odz-_~j$iPs4uF*RZp`qwl=FbE)4@>zlV|KBfVR;Let7d>|%D zN|m$SwY4v_*S0!udmCxPq_a}V$Flb3^NlZ+i+?DlM;z&`+$gr@L$O;*o4g~_NO>;# zSd5rD#qx0c-Ch51tPhnrX^UEeL+KP`93 zd$L{$AvHd=iuhKac3tNr!fpv;V% zPi61s?=Jm44b`|u_vj<(R?<|fJ)6>b=so(<^}lZAc#Ve#CenDj_UNf-XO!;#GD(-) zYn|RoyIj-ymY1Cxw78xwtFG`=Em*6rGY}YGp2Fqlc%rWHQJvl zxIp{vG-<{~*zroOX!w-SH*#k0k= z-xH& zc$4e-Nha6-)%nlOcjYTvzQC{(`o_Z5KNhjOM_)cWbNOO%Z&lu;XX8|=?}Z_M9Z%25 zspR(jl$buJQ_1bQfARRat3CH`rp~eK?SHIn-f7SMQ(mXCw|~m-RC0UnU$%zOI+Xu% z6af(s0TB=Z5fA|p5CIVo0TB=Z5y=0&;8^B@IEX`vfIN@~^1wde00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 z103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh1 z4sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4 zIKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G z-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$ zfCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h0 z0S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K0 z2ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`2 z9N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8 zaDW3G-~b0WzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0W zzyS_$fCC)h00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h z00%h00S<70103K02ROh14sd`29N+*4IKTl8aDW3G-~b0WzyS_$fCC)h00%h00S<70 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

vf!04A@pT$ZxvXcXx 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\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "

<xarray.Dataset> Size: 9MB\n",
-       "Dimensions:            (time: 17520, gid: 11)\n",
-       "Coordinates:\n",
-       "  * gid                (gid) int64 88B 449211 452064 453020 ... 460613 462498\n",
-       "  * time               (time) datetime64[ns] 140kB 2022-01-01 ... 2022-12-31T...\n",
-       "Data variables:\n",
-       "    temp_air           (time, gid) float64 2MB -12.0 -8.1 -14.2 ... -4.3 -6.2\n",
-       "    wind_speed         (time, gid) float64 2MB 0.6 0.6 0.3 0.6 ... 0.9 1.0 1.1\n",
-       "    dhi                (time, gid) float64 2MB 0.0 0.0 0.0 ... 13.0 18.0 19.0\n",
-       "    ghi                (time, gid) float64 2MB 0.0 0.0 0.0 ... 13.0 24.0 19.0\n",
-       "    dni                (time, gid) float64 2MB 0.0 0.0 0.0 0.0 ... 0.0 126.0 1.0\n",
-       "    relative_humidity  (time, gid) float64 2MB 99.93 79.41 100.0 ... 95.93 100.0\n",
-       "Attributes:\n",
-       "    full_version_record:  {"rex": "0.2.80", "pandas": "2.0.0", "numpy": "1.23...\n",
-       "    package:              rex\n",
-       "    version:              4.0.0
" - ], - "text/plain": [ - " Size: 9MB\n", - "Dimensions: (time: 17520, gid: 11)\n", - "Coordinates:\n", - " * gid (gid) int64 88B 449211 452064 453020 ... 460613 462498\n", - " * time (time) datetime64[ns] 140kB 2022-01-01 ... 2022-12-31T...\n", - "Data variables:\n", - " temp_air (time, gid) float64 2MB -12.0 -8.1 -14.2 ... -4.3 -6.2\n", - " wind_speed (time, gid) float64 2MB 0.6 0.6 0.3 0.6 ... 0.9 1.0 1.1\n", - " dhi (time, gid) float64 2MB 0.0 0.0 0.0 ... 13.0 18.0 19.0\n", - " ghi (time, gid) float64 2MB 0.0 0.0 0.0 ... 13.0 24.0 19.0\n", - " dni (time, gid) float64 2MB 0.0 0.0 0.0 0.0 ... 0.0 126.0 1.0\n", - " relative_humidity (time, gid) float64 2MB 99.93 79.41 100.0 ... 95.93 100.0\n", - "Attributes:\n", - " full_version_record: {\"rex\": \"0.2.80\", \"pandas\": \"2.0.0\", \"numpy\": \"1.23...\n", - " package: rex\n", - " version: 4.0.0" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "GEO_WEATHER" + "autotemplate_result = pvdeg.geospatial.auto_template(\n", + " func=pvdeg.humidity.module, \n", + " ds_gids=GEO_WEATHER\n", + ").compute()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
latitudelongitudealtitudetzcountrystatecountywind_height
44921139.89-106.422954-7United StatesColoradoSummit2
45206439.89-106.302486-7United StatesColoradoSummit2
45302039.69-106.263485-7United StatesColoradoSummit2
45491639.81-106.182767-7United StatesColoradoSummit2
45586739.81-106.142883-7United StatesColoradoSummit2
45587739.41-106.143859-7United StatesColoradoSummit2
45682739.45-106.103634-7United StatesColoradoSummit2
45777639.41-106.063363-7United StatesColoradoSummit2
45967039.65-105.983261-7United StatesColoradoSummit2
46061339.53-105.943190-7United StatesColoradoSummit2
46249839.57-105.863523-7United StatesColoradoSummit2
\n", - "
" - ], - "text/plain": [ - " latitude longitude altitude tz country state county \\\n", - "449211 39.89 -106.42 2954 -7 United States Colorado Summit \n", - "452064 39.89 -106.30 2486 -7 United States Colorado Summit \n", - "453020 39.69 -106.26 3485 -7 United States Colorado Summit \n", - "454916 39.81 -106.18 2767 -7 United States Colorado Summit \n", - "455867 39.81 -106.14 2883 -7 United States Colorado Summit \n", - "455877 39.41 -106.14 3859 -7 United States Colorado Summit \n", - "456827 39.45 -106.10 3634 -7 United States Colorado Summit \n", - "457776 39.41 -106.06 3363 -7 United States Colorado Summit \n", - "459670 39.65 -105.98 3261 -7 United States Colorado Summit \n", - "460613 39.53 -105.94 3190 -7 United States Colorado Summit \n", - "462498 39.57 -105.86 3523 -7 United States Colorado Summit \n", - "\n", - " wind_height \n", - "449211 2 \n", - "452064 2 \n", - "453020 2 \n", - "454916 2 \n", - "455867 2 \n", - "455877 2 \n", - "456827 2 \n", - "457776 2 \n", - "459670 2 \n", - "460613 2 \n", - "462498 2 " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "GEO_META" + "humidity_template = xr.open_dataset(os.path.join(TEST_DATA_DIR, 'humidity_template.nc')).compute()" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def compare_datasets(ds1: xr.Dataset, ds2: xr.Dataset, atol=1e-10) -> bool:\n", + " \"\"\"Compare loaded datasets with \"empty-like\" values\"\"\"\n", + "\n", + " if ds1.dims != ds2.dims:\n", + " return False\n", + "\n", + " if set(ds1.coords.keys()) != set(ds2.coords.keys()):\n", + " return False\n", + "\n", + " for coord in ds1.coords:\n", + " if ds1.coords[coord].dtype.kind in {'i', 'f'}:\n", + " # Use np.allclose for numeric coordinates\n", + " if not np.allclose(ds1.coords[coord], ds2.coords[coord], atol=atol):\n", + " return False\n", + " elif ds1.coords[coord].dtype.kind == 'M': # datetime64 type\n", + " # Use array equality for datetime coordinates\n", + " if not np.array_equal(ds1.coords[coord], ds2.coords[coord]):\n", + " return False\n", + " else:\n", + " if not np.array_equal(ds1.coords[coord], ds2.coords[coord]):\n", + " return False\n", + "\n", + " if set(ds1.data_vars.keys()) != set(ds2.data_vars.keys()):\n", + " return False\n", + "\n", + " for var in ds1.data_vars:\n", + " if not np.allclose(ds1[var], ds2[var], atol=atol):\n", + " return False\n", + "\n", + " for dim in ds1.dims:\n", + " if not ds1.indexes[dim].equals(ds2.indexes[dim]):\n", + " return False\n", + "\n", + " return True" + ] + }, + { + "cell_type": "code", + "execution_count": 5, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "The array tilt angle was not provided, therefore the latitude tilt of 39.9 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.9 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.7 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.8 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.8 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.4 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.5 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.4 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.6 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.5 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n", - "The array tilt angle was not provided, therefore the latitude tilt of 39.6 was used.\n", - "The array azimuth was not provided, therefore an azimuth of 180.0 was used.\n" + "C:\\Users\\tford\\dev\\PVDegradationTools\\pvdeg\\utilities.py:479: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.\n", + " if ds1.dims != ds2.dims:\n" ] } ], "source": [ - "res = pvdeg.geospatial.analysis(\n", - " weather_ds=GEO_WEATHER,\n", - " meta_df=GEO_META,\n", - " func=pvdeg.standards.standoff,\n", - ")" + "assert pvdeg.utilities.compare_datasets(autotemplate_result,humidity_template)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "output template" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "shapes = {\n", + " \"RH_surface_outside\": (\"gid\", \"time\"),\n", + " \"RH_front_encap\": (\"gid\", \"time\"),\n", + " \"RH_back_encap\": (\"gid\", \"time\"),\n", + " \"RH_backsheet\": (\"gid\", \"time\"),\n", + "}\n", + "\n", + "manual_template = pvdeg.geospatial.output_template(\n", + " shapes=shapes,\n", + " ds_gids=GEO_WEATHER\n", + ").compute()" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "metadata": {}, "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "[[ 3.94100000e+01 -1.06420000e+02 nan]\n", - " [ 3.94100000e+01 -1.06300000e+02 nan]\n", - " [ 3.94100000e+01 -1.06260000e+02 nan]\n", - " [ 3.94100000e+01 -1.06180000e+02 nan]\n", - " [ 3.94100000e+01 -1.06140000e+02 5.05368226e-01]\n", - " [ 3.94100000e+01 -1.06100000e+02 nan]\n", - " [ 3.94100000e+01 -1.06060000e+02 4.23099392e-01]\n", - " [ 3.94100000e+01 -1.05980000e+02 nan]\n", - " [ 3.94100000e+01 -1.05940000e+02 nan]\n", - " [ 3.94100000e+01 -1.05860000e+02 nan]\n", - " [ 3.94500000e+01 -1.06420000e+02 nan]\n", - " [ 3.94500000e+01 -1.06300000e+02 nan]\n", - " [ 3.94500000e+01 -1.06260000e+02 nan]\n", - " [ 3.94500000e+01 -1.06180000e+02 nan]\n", - " [ 3.94500000e+01 -1.06140000e+02 nan]\n", - " [ 3.94500000e+01 -1.06100000e+02 4.74997232e-01]\n", - " [ 3.94500000e+01 -1.06060000e+02 nan]\n", - " [ 3.94500000e+01 -1.05980000e+02 nan]\n", - " [ 3.94500000e+01 -1.05940000e+02 nan]\n", - " [ 3.94500000e+01 -1.05860000e+02 nan]\n", - " [ 3.95300000e+01 -1.06420000e+02 nan]\n", - " [ 3.95300000e+01 -1.06300000e+02 nan]\n", - " [ 3.95300000e+01 -1.06260000e+02 nan]\n", - " [ 3.95300000e+01 -1.06180000e+02 nan]\n", - " [ 3.95300000e+01 -1.06140000e+02 nan]\n", - " [ 3.95300000e+01 -1.06100000e+02 nan]\n", - " [ 3.95300000e+01 -1.06060000e+02 nan]\n", - " [ 3.95300000e+01 -1.05980000e+02 nan]\n", - " [ 3.95300000e+01 -1.05940000e+02 7.43781748e-01]\n", - " [ 3.95300000e+01 -1.05860000e+02 nan]\n", - " [ 3.95700000e+01 -1.06420000e+02 nan]\n", - " [ 3.95700000e+01 -1.06300000e+02 nan]\n", - " [ 3.95700000e+01 -1.06260000e+02 nan]\n", - " [ 3.95700000e+01 -1.06180000e+02 nan]\n", - " [ 3.95700000e+01 -1.06140000e+02 nan]\n", - " [ 3.95700000e+01 -1.06100000e+02 nan]\n", - " [ 3.95700000e+01 -1.06060000e+02 nan]\n", - " [ 3.95700000e+01 -1.05980000e+02 nan]\n", - " [ 3.95700000e+01 -1.05940000e+02 nan]\n", - " [ 3.95700000e+01 -1.05860000e+02 1.02006123e-01]\n", - " [ 3.96500000e+01 -1.06420000e+02 nan]\n", - " [ 3.96500000e+01 -1.06300000e+02 nan]\n", - " [ 3.96500000e+01 -1.06260000e+02 nan]\n", - " [ 3.96500000e+01 -1.06180000e+02 nan]\n", - " [ 3.96500000e+01 -1.06140000e+02 nan]\n", - " [ 3.96500000e+01 -1.06100000e+02 nan]\n", - " [ 3.96500000e+01 -1.06060000e+02 nan]\n", - " [ 3.96500000e+01 -1.05980000e+02 9.86327972e-01]\n", - " [ 3.96500000e+01 -1.05940000e+02 nan]\n", - " [ 3.96500000e+01 -1.05860000e+02 nan]\n", - " [ 3.96900000e+01 -1.06420000e+02 nan]\n", - " [ 3.96900000e+01 -1.06300000e+02 nan]\n", - " [ 3.96900000e+01 -1.06260000e+02 1.11679921e+00]\n", - " [ 3.96900000e+01 -1.06180000e+02 nan]\n", - " [ 3.96900000e+01 -1.06140000e+02 nan]\n", - " [ 3.96900000e+01 -1.06100000e+02 nan]\n", - " [ 3.96900000e+01 -1.06060000e+02 nan]\n", - " [ 3.96900000e+01 -1.05980000e+02 nan]\n", - " [ 3.96900000e+01 -1.05940000e+02 nan]\n", - " [ 3.96900000e+01 -1.05860000e+02 nan]\n", - " [ 3.98100000e+01 -1.06420000e+02 nan]\n", - " [ 3.98100000e+01 -1.06300000e+02 nan]\n", - " [ 3.98100000e+01 -1.06260000e+02 nan]\n", - " [ 3.98100000e+01 -1.06180000e+02 3.31105174e+00]\n", - " [ 3.98100000e+01 -1.06140000e+02 2.42166730e+00]\n", - " [ 3.98100000e+01 -1.06100000e+02 nan]\n", - " [ 3.98100000e+01 -1.06060000e+02 nan]\n", - " [ 3.98100000e+01 -1.05980000e+02 nan]\n", - " [ 3.98100000e+01 -1.05940000e+02 nan]\n", - " [ 3.98100000e+01 -1.05860000e+02 nan]\n", - " [ 3.98900000e+01 -1.06420000e+02 2.15902146e+00]\n", - " [ 3.98900000e+01 -1.06300000e+02 3.70965360e+00]\n", - " [ 3.98900000e+01 -1.06260000e+02 nan]\n", - " [ 3.98900000e+01 -1.06180000e+02 nan]\n", - " [ 3.98900000e+01 -1.06140000e+02 nan]\n", - " [ 3.98900000e+01 -1.06100000e+02 nan]\n", - " [ 3.98900000e+01 -1.06060000e+02 nan]\n", - " [ 3.98900000e+01 -1.05980000e+02 nan]\n", - " [ 3.98900000e+01 -1.05940000e+02 nan]\n", - " [ 3.98900000e+01 -1.05860000e+02 nan]]\n" + "C:\\Users\\tford\\dev\\PVDegradationTools\\pvdeg\\utilities.py:479: FutureWarning: The return type of `Dataset.dims` will be changed to return a set of dimension names in future, in order to be more consistent with `DataArray.dims`. To access a mapping from dimension names to lengths, please use `Dataset.sizes`.\n", + " if ds1.dims != ds2.dims:\n" ] + }, + { + "data": { + "text/plain": [ + "True" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "data_var = res[\"x\"]\n", - "\n", - "# Stack the latitude and longitude coordinates into a single dimension\n", - "stacked = data_var.stack(z=(\"latitude\", \"longitude\"))\n", - "\n", - "# Extract the coordinates as numpy arrays\n", - "latitudes = stacked['latitude'].values\n", - "longitudes = stacked['longitude'].values\n", - "\n", - "# Extract the data values\n", - "data_values = stacked.values\n", - "\n", - "# Combine coordinates and data values into a single numpy array\n", - "combined_array = np.column_stack((latitudes, longitudes, data_values))\n", - "\n", - "print(combined_array)" + "pvdeg.utilities.compare_datasets(manual_template, humidity_template)" ] }, { @@ -916,27 +237,36 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "# test template\n", + "\n", + "shapes = {\n", + " 'testA' : (\"gid\", ),\n", + " 'testB' : (\"gid\", \"time\")\n", + "}\n", + "\n", + "template = pvdeg.geospatial.output_template(\n", + " shapes=shapes,\n", + "\n", + " ds_gids=GEO_WEATHER,\n", + ")\n" + ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "res = pd.DataFrame(combined_array).dropna()\n", - "ans = pd.read_csv(os.path.join(TEST_DATA_DIR, 'summit-standoff-res.csv'), index_col=0)\n", - "res.columns = ans.columns" + "template.to_netcdf(os.path.join(TEST_DATA_DIR, \"mismatch-template.nc\"))" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "pd.testing.assert_frame_equal(res, ans, check_dtype=False, check_names=False)" - ] + "source": [] } ], "metadata": { diff --git a/tests/test_geospatial.py b/tests/test_geospatial.py index 14c3aacd..1793c12a 100644 --- a/tests/test_geospatial.py +++ b/tests/test_geospatial.py @@ -3,14 +3,20 @@ import pickle import pandas as pd import numpy as np +import xarray as xr import os GEO_META = pd.read_csv(os.path.join(TEST_DATA_DIR, "summit-meta.csv"), index_col=0) -with open(os.path.join(TEST_DATA_DIR, "summit-weather.pkl"), 'rb') as f: +with open(os.path.join(TEST_DATA_DIR, "summit-weather.pkl"), "rb") as f: GEO_WEATHER = pickle.load(f) +HUMIDITY_TEMPLATE = xr.open_dataset( + os.path.join(TEST_DATA_DIR, "humidity_template.nc") +).compute() + + def test_analysis_standoff(): res_ds = pvdeg.geospatial.analysis( weather_ds=GEO_WEATHER, @@ -23,13 +29,40 @@ def test_analysis_standoff(): # Stack the latitude and longitude coordinates into a single dimension # convert to dataframe, this can be done with xr.dataset.to_dataframe as well stacked = data_var.stack(z=("latitude", "longitude")) - latitudes = stacked['latitude'].values - longitudes = stacked['longitude'].values + latitudes = stacked["latitude"].values + longitudes = stacked["longitude"].values data_values = stacked.values combined_array = np.column_stack((latitudes, longitudes, data_values)) res = pd.DataFrame(combined_array).dropna() - ans = pd.read_csv(os.path.join(TEST_DATA_DIR, 'summit-standoff-res.csv'), index_col=0) + ans = pd.read_csv( + os.path.join(TEST_DATA_DIR, "summit-standoff-res.csv"), index_col=0 + ) res.columns = ans.columns pd.testing.assert_frame_equal(res, ans, check_dtype=False, check_names=False) + + +def test_autotemplate(): + autotemplate_result = pvdeg.geospatial.auto_template( + func=pvdeg.humidity.module, ds_gids=GEO_WEATHER + ).compute() + + assert pvdeg.utilities.compare_templates( + autotemplate_result, HUMIDITY_TEMPLATE + ) # custom function because we cant use equals or identical because of empty like values + + +def test_template(): + shapes = { + "RH_surface_outside": ("gid", "time"), + "RH_front_encap": ("gid", "time"), + "RH_back_encap": ("gid", "time"), + "RH_backsheet": ("gid", "time"), + } + + manual_template = pvdeg.geospatial.output_template( + shapes=shapes, ds_gids=GEO_WEATHER + ).compute() + + assert pvdeg.utilities.compare_templates(manual_template, HUMIDITY_TEMPLATE)