diff --git a/.gitignore b/.gitignore index e590d2e3..eabeff65 100644 --- a/.gitignore +++ b/.gitignore @@ -75,7 +75,7 @@ coverage.xml *.swp #Ignore some notebooks -#*.ipynb +*.ipynb # !docs/tutorials/*.ipynb #Ignore Mac DS_store files diff --git a/docs/api.rst b/docs/api.rst index 629370e7..c608a53b 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -7,19 +7,6 @@ API Reference Quality ======= -Data Shifts ------------ - -Functions for identifying shifts in data values in time series -and for identifying periods with data shifts. For functions -that identify shifts in time, see ``quality.time`` - -.. autosummary:: - :toctree: generated/ - - quality.data_shifts.detect_data_shifts - quality.data_shifts.get_longest_shift_segment_dates - Irradiance ---------- diff --git a/docs/index.rst b/docs/index.rst index c21d65c1..4fc259b6 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,8 +25,6 @@ library status. - :py:mod:`quality` contains submodules for different kinds of data quality checks. - - :py:mod:`quality.data_shifts` contains quality checks for detecting and - isolating data shifts in PV time series data. - :py:mod:`quality.irradiance` contains quality checks for irradiance measurements. - :py:mod:`quality.weather` contains quality checks for weather data (e.g. diff --git a/docs/whatsnew/0.1.1.rst b/docs/whatsnew/0.1.1.rst index 559bf261..0a35e1db 100644 --- a/docs/whatsnew/0.1.1.rst +++ b/docs/whatsnew/0.1.1.rst @@ -12,9 +12,6 @@ Enhancements other performance ratio formulas. (:pull:`109`) * Detect shadows from fixed objects in GHI data using :py:func:`pvanalytics.features.shading.fixed`. (:issue:`24`, :pull:`101`) -* Detect data shifts in daily summed time series and remove data shift periods - from the time series with :py:func:`pvanalytics.quality.data_shifts.detect_data_shifts` - and :py:func:`pvanalytics.quality.data_shifts.get_longest_shift_segment_dates`. (:pull:`124`) Bug Fixes ~~~~~~~~~ @@ -49,4 +46,4 @@ Contributors * Kirsten Perry (:ghuser:`kperrynrel`) * Michael Hopwood (:ghuser:`MichaelHopwood`) * Carlos Silva (:ghuser:`camsilva`) -* Ben Taylor (:ghuser:`bt-`) \ No newline at end of file +* Ben Taylor (:ghuser:`bt-`) diff --git a/pvanalytics/data/pvlib_data_shift.csv b/pvanalytics/data/pvlib_data_shift.csv deleted file mode 100644 index 4d31edd7..00000000 --- a/pvanalytics/data/pvlib_data_shift.csv +++ /dev/null @@ -1,2191 +0,0 @@ -timestamp,value,label -1/1/2015,9895.31433,0 -1/2/2015,15555.06635,0 -1/3/2015,9060.889753,0 -1/4/2015,11739.34537,0 -1/5/2015,11591.51329,0 -1/6/2015,18457.8857,0 -1/7/2015,23860.97568,0 -1/8/2015,12428.84009,0 -1/9/2015,15117.11729,0 -1/10/2015,24664.25651,0 -1/11/2015,11570.87221,0 -1/12/2015,12723.51199,0 -1/13/2015,27101.97256,0 -1/14/2015,26902.43896,0 -1/15/2015,19173.23748,0 -1/16/2015,27542.19452,0 -1/17/2015,12623.49928,0 -1/18/2015,9908.222665,0 -1/19/2015,15312.97093,0 -1/20/2015,28001.5133,0 -1/21/2015,15703.8385,0 -1/22/2015,19074.51307,0 -1/23/2015,16731.19903,0 -1/24/2015,10080.0096,0 -1/25/2015,26651.03415,0 -1/26/2015,28943.66799,0 -1/27/2015,23454.34838,0 -1/28/2015,29743.29773,0 -1/29/2015,9281.211819,0 -1/30/2015,29640.39055,0 -1/31/2015,14475.81333,0 -2/1/2015,13875.18278,0 -2/2/2015,22170.2658,0 -2/3/2015,17163.16178,0 -2/4/2015,11618.02026,0 -2/5/2015,31478.43882,0 -2/6/2015,14748.68472,0 -2/7/2015,10291.39557,0 -2/8/2015,10856.77985,0 -2/9/2015,15482.93845,0 -2/10/2015,31495.44031,0 -2/11/2015,11751.70565,0 -2/12/2015,29862.44518,0 -2/13/2015,23082.77203,0 -2/14/2015,24773.50104,0 -2/15/2015,33895.69734,0 -2/16/2015,28345.12205,0 -2/17/2015,15822.6582,0 -2/18/2015,24364.04118,0 -2/19/2015,34417.17645,0 -2/20/2015,34356.96053,0 -2/21/2015,11733.6593,0 -2/22/2015,15820.56134,0 -2/23/2015,35045.89181,0 -2/24/2015,15678.73641,0 -2/25/2015,29675.34818,0 -2/26/2015,29851.62212,0 -2/27/2015,34785.87959,0 -2/28/2015,36371.84561,0 -3/1/2015,22059.99224,0 -3/2/2015,28776.04454,0 -3/3/2015,11652.54397,0 -3/4/2015,15567.42525,0 -3/5/2015,32138.93743,0 -3/6/2015,31910.37786,0 -3/7/2015,19107.81919,0 -3/8/2015,34812.0768,0 -3/9/2015,35635.35361,0 -3/10/2015,20976.93872,0 -3/11/2015,37898.29955,0 -3/12/2015,34332.8512,0 -3/13/2015,27937.70977,0 -3/14/2015,13234.71138,0 -3/15/2015,24919.27187,0 -3/16/2015,27967.28277,0 -3/17/2015,36786.24159,0 -3/18/2015,40556.74416,0 -3/19/2015,39523.95826,0 -3/20/2015,36601.99835,0 -3/21/2015,27434.07139,0 -3/22/2015,38755.8763,0 -3/23/2015,41274.55318,0 -3/24/2015,40975.15257,0 -3/25/2015,19841.13369,0 -3/26/2015,20276.70229,0 -3/27/2015,33057.26109,0 -3/28/2015,42912.00944,0 -3/29/2015,38663.70039,0 -3/30/2015,29870.18829,0 -3/31/2015,32561.09922,0 -4/1/2015,40002.21089,0 -4/2/2015,23282.28346,0 -4/3/2015,28304.34906,0 -4/4/2015,37010.89203,0 -4/5/2015,25370.71506,0 -4/6/2015,33139.98221,0 -4/7/2015,28278.97354,0 -4/8/2015,14701.28099,0 -4/9/2015,12391.30388,0 -4/10/2015,14578.07445,0 -4/11/2015,37244.69211,0 -4/12/2015,41453.14789,0 -4/13/2015,25394.52348,0 -4/14/2015,43290.52192,0 -4/15/2015,43168.3844,0 -4/16/2015,36808.17702,0 -4/17/2015,40379.66312,0 -4/18/2015,43449.68169,0 -4/19/2015,39284.06058,0 -4/20/2015,17188.73219,0 -4/21/2015,21242.38782,0 -4/22/2015,20772.14618,0 -4/23/2015,20040.11801,0 -4/24/2015,39703.68719,0 -4/25/2015,43596.77258,0 -4/26/2015,41090.0183,0 -4/27/2015,27188.73836,0 -4/28/2015,42621.08976,0 -4/29/2015,38441.91232,0 -4/30/2015,37312.36414,0 -5/1/2015,41905.205,0 -5/2/2015,42941.20253,0 -5/3/2015,35197.93322,0 -5/4/2015,17925.69953,0 -5/5/2015,32754.20247,0 -5/6/2015,43759.20947,0 -5/7/2015,41793.60944,0 -5/8/2015,37261.56761,0 -5/9/2015,31206.85728,0 -5/10/2015,21906.32264,0 -5/11/2015,26952.97565,0 -5/12/2015,15825.39449,0 -5/13/2015,34038.92645,0 -5/14/2015,44441.83181,0 -5/15/2015,17562.62466,0 -5/16/2015,36011.06797,0 -5/17/2015,42989.19423,0 -5/18/2015,35141.23444,0 -5/19/2015,23906.33383,0 -5/20/2015,45321.32492,0 -5/21/2015,44212.66895,0 -5/22/2015,46348.03544,0 -5/23/2015,45251.34008,0 -5/24/2015,38043.8426,0 -5/25/2015,24265.7021,0 -5/26/2015,37748.16827,0 -5/27/2015,27114.25772,0 -5/28/2015,44342.89876,0 -5/29/2015,36392.97788,0 -5/30/2015,21779.77551,0 -5/31/2015,19765.79632,0 -6/1/2015,38753.49738,0 -6/2/2015,44427.8591,0 -6/3/2015,45580.6124,0 -6/4/2015,41322.29475,0 -6/5/2015,30623.72342,0 -6/6/2015,45998.59884,0 -6/7/2015,36113.63496,0 -6/8/2015,26965.44826,0 -6/9/2015,35036.85943,0 -6/10/2015,30014.67235,0 -6/11/2015,38486.34193,0 -6/12/2015,14246.60775,0 -6/13/2015,39351.8674,0 -6/14/2015,19393.19181,0 -6/15/2015,28703.42725,0 -6/16/2015,41974.52556,0 -6/17/2015,39708.20275,0 -6/18/2015,32391.83372,0 -6/19/2015,45628.85756,0 -6/20/2015,43612.17059,0 -6/21/2015,40771.95266,0 -6/22/2015,38927.6991,0 -6/23/2015,27912.46536,0 -6/24/2015,43185.78703,0 -6/25/2015,21297.78997,0 -6/26/2015,44499.99719,0 -6/27/2015,15814.74848,0 -6/28/2015,18250.28791,0 -6/29/2015,41145.71591,0 -6/30/2015,20888.34349,0 -7/1/2015,27870.91707,0 -7/2/2015,44877.46935,0 -7/3/2015,43235.28479,0 -7/4/2015,39873.60636,0 -7/5/2015,39645.31917,0 -7/6/2015,39887.51145,0 -7/7/2015,19018.51862,0 -7/8/2015,39866.8671,0 -7/9/2015,36575.74656,0 -7/10/2015,44341.63258,0 -7/11/2015,42885.27063,0 -7/12/2015,38052.45015,0 -7/13/2015,39791.58701,0 -7/14/2015,27721.54213,0 -7/15/2015,44284.3511,0 -7/16/2015,43109.48967,0 -7/17/2015,16162.86312,0 -7/18/2015,34191.78736,0 -7/19/2015,35247.36535,0 -7/20/2015,38203.36834,0 -7/21/2015,44044.52696,0 -7/22/2015,44657.22415,0 -7/23/2015,44691.97555,0 -7/24/2015,40945.32649,0 -7/25/2015,24040.87274,0 -7/26/2015,41232.85995,0 -7/27/2015,42349.1686,0 -7/28/2015,41513.37325,0 -7/29/2015,38770.07495,0 -7/30/2015,38677.83899,0 -7/31/2015,31221.69353,0 -8/1/2015,37870.98173,0 -8/2/2015,30849.63089,0 -8/3/2015,35888.71425,0 -8/4/2015,28845.63766,0 -8/5/2015,38579.54689,0 -8/6/2015,38260.04236,0 -8/7/2015,40652.3885,0 -8/8/2015,25191.27613,0 -8/9/2015,42529.05015,0 -8/10/2015,21175.32129,0 -8/11/2015,30164.48549,0 -8/12/2015,39942.85839,0 -8/13/2015,35958.11718,0 -8/14/2015,22130.19368,0 -8/15/2015,39822.40845,0 -8/16/2015,39594.58976,0 -8/17/2015,38924.46393,0 -8/18/2015,23297.51976,0 -8/19/2015,32739.12183,0 -8/20/2015,25134.57219,0 -8/21/2015,22409.24177,0 -8/22/2015,40949.26316,0 -8/23/2015,38719.50467,0 -8/24/2015,32627.29502,0 -8/25/2015,17462.04714,0 -8/26/2015,17332.27822,0 -8/27/2015,20333.09778,0 -8/28/2015,33126.11934,0 -8/29/2015,15393.70049,0 -8/30/2015,27514.23993,0 -8/31/2015,35174.44864,0 -9/1/2015,34206.66207,0 -9/2/2015,30544.58869,0 -9/3/2015,25874.74011,0 -9/4/2015,36621.32654,0 -9/5/2015,35724.70016,0 -9/6/2015,33013.32037,0 -9/7/2015,29999.43654,0 -9/8/2015,22482.94681,0 -9/9/2015,22300.06049,0 -9/10/2015,38524.19149,0 -9/11/2015,28564.51607,0 -9/12/2015,21401.54457,0 -9/13/2015,15059.18967,0 -9/14/2015,38119.63562,0 -9/15/2015,37238.38947,0 -9/16/2015,36692.20363,0 -9/17/2015,37211.67963,0 -9/18/2015,19931.94884,0 -9/19/2015,14998.65528,0 -9/20/2015,36250.00388,0 -9/21/2015,33665.26704,0 -9/22/2015,37578.33351,0 -9/23/2015,36318.73529,0 -9/24/2015,26702.31062,0 -9/25/2015,32537.06431,0 -9/26/2015,35981.79013,0 -9/27/2015,29710.73992,0 -9/28/2015,14121.49352,0 -9/29/2015,17047.88694,0 -9/30/2015,33733.7207,0 -10/1/2015,36963.66059,0 -10/2/2015,28467.6222,0 -10/3/2015,23377.32794,0 -10/4/2015,14916.06031,0 -10/5/2015,16235.8416,0 -10/6/2015,15593.57025,0 -10/7/2015,23494.86139,0 -10/8/2015,27051.02489,0 -10/9/2015,12223.9097,0 -10/10/2015,31089.24117,0 -10/11/2015,31235.7944,0 -10/12/2015,30647.96257,0 -10/13/2015,14221.14087,0 -10/14/2015,25951.12476,0 -10/15/2015,21527.77399,0 -10/16/2015,20137.23824,0 -10/17/2015,27734.18441,0 -10/18/2015,19613.14619,0 -10/19/2015,20576.26334,0 -10/20/2015,13535.78665,0 -10/21/2015,10968.75934,0 -10/22/2015,27838.20672,0 -10/23/2015,32051.01382,0 -10/24/2015,11707.17165,0 -10/25/2015,20324.06945,0 -10/26/2015,18951.50672,0 -10/27/2015,25024.74702,0 -10/28/2015,1285.217315,1 -10/29/2015,4400.910674,0 -10/30/2015,7448.20276,0 -10/31/2015,2930.151257,0 -11/1/2015,1381.641517,0 -11/2/2015,7443.638398,0 -11/3/2015,9392.386008,0 -11/4/2015,9524.748175,0 -11/5/2015,5785.469452,0 -11/6/2015,2748.004826,0 -11/7/2015,4062.541109,0 -11/8/2015,8882.551334,0 -11/9/2015,9766.315928,0 -11/10/2015,4432.883589,0 -11/11/2015,3240.131167,0 -11/12/2015,601.2017638,0 -11/13/2015,2134.269327,0 -11/14/2015,4033.781201,0 -11/15/2015,6997.698432,0 -11/16/2015,8493.966889,0 -11/17/2015,7979.438735,0 -11/18/2015,3021.170214,0 -11/19/2015,5902.152701,0 -11/20/2015,3470.926166,0 -11/21/2015,2201.707824,0 -11/22/2015,4785.087551,0 -11/23/2015,3802.366141,0 -11/24/2015,4347.371147,0 -11/25/2015,7910.480933,0 -11/26/2015,1306.011402,0 -11/27/2015,847.3925633,0 -11/28/2015,5743.227807,0 -11/29/2015,1895.65464,0 -11/30/2015,1985.709239,0 -12/1/2015,1252.553271,0 -12/2/2015,5073.061959,0 -12/3/2015,3136.626957,0 -12/4/2015,4042.261978,0 -12/5/2015,5469.075592,0 -12/6/2015,5624.232504,0 -12/7/2015,1456.680999,0 -12/8/2015,5513.280286,0 -12/9/2015,2826.860803,0 -12/10/2015,2687.959828,0 -12/11/2015,3231.736834,0 -12/12/2015,784.2247521,0 -12/13/2015,1261.64049,0 -12/14/2015,716.4079356,0 -12/15/2015,4121.865292,0 -12/16/2015,1752.116699,0 -12/17/2015,4511.226922,0 -12/18/2015,1230.374544,0 -12/19/2015,2599.830901,0 -12/20/2015,4216.051454,0 -12/21/2015,478.9185191,0 -12/22/2015,2851.668165,0 -12/23/2015,2763.661569,0 -12/24/2015,7816.028423,0 -12/25/2015,5177.338047,0 -12/26/2015,3764.366778,0 -12/27/2015,1679.276801,0 -12/28/2015,3622.589671,0 -12/29/2015,1870.051997,0 -12/30/2015,1165.184759,0 -12/31/2015,2926.180978,0 -1/1/2016,1735.505871,0 -1/2/2016,606.9559191,0 -1/3/2016,2210.190717,0 -1/4/2016,8746.466649,0 -1/5/2016,8600.375107,0 -1/6/2016,6237.993904,0 -1/7/2016,5843.213962,0 -1/8/2016,4280.210552,0 -1/9/2016,1906.247492,0 -1/10/2016,1099.852666,0 -1/11/2016,3433.372214,0 -1/12/2016,3720.772283,0 -1/13/2016,1636.064196,0 -1/14/2016,1339.300342,0 -1/15/2016,1958.290133,0 -1/16/2016,1828.866767,0 -1/17/2016,2184.569571,0 -1/18/2016,4600.474428,0 -1/19/2016,1041.892125,0 -1/20/2016,2801.694025,0 -1/21/2016,6292.691566,0 -1/22/2016,6691.876944,0 -1/23/2016,9801.328838,0 -1/24/2016,1786.610018,0 -1/25/2016,5032.173408,0 -1/26/2016,1103.941625,0 -1/27/2016,4721.036407,0 -1/28/2016,1071.074519,0 -1/29/2016,5093.028114,0 -1/30/2016,1697.262164,0 -1/31/2016,2414.159015,0 -2/1/2016,4512.131303,0 -2/2/2016,5136.172331,0 -2/3/2016,5051.089793,0 -2/4/2016,6915.69816,0 -2/5/2016,5037.541577,0 -2/6/2016,6434.960035,0 -2/7/2016,6653.524832,0 -2/8/2016,5915.411094,0 -2/9/2016,1463.316556,0 -2/10/2016,4491.383518,0 -2/11/2016,7388.81547,0 -2/12/2016,2730.505283,0 -2/13/2016,5846.329547,0 -2/14/2016,10929.0893,0 -2/15/2016,3471.131158,0 -2/16/2016,1737.820958,0 -2/17/2016,2914.794545,0 -2/18/2016,12234.27476,0 -2/19/2016,2588.753001,0 -2/20/2016,2554.895721,0 -2/21/2016,7373.767769,0 -2/22/2016,12791.58141,0 -2/23/2016,11236.58156,0 -2/24/2016,1176.560212,0 -2/25/2016,2566.237749,0 -2/26/2016,7722.399148,0 -2/27/2016,7959.586639,0 -2/28/2016,9455.474406,0 -3/1/2016,3202.731841,0 -3/2/2016,9419.559472,0 -3/3/2016,8007.105111,0 -3/4/2016,9114.640315,0 -3/5/2016,6138.529872,0 -3/6/2016,10962.13605,0 -3/7/2016,4532.02294,0 -3/8/2016,5785.012814,0 -3/9/2016,4913.031989,0 -3/10/2016,2254.479894,0 -3/11/2016,9733.732114,0 -3/12/2016,12347.14509,0 -3/13/2016,8195.831542,0 -3/14/2016,2552.431501,0 -3/15/2016,4591.688369,0 -3/16/2016,2496.053101,0 -3/17/2016,5214.390551,0 -3/18/2016,10752.61551,0 -3/19/2016,14925.37516,0 -3/20/2016,14194.26707,0 -3/21/2016,11156.54819,0 -3/22/2016,6170.966338,0 -3/23/2016,9753.242285,0 -3/24/2016,2649.849458,0 -3/25/2016,6917.918449,0 -3/26/2016,12852.9305,0 -3/27/2016,15023.45927,0 -3/28/2016,3661.8024,0 -3/29/2016,15588.91742,0 -3/30/2016,9938.602554,0 -3/31/2016,2173.442853,0 -4/1/2016,4832.316653,0 -4/2/2016,10949.39844,0 -4/3/2016,9509.410179,0 -4/4/2016,12244.28587,0 -4/5/2016,16586.6235,0 -4/6/2016,3581.387041,0 -4/7/2016,3942.821961,0 -4/8/2016,11296.82191,0 -4/9/2016,16845.48836,0 -4/10/2016,8849.612621,0 -4/11/2016,11156.01391,0 -4/12/2016,10709.88824,0 -4/13/2016,14250.38764,0 -4/14/2016,16077.67773,0 -4/15/2016,15917.49824,0 -4/16/2016,15904.74595,0 -4/17/2016,16277.02717,0 -4/18/2016,14905.23728,0 -4/19/2016,16212.10911,0 -4/20/2016,16616.2165,0 -4/21/2016,6362.527288,0 -4/22/2016,7697.521478,0 -4/23/2016,16827.72731,0 -4/24/2016,9605.905667,0 -4/25/2016,5428.190633,0 -4/26/2016,6379.797018,0 -4/27/2016,17076.19254,0 -4/28/2016,11667.20913,0 -4/29/2016,10515.02375,0 -4/30/2016,15944.67096,0 -5/1/2016,3764.795295,0 -5/2/2016,13952.69508,0 -5/3/2016,10233.52506,0 -5/4/2016,13002.04109,0 -5/5/2016,14296.38655,0 -5/6/2016,17024.35095,0 -5/7/2016,6479.413153,0 -5/8/2016,11763.69907,0 -5/9/2016,17454.51152,0 -5/10/2016,17410.40628,0 -5/11/2016,17235.7017,0 -5/12/2016,13586.93564,0 -5/13/2016,11955.13592,0 -5/14/2016,3912.07911,0 -5/15/2016,8034.847361,0 -5/16/2016,13776.66323,0 -5/17/2016,17407.14957,0 -5/18/2016,13119.96796,0 -5/19/2016,16482.10891,0 -5/20/2016,16653.08021,0 -5/21/2016,14300.22032,0 -5/22/2016,16914.40412,0 -5/23/2016,17309.53552,0 -5/24/2016,17220.29297,0 -5/25/2016,15197.61007,0 -5/26/2016,9743.0533,0 -5/27/2016,14651.45326,0 -5/28/2016,14617.94703,0 -5/29/2016,12857.20658,0 -5/30/2016,14520.99624,0 -5/31/2016,17459.90814,0 -6/1/2016,16670.42035,0 -6/2/2016,14442.93634,0 -6/3/2016,16932.50294,0 -6/4/2016,17125.93379,0 -6/5/2016,10750.02672,0 -6/6/2016,10134.00449,0 -6/7/2016,12058.9257,0 -6/8/2016,9047.304402,0 -6/9/2016,17613.35016,0 -6/10/2016,16675.38213,0 -6/11/2016,12162.05239,0 -6/12/2016,15392.44073,0 -6/13/2016,8840.502667,0 -6/14/2016,17667.7854,0 -6/15/2016,13272.91036,0 -6/16/2016,15435.22704,0 -6/17/2016,17312.5927,0 -6/18/2016,15793.24298,0 -6/19/2016,14645.80426,0 -6/20/2016,12907.32289,0 -6/21/2016,17097.48907,0 -6/22/2016,17432.06211,0 -6/23/2016,15066.99751,0 -6/24/2016,15767.22578,0 -6/25/2016,17051.9254,0 -6/26/2016,13037.92971,0 -6/27/2016,14387.62744,0 -6/28/2016,6930.364522,0 -6/29/2016,16878.06264,0 -6/30/2016,16723.31916,0 -7/1/2016,5498.009179,0 -7/2/2016,17157.88012,0 -7/3/2016,17332.12223,0 -7/4/2016,17295.61569,0 -7/5/2016,13235.75194,0 -7/6/2016,12346.71557,0 -7/7/2016,15979.6675,0 -7/8/2016,8511.632893,0 -7/9/2016,10714.80593,0 -7/10/2016,16743.79545,0 -7/11/2016,10465.98616,0 -7/12/2016,13542.79897,0 -7/13/2016,16230.6392,0 -7/14/2016,12741.06813,0 -7/15/2016,8116.899969,0 -7/16/2016,14675.80697,0 -7/17/2016,12690.82497,0 -7/18/2016,16118.9344,0 -7/19/2016,16565.79637,0 -7/20/2016,16241.31914,0 -7/21/2016,13398.60374,0 -7/22/2016,16493.95024,0 -7/23/2016,16633.68645,0 -7/24/2016,8807.709801,0 -7/25/2016,11937.17189,0 -7/26/2016,16749.95328,0 -7/27/2016,12436.17591,0 -7/28/2016,11706.96682,0 -7/29/2016,14378.69904,0 -7/30/2016,12891.06046,0 -7/31/2016,7544.994413,0 -8/1/2016,11622.8978,0 -8/2/2016,16123.99113,0 -8/3/2016,12225.76622,0 -8/4/2016,15836.54076,0 -8/5/2016,10772.298,0 -8/6/2016,15972.36944,0 -8/7/2016,16449.38901,0 -8/8/2016,16394.4029,0 -8/9/2016,14217.84611,0 -8/10/2016,15577.9458,0 -8/11/2016,11472.2919,0 -8/12/2016,10604.92496,0 -8/13/2016,5076.5501,0 -8/14/2016,11204.96498,0 -8/15/2016,13064.49892,0 -8/16/2016,4547.21845,0 -8/17/2016,8642.907993,0 -8/18/2016,12515.8379,0 -8/19/2016,14470.42614,0 -8/20/2016,13323.53017,0 -8/21/2016,11385.15613,0 -8/22/2016,15573.99967,0 -8/23/2016,14444.98876,0 -8/24/2016,13820.1046,0 -8/25/2016,9665.762642,0 -8/26/2016,14253.27868,0 -8/27/2016,10590.89804,0 -8/28/2016,10603.68187,0 -8/29/2016,14195.88516,0 -8/30/2016,12058.92766,0 -8/31/2016,14531.55026,0 -9/1/2016,7123.906239,0 -9/2/2016,15423.20875,0 -9/3/2016,15068.69875,0 -9/4/2016,15040.96057,0 -9/5/2016,14713.55201,0 -9/6/2016,11874.96313,0 -9/7/2016,9769.946023,0 -9/8/2016,8950.724075,0 -9/9/2016,13579.60081,0 -9/10/2016,4142.278742,0 -9/11/2016,14821.46104,0 -9/12/2016,14275.95755,0 -9/13/2016,11878.62238,0 -9/14/2016,11676.93387,0 -9/15/2016,14315.44584,0 -9/16/2016,13964.71143,0 -9/17/2016,2598.907179,0 -9/18/2016,11660.99474,0 -9/19/2016,13570.28841,0 -9/20/2016,13691.29329,0 -9/21/2016,10583.70674,0 -9/22/2016,6265.073181,0 -9/23/2016,5232.727898,0 -9/24/2016,14038.01394,0 -9/25/2016,12654.35384,0 -9/26/2016,1625.909386,0 -9/27/2016,7397.961091,0 -9/28/2016,10923.2681,0 -9/29/2016,3197.512172,0 -9/30/2016,8441.141523,0 -10/1/2016,2147.277639,0 -10/2/2016,6069.454182,0 -10/3/2016,3380.437851,0 -10/4/2016,7880.70554,0 -10/5/2016,11006.06331,0 -10/6/2016,12122.63788,0 -10/7/2016,12172.60461,0 -10/8/2016,7746.777809,0 -10/9/2016,9356.678858,0 -10/10/2016,12408.47864,0 -10/11/2016,8903.760277,0 -10/12/2016,10800.56899,0 -10/13/2016,6925.091832,0 -10/14/2016,9080.407031,0 -10/15/2016,10736.96556,0 -10/16/2016,1971.100527,0 -10/17/2016,1673.309357,0 -10/18/2016,6094.850347,0 -10/19/2016,10885.17127,0 -10/20/2016,1149.93958,0 -10/21/2016,1761.275453,0 -10/22/2016,5851.094541,0 -10/23/2016,3780.519499,0 -10/24/2016,1416.322534,0 -10/25/2016,3874.559552,0 -10/26/2016,7296.041109,0 -10/27/2016,1123.199117,0 -10/28/2016,10268.54782,0 -10/29/2016,2718.261457,0 -10/30/2016,5185.745042,0 -10/31/2016,8134.856078,0 -11/1/2016,3272.181594,0 -11/2/2016,5151.105865,0 -11/3/2016,5448.574097,0 -11/4/2016,7197.965785,0 -11/5/2016,7207.150503,0 -11/6/2016,9558.815469,0 -11/7/2016,9677.374841,0 -11/8/2016,4200.842926,0 -11/9/2016,5352.217187,0 -11/10/2016,9288.871425,0 -11/11/2016,6058.679227,0 -11/12/2016,8942.693988,0 -11/13/2016,9102.354531,0 -11/14/2016,7811.352982,0 -11/15/2016,8407.817663,0 -11/16/2016,1545.215941,0 -11/17/2016,8138.004633,0 -11/18/2016,7492.199238,0 -11/19/2016,1099.045748,0 -11/20/2016,2031.556268,0 -11/21/2016,1137.096212,0 -11/22/2016,4725.92244,0 -11/23/2016,2776.418651,0 -11/24/2016,1261.797337,0 -11/25/2016,1638.054483,0 -11/26/2016,4216.258576,0 -11/27/2016,1777.546122,0 -11/28/2016,4494.776617,0 -11/29/2016,3774.900129,0 -11/30/2016,3646.466546,0 -12/1/2016,1747.528402,0 -12/2/2016,1052.122057,0 -12/3/2016,820.0257908,0 -12/4/2016,4218.219725,0 -12/5/2016,3552.521969,0 -12/6/2016,5090.250222,0 -12/7/2016,1132.237728,0 -12/8/2016,1696.908644,0 -12/9/2016,3598.968617,0 -12/10/2016,1615.676292,0 -12/11/2016,2467.743295,0 -12/12/2016,610.7155271,0 -12/13/2016,670.4859267,0 -12/14/2016,7615.791087,0 -12/15/2016,753.563629,0 -12/16/2016,4902.527479,0 -12/17/2016,1100.27025,0 -12/18/2016,6304.927849,0 -12/19/2016,8102.365431,0 -12/20/2016,2365.117597,0 -12/21/2016,4856.441026,0 -12/22/2016,1131.515869,0 -12/23/2016,4668.423247,0 -12/24/2016,1217.774744,0 -12/25/2016,8297.247098,0 -12/26/2016,354.790658,0 -12/27/2016,583.8686044,0 -12/28/2016,697.8526992,0 -12/29/2016,1218.497999,0 -12/30/2016,2106.768794,0 -12/31/2016,6796.460233,0 -1/1/2017,8035.558961,0 -1/2/2017,7697.33017,0 -1/3/2017,611.8428427,0 -1/4/2017,2145.472819,0 -1/5/2017,5507.994479,0 -1/6/2017,8355.523289,0 -1/7/2017,6388.470862,0 -1/8/2017,5766.433729,0 -1/9/2017,1650.659162,0 -1/10/2017,726.1968565,0 -1/11/2017,4497.152034,0 -1/12/2017,1887.049211,0 -1/13/2017,3094.501209,0 -1/14/2017,4079.472195,0 -1/15/2017,3326.534211,0 -1/16/2017,5812.106978,0 -1/17/2017,1404.065797,0 -1/18/2017,4197.159097,0 -1/19/2017,1786.822033,0 -1/20/2017,1783.320777,0 -1/21/2017,2560.988895,0 -1/22/2017,3438.953305,0 -1/23/2017,2792.868953,0 -1/24/2017,2548.772662,0 -1/25/2017,2555.589484,0 -1/26/2017,3425.040313,0 -1/27/2017,4194.337589,0 -1/28/2017,932.4250351,0 -1/29/2017,2703.750212,0 -1/30/2017,10368.89079,0 -1/31/2017,6297.887558,0 -2/1/2017,2889.76547,0 -2/2/2017,4619.370324,0 -2/3/2017,6875.091433,0 -2/4/2017,4964.080344,0 -2/5/2017,878.6688748,0 -2/6/2017,2687.379738,0 -2/7/2017,1523.81691,0 -2/8/2017,3462.532044,0 -2/9/2017,10388.94637,0 -2/10/2017,2945.447652,0 -2/11/2017,1670.895842,0 -2/12/2017,1479.479283,0 -2/13/2017,3076.442331,0 -2/14/2017,2986.90705,0 -2/15/2017,1244.210765,0 -2/16/2017,7726.607565,0 -2/17/2017,8428.682662,0 -2/18/2017,11397.35586,0 -2/19/2017,11951.69615,0 -2/20/2017,11456.33573,0 -2/21/2017,2825.978198,0 -2/22/2017,8013.700769,0 -2/23/2017,8383.303155,0 -2/24/2017,1453.863065,0 -2/25/2017,3835.465222,0 -2/26/2017,10835.62675,0 -2/27/2017,10647.56932,0 -2/28/2017,4249.653885,0 -3/1/2017,2360.89877,0 -3/2/2017,8319.971505,0 -3/3/2017,7330.756977,0 -3/4/2017,14067.36507,0 -3/5/2017,11337.51371,0 -3/6/2017,2492.82186,0 -3/7/2017,2722.088521,0 -3/8/2017,7323.021454,0 -3/9/2017,9225.690995,0 -3/10/2017,8958.179627,0 -3/11/2017,4519.617184,0 -3/12/2017,12952.58703,0 -3/13/2017,5659.141818,0 -3/14/2017,8466.366477,0 -3/15/2017,12163.64733,0 -3/16/2017,13329.17463,0 -3/17/2017,14137.33906,0 -3/18/2017,6045.77625,0 -3/19/2017,14586.97583,0 -3/20/2017,8986.260958,0 -3/21/2017,13403.27977,0 -3/22/2017,15179.49704,0 -3/23/2017,14179.23228,0 -3/24/2017,4497.408637,0 -3/25/2017,5407.316989,0 -3/26/2017,4108.351942,0 -3/27/2017,4570.337487,0 -3/28/2017,5069.351766,0 -3/29/2017,10585.01784,0 -3/30/2017,3698.611591,0 -3/31/2017,2013.974209,0 -4/1/2017,12790.01665,0 -4/2/2017,12732.84516,0 -4/3/2017,5281.660664,0 -4/4/2017,2704.546749,0 -4/5/2017,9869.262499,0 -4/6/2017,1751.458,0 -4/7/2017,11025.93,0 -4/8/2017,15671.91039,0 -4/9/2017,13519.7735,0 -4/10/2017,10514.50571,0 -4/11/2017,10823.98612,0 -4/12/2017,3997.439117,0 -4/13/2017,15299.04833,0 -4/14/2017,16001.83783,0 -4/15/2017,6355.966562,0 -4/16/2017,4231.637883,0 -4/17/2017,8647.660013,0 -4/18/2017,16230.08574,0 -4/19/2017,7113.405113,0 -4/20/2017,3003.801653,0 -4/21/2017,8874.711746,0 -4/22/2017,15545.16495,0 -4/23/2017,16370.35325,0 -4/24/2017,15853.77541,0 -4/25/2017,3463.607331,0 -4/26/2017,7272.300269,0 -4/27/2017,12895.95703,0 -4/28/2017,14502.63997,0 -4/29/2017,14221.65558,0 -4/30/2017,4936.939505,0 -5/1/2017,2582.075978,0 -5/2/2017,5434.319709,0 -5/3/2017,17075.47772,0 -5/4/2017,5409.623744,0 -5/5/2017,3267.114952,0 -5/6/2017,3831.050324,0 -5/7/2017,12252.55276,0 -5/8/2017,15074.17662,0 -5/9/2017,14767.4384,0 -5/10/2017,15619.27596,0 -5/11/2017,11108.36286,0 -5/12/2017,9791.273623,0 -5/13/2017,11456.53855,0 -5/14/2017,11711.39072,0 -5/15/2017,17182.73059,0 -5/16/2017,8844.625104,0 -5/17/2017,14620.1937,0 -5/18/2017,11946.75478,0 -5/19/2017,12217.98959,0 -5/20/2017,17113.95494,0 -5/21/2017,4163.287567,0 -5/22/2017,4595.314506,0 -5/23/2017,6622.826615,0 -5/24/2017,14715.98664,0 -5/25/2017,4435.710127,0 -5/26/2017,10054.92241,0 -5/27/2017,8387.10162,0 -5/28/2017,15129.62569,0 -5/29/2017,13930.50807,0 -5/30/2017,11995.98176,0 -5/31/2017,11303.72172,0 -6/1/2017,11715.40629,0 -6/2/2017,17557.00469,0 -6/3/2017,17696.6498,0 -6/4/2017,5914.53463,0 -6/5/2017,2978.229952,0 -6/6/2017,6493.697071,0 -6/7/2017,17129.16936,0 -6/8/2017,17190.30193,0 -6/9/2017,14925.75281,0 -6/10/2017,15029.46246,0 -6/11/2017,13392.62318,0 -6/12/2017,11462.70409,0 -6/13/2017,7678.276428,0 -6/14/2017,15799.25774,0 -6/15/2017,5480.249203,0 -6/16/2017,16116.87636,0 -6/17/2017,9018.955106,0 -6/18/2017,7613.943596,0 -6/19/2017,13083.54702,0 -6/20/2017,9274.51519,0 -6/21/2017,14648.7103,0 -6/22/2017,8056.090626,0 -6/23/2017,9372.239453,0 -6/24/2017,13283.61981,0 -6/25/2017,12436.16258,0 -6/26/2017,8355.282816,0 -6/27/2017,13348.68402,0 -6/28/2017,15227.54227,0 -6/29/2017,6951.671693,0 -6/30/2017,10491.67542,0 -7/1/2017,9740.653477,0 -7/2/2017,9053.382142,0 -7/3/2017,16801.83395,0 -7/4/2017,14736.11463,0 -7/5/2017,17139.93434,0 -7/6/2017,14876.0622,0 -7/7/2017,13603.5541,0 -7/8/2017,17006.53441,0 -7/9/2017,9420.304433,0 -7/10/2017,12203.81862,0 -7/11/2017,14622.21127,0 -7/12/2017,10059.83652,0 -7/13/2017,3528.623852,0 -7/14/2017,6496.218595,0 -7/15/2017,16166.32052,0 -7/16/2017,7303.780069,0 -7/17/2017,8483.134339,0 -7/18/2017,14712.53133,0 -7/19/2017,15525.55573,0 -7/20/2017,11102.85643,0 -7/21/2017,15738.56854,0 -7/22/2017,7583.53975,0 -7/23/2017,8863.375183,0 -7/24/2017,3877.90294,0 -7/25/2017,16501.37019,0 -7/26/2017,7255.735271,0 -7/27/2017,16055.95848,0 -7/28/2017,14754.4965,0 -7/29/2017,16318.89359,0 -7/30/2017,16400.46971,0 -7/31/2017,15716.132,0 -8/1/2017,13387.16262,0 -8/2/2017,10600.33606,0 -8/3/2017,9544.931696,0 -8/4/2017,6346.345376,0 -8/5/2017,6917.287257,0 -8/6/2017,13146.14266,0 -8/7/2017,7710.311672,0 -8/8/2017,15172.58496,0 -8/9/2017,11679.66201,0 -8/10/2017,11656.66004,0 -8/11/2017,8479.842402,0 -8/12/2017,10825.36552,0 -8/13/2017,15998.11205,0 -8/14/2017,14450.22011,0 -8/15/2017,12070.76718,0 -8/16/2017,12327.78784,0 -8/17/2017,5581.226428,0 -8/18/2017,7424.364705,0 -8/19/2017,6518.034008,0 -8/20/2017,11984.95504,0 -8/21/2017,13690.17332,0 -8/22/2017,4963.173456,0 -8/23/2017,10846.731,0 -8/24/2017,10650.97172,0 -8/25/2017,14779.26967,0 -8/26/2017,12425.76755,0 -8/27/2017,13468.93955,0 -8/28/2017,10646.46948,0 -8/29/2017,11902.76017,0 -8/30/2017,10860.89447,0 -8/31/2017,11692.89248,0 -9/1/2017,15766.44409,0 -9/2/2017,15340.05269,0 -9/3/2017,5855.988043,0 -9/4/2017,8499.54362,0 -9/5/2017,8162.668745,0 -9/6/2017,11169.63596,0 -9/7/2017,8099.092496,0 -9/8/2017,10231.58593,0 -9/9/2017,14794.34696,0 -9/10/2017,13948.93636,0 -9/11/2017,13275.96829,0 -9/12/2017,13899.17439,0 -9/13/2017,11783.20378,0 -9/14/2017,12480.36154,0 -9/15/2017,10958.09173,0 -9/16/2017,12829.83613,0 -9/17/2017,9719.924231,0 -9/18/2017,5243.403783,0 -9/19/2017,4741.61625,0 -9/20/2017,10891.98481,0 -9/21/2017,12750.98978,0 -9/22/2017,12595.61217,0 -9/23/2017,12127.28809,0 -9/24/2017,12723.97261,0 -9/25/2017,11757.40487,0 -9/26/2017,9555.367873,0 -9/27/2017,4392.184167,0 -9/28/2017,5620.846546,0 -9/29/2017,3255.939291,0 -9/30/2017,13431.0443,0 -10/1/2017,13177.67292,0 -10/2/2017,12772.56307,0 -10/3/2017,12541.85016,0 -10/4/2017,2217.137312,0 -10/5/2017,12050.90595,0 -10/6/2017,6183.642731,0 -10/7/2017,3223.60777,0 -10/8/2017,10146.85143,0 -10/9/2017,9513.977564,0 -10/10/2017,9856.844655,0 -10/11/2017,1520.636947,0 -10/12/2017,5754.905804,0 -10/13/2017,3029.808981,0 -10/14/2017,3533.829848,0 -10/15/2017,2233.12565,0 -10/16/2017,8835.587843,0 -10/17/2017,10907.25254,0 -10/18/2017,11271.60056,0 -10/19/2017,10553.78083,0 -10/20/2017,10984.6396,0 -10/21/2017,8400.236193,0 -10/22/2017,9540.212068,0 -10/23/2017,3599.089808,0 -10/24/2017,5728.06294,0 -10/25/2017,6618.165066,0 -10/26/2017,6104.532829,0 -10/27/2017,6475.115599,0 -10/28/2017,1025.133441,0 -10/29/2017,4227.795995,0 -10/30/2017,1965.992779,0 -10/31/2017,2473.647439,0 -11/1/2017,2947.781477,0 -11/2/2017,1290.16402,0 -11/3/2017,5403.396829,0 -11/4/2017,3782.528871,0 -11/5/2017,1295.095493,0 -11/6/2017,2237.692249,0 -11/7/2017,6282.730892,0 -11/8/2017,7502.630642,0 -11/9/2017,1448.632739,0 -11/10/2017,6971.235774,0 -11/11/2017,4704.75352,0 -11/12/2017,2708.308752,0 -11/13/2017,1638.445122,0 -11/14/2017,1985.140712,0 -11/15/2017,2636.603561,0 -11/16/2017,1287.729812,0 -11/17/2017,6417.957591,0 -11/18/2017,2765.554721,0 -11/19/2017,2514.584788,0 -11/20/2017,2002.600242,0 -11/21/2017,5262.94198,0 -11/22/2017,1977.82968,0 -11/23/2017,2591.267898,0 -11/24/2017,4751.195413,0 -11/25/2017,1224.139237,0 -11/26/2017,1145.603637,0 -11/27/2017,4037.317848,0 -11/28/2017,7634.369045,0 -11/29/2017,2184.211838,0 -11/30/2017,1158.699159,0 -12/1/2017,2350.534336,0 -12/2/2017,5753.639725,0 -12/3/2017,7158.68013,0 -12/4/2017,4279.55777,0 -12/5/2017,3924.298115,0 -12/6/2017,2261.562896,0 -12/7/2017,1456.733959,0 -12/8/2017,5273.563592,0 -12/9/2017,4171.323372,0 -12/10/2017,2076.82227,0 -12/11/2017,3531.690228,0 -12/12/2017,2200.486921,0 -12/13/2017,6632.50304,0 -12/14/2017,5969.455709,0 -12/15/2017,2651.869041,0 -12/16/2017,4903.665826,0 -12/17/2017,4714.336966,0 -12/18/2017,317.6500382,0 -12/19/2017,2308.527203,0 -12/20/2017,833.7091771,0 -12/21/2017,1907.01069,0 -12/22/2017,1271.126745,0 -12/23/2017,821.0031755,0 -12/24/2017,3944.180067,0 -12/25/2017,914.5552732,0 -12/26/2017,2846.187771,0 -12/27/2017,4697.988745,0 -12/28/2017,6221.768655,0 -12/29/2017,7244.278306,0 -12/30/2017,3280.38214,0 -12/31/2017,6410.051448,0 -1/1/2018,5046.237306,0 -1/2/2018,1875.625912,0 -1/3/2018,2073.924948,0 -1/4/2018,4128.176354,0 -1/5/2018,5515.639102,0 -1/6/2018,4610.607953,0 -1/7/2018,2193.945621,0 -1/8/2018,3425.523632,0 -1/9/2018,1892.28676,0 -1/10/2018,3303.451491,0 -1/11/2018,1917.047945,0 -1/12/2018,2789.420771,0 -1/13/2018,7025.888882,0 -1/14/2018,6754.192931,0 -1/15/2018,3751.824413,0 -1/16/2018,6624.43339,0 -1/17/2018,4775.692596,0 -1/18/2018,2590.073602,0 -1/19/2018,7004.983087,0 -1/20/2018,6601.468605,0 -1/21/2018,5743.271579,0 -1/22/2018,2228.588787,0 -1/23/2018,3106.57089,0 -1/24/2018,7089.966676,0 -1/25/2018,5455.604817,0 -1/26/2018,8009.145599,0 -1/27/2018,3411.335589,0 -1/28/2018,3116.371463,0 -1/29/2018,6214.121281,0 -1/30/2018,8591.751384,0 -1/31/2018,2521.702021,0 -2/1/2018,4878.226585,0 -2/2/2018,6264.450176,0 -2/3/2018,6895.953359,0 -2/4/2018,4013.914674,0 -2/5/2018,6354.908694,0 -2/6/2018,7502.433193,0 -2/7/2018,6276.49629,0 -2/8/2018,6278.924348,0 -2/9/2018,5259.665788,0 -2/10/2018,4104.347369,0 -2/11/2018,3951.051996,0 -2/12/2018,5946.803037,0 -2/13/2018,6620.672196,0 -2/14/2018,11191.42403,0 -2/15/2018,5270.272673,0 -2/16/2018,7455.038801,0 -2/17/2018,3954.45837,0 -2/18/2018,5213.800049,0 -2/19/2018,2506.216839,0 -2/20/2018,2642.768131,0 -2/21/2018,5692.991952,0 -2/22/2018,5931.341748,0 -2/23/2018,1396.690156,0 -2/24/2018,7388.6906,0 -2/25/2018,10748.73505,0 -2/26/2018,10462.77315,0 -2/27/2018,11197.23256,0 -2/28/2018,7082.086211,0 -3/1/2018,3523.157767,0 -3/2/2018,5583.854383,0 -3/3/2018,13009.04637,0 -3/4/2018,13566.49654,0 -3/5/2018,8556.99602,0 -3/6/2018,1793.13194,0 -3/7/2018,1900.78801,0 -3/8/2018,3282.370883,0 -3/9/2018,2724.987457,0 -3/10/2018,9076.336498,0 -3/11/2018,12776.62513,0 -3/12/2018,5832.936823,0 -3/13/2018,9591.059525,0 -3/14/2018,5807.392948,0 -3/15/2018,13487.04136,0 -3/16/2018,9931.700226,0 -3/17/2018,14362.73681,0 -3/18/2018,11796.58239,0 -3/19/2018,15077.21214,0 -3/20/2018,15061.00298,0 -3/21/2018,12330.17492,0 -3/22/2018,12259.33206,0 -3/23/2018,14728.33065,0 -3/24/2018,15592.4194,0 -3/25/2018,15351.05148,0 -3/26/2018,15155.63252,0 -3/27/2018,995.9550427,0 -3/28/2018,7264.279977,0 -3/29/2018,1552.787561,0 -3/30/2018,11636.82358,0 -3/31/2018,6502.054162,0 -4/1/2018,6462.832203,0 -4/2/2018,14820.37901,0 -4/3/2018,3447.376406,0 -4/4/2018,4906.691619,0 -4/5/2018,10447.31962,0 -4/6/2018,8587.586146,0 -4/7/2018,9441.954362,0 -4/8/2018,14910.95873,0 -4/9/2018,10725.55864,0 -4/10/2018,7683.747471,0 -4/11/2018,3665.490623,0 -4/12/2018,3903.354842,0 -4/13/2018,5043.239119,0 -4/14/2018,6009.536125,0 -4/15/2018,5990.762399,0 -4/16/2018,5490.090263,0 -4/17/2018,6782.730876,0 -4/18/2018,8580.346167,0 -4/19/2018,12103.86585,0 -4/20/2018,17130.36077,0 -4/21/2018,16762.8624,0 -4/22/2018,17099.74909,0 -4/23/2018,16648.93316,0 -4/24/2018,6153.971094,0 -4/25/2018,2235.701744,0 -4/26/2018,16536.35723,0 -4/27/2018,12345.47196,0 -4/28/2018,4381.253562,0 -4/29/2018,17311.5814,0 -4/30/2018,16820.65848,0 -5/1/2018,14552.39754,0 -5/2/2018,6625.279825,0 -5/3/2018,3587.383024,0 -5/4/2018,8608.694132,0 -5/5/2018,15206.95059,0 -5/6/2018,10632.67063,0 -5/7/2018,17294.60881,0 -5/8/2018,16763.65746,0 -5/9/2018,14986.98424,0 -5/10/2018,5261.564598,0 -5/11/2018,13246.75459,0 -5/12/2018,14789.81615,0 -5/13/2018,17024.30733,0 -5/14/2018,13858.13722,0 -5/15/2018,7796.781498,0 -5/16/2018,16994.93469,0 -5/17/2018,17057.72286,0 -5/18/2018,16920.11304,0 -5/19/2018,2865.720675,0 -5/20/2018,13991.3144,0 -5/21/2018,15059.71428,0 -5/22/2018,2305.138817,0 -5/23/2018,16946.2407,0 -5/24/2018,16898.45154,0 -5/25/2018,13857.96007,0 -5/26/2018,9758.628799,0 -5/27/2018,16154.2389,0 -5/28/2018,15664.33399,0 -5/29/2018,16874.9138,0 -5/30/2018,15290.07767,0 -5/31/2018,9810.34514,0 -6/1/2018,12199.45221,0 -6/2/2018,17061.61015,0 -6/3/2018,7442.337225,0 -6/4/2018,5382.569462,0 -6/5/2018,4581.293068,0 -6/6/2018,9073.099255,0 -6/7/2018,9795.839327,0 -6/8/2018,16606.75779,0 -6/9/2018,10342.8949,0 -6/10/2018,15813.79881,0 -6/11/2018,17830.68271,0 -6/12/2018,15966.7248,0 -6/13/2018,9609.153345,0 -6/14/2018,17489.19521,0 -6/15/2018,17561.83639,0 -6/16/2018,14456.61137,0 -6/17/2018,13963.0709,0 -6/18/2018,6455.363019,0 -6/19/2018,13855.96147,0 -6/20/2018,15260.71649,0 -6/21/2018,17746.43122,0 -6/22/2018,13830.30374,0 -6/23/2018,3561.28762,0 -6/24/2018,5188.802295,0 -6/25/2018,18090.21243,0 -6/26/2018,15310.79424,0 -6/27/2018,2920.181002,0 -6/28/2018,14369.89562,0 -6/29/2018,16482.77563,0 -6/30/2018,15074.02674,0 -7/1/2018,16742.7337,0 -7/2/2018,13572.37405,0 -7/3/2018,17159.81524,0 -7/4/2018,16899.92377,0 -7/5/2018,11719.6952,0 -7/6/2018,17710.85683,0 -7/7/2018,17374.39738,0 -7/8/2018,17320.78286,0 -7/9/2018,17095.58326,0 -7/10/2018,16703.72908,0 -7/11/2018,16107.77356,0 -7/12/2018,13197.54757,0 -7/13/2018,10519.37424,0 -7/14/2018,4272.939029,0 -7/15/2018,16272.87597,0 -7/16/2018,5029.373921,0 -7/17/2018,17076.34355,0 -7/18/2018,17030.198,0 -7/19/2018,17052.45793,0 -7/20/2018,14893.64387,0 -7/21/2018,11960.77647,0 -7/22/2018,2655.445797,0 -7/23/2018,9806.725113,0 -7/24/2018,6589.256084,0 -7/25/2018,12522.08605,0 -7/26/2018,11708.09542,0 -7/27/2018,10482.83927,0 -7/28/2018,6152.068582,0 -7/29/2018,11631.79403,0 -7/30/2018,14532.71987,0 -7/31/2018,12504.35648,0 -8/1/2018,6042.454414,0 -8/2/2018,10734.76856,0 -8/3/2018,12690.04422,0 -8/4/2018,14698.81109,0 -8/5/2018,14711.99351,0 -8/6/2018,7486.57011,0 -8/7/2018,13877.77092,0 -8/8/2018,7048.637681,0 -8/9/2018,10988.60643,0 -8/10/2018,16350.78261,0 -8/11/2018,12901.98558,0 -8/12/2018,13950.41463,0 -8/13/2018,12969.43446,0 -8/14/2018,15000.95101,0 -8/15/2018,12824.72859,0 -8/16/2018,12947.54191,0 -8/17/2018,4832.535213,0 -8/18/2018,11167.98552,0 -8/19/2018,13279.71558,0 -8/20/2018,11133.34166,0 -8/21/2018,2618.956257,0 -8/22/2018,7179.254847,0 -8/23/2018,15061.23564,0 -8/24/2018,13310.03444,0 -8/25/2018,3166.843163,0 -8/26/2018,14099.54793,0 -8/27/2018,4853.207624,0 -8/28/2018,10919.58717,0 -8/29/2018,6267.639369,0 -8/30/2018,8405.387751,0 -8/31/2018,11968.96397,0 -9/1/2018,10609.59375,0 -9/2/2018,8467.769103,0 -9/3/2018,8829.347283,0 -9/4/2018,10988.80834,0 -9/5/2018,11935.66192,0 -9/6/2018,9392.278734,0 -9/7/2018,12523.98145,0 -9/8/2018,12002.58449,0 -9/9/2018,7167.221554,0 -9/10/2018,2660.382233,0 -9/11/2018,9614.853948,0 -9/12/2018,12911.52935,0 -9/13/2018,12361.72419,0 -9/14/2018,11980.18728,0 -9/15/2018,11312.70359,0 -9/16/2018,10137.45544,0 -9/17/2018,11712.2123,0 -9/18/2018,9809.632215,0 -9/19/2018,13352.48001,0 -9/20/2018,2811.735977,0 -9/21/2018,6891.811377,0 -9/22/2018,13803.38778,0 -9/23/2018,13166.91233,0 -9/24/2018,12396.34447,0 -9/25/2018,2673.071273,0 -9/26/2018,4940.010131,0 -9/27/2018,7833.53869,0 -9/28/2018,2654.040107,0 -9/29/2018,8242.405742,0 -9/30/2018,1706.173805,0 -10/1/2018,1630.806241,0 -10/2/2018,1128.097138,0 -10/3/2018,2052.847366,0 -10/4/2018,11551.98294,0 -10/5/2018,4866.288322,0 -10/6/2018,3075.112346,0 -10/7/2018,1311.309275,0 -10/8/2018,2290.359482,0 -10/9/2018,6220.561344,0 -10/10/2018,8777.397003,0 -10/11/2018,4570.317841,0 -10/12/2018,6498.154539,0 -10/13/2018,4250.556605,0 -10/14/2018,9611.277403,0 -10/15/2018,1537.09722,0 -10/16/2018,6603.936864,0 -10/17/2018,4034.189968,0 -10/18/2018,5459.226381,0 -10/19/2018,3347.567494,0 -10/20/2018,9484.713232,0 -10/21/2018,2265.212236,0 -10/22/2018,5616.621122,0 -10/23/2018,1345.284428,0 -10/24/2018,2105.762641,0 -10/25/2018,5563.727727,0 -10/26/2018,1515.187252,0 -10/27/2018,1895.604316,0 -10/28/2018,1830.016036,0 -10/29/2018,2736.654454,0 -10/30/2018,10097.16394,0 -10/31/2018,604.7005985,0 -11/1/2018,1318.550705,0 -11/2/2018,985.2038107,0 -11/3/2018,3816.135285,0 -11/4/2018,7229.337658,0 -11/5/2018,1191.40108,0 -11/6/2018,2058.150242,0 -11/7/2018,1493.428638,0 -11/8/2018,3915.641337,0 -11/9/2018,1056.966945,0 -11/10/2018,5314.353208,0 -11/11/2018,6147.053126,0 -11/12/2018,3200.14218,0 -11/13/2018,5743.667504,0 -11/14/2018,6019.055989,0 -11/15/2018,1793.969547,0 -11/16/2018,4296.524621,0 -11/17/2018,4321.006945,0 -11/18/2018,4152.201133,0 -11/19/2018,4951.516518,0 -11/20/2018,4613.2814,0 -11/21/2018,6198.971764,0 -11/22/2018,6317.141191,0 -11/23/2018,6984.790206,0 -11/24/2018,2943.243856,0 -11/25/2018,2897.815483,0 -11/26/2018,1700.961426,0 -11/27/2018,4364.838613,0 -11/28/2018,3086.589903,0 -11/29/2018,5012.318047,0 -11/30/2018,2165.809976,0 -12/1/2018,2382.090341,0 -12/2/2018,6336.913653,0 -12/3/2018,2467.157162,0 -12/4/2018,6953.951622,0 -12/5/2018,5198.43488,0 -12/6/2018,2340.603316,0 -12/7/2018,4714.835045,0 -12/8/2018,4324.094296,0 -12/9/2018,5899.658078,0 -12/10/2018,2080.462666,0 -12/11/2018,1612.323404,0 -12/12/2018,2256.869096,0 -12/13/2018,1903.309806,0 -12/14/2018,3107.656445,0 -12/15/2018,4106.487114,0 -12/16/2018,5080.748502,0 -12/17/2018,2121.807987,0 -12/18/2018,6423.91558,0 -12/19/2018,5531.45897,0 -12/20/2018,2771.053885,0 -12/21/2018,2317.084874,0 -12/22/2018,1755.058513,0 -12/23/2018,1745.0434,0 -12/24/2018,2067.605981,0 -12/25/2018,5852.490466,0 -12/26/2018,2162.386491,0 -12/27/2018,2796.59952,0 -12/28/2018,1607.724899,0 -12/29/2018,4034.591587,0 -12/30/2018,2099.700506,0 -12/31/2018,2320.012779,0 -1/1/2019,4833.301041,0 -1/2/2019,5289.89032,0 -1/3/2019,2684.29063,0 -1/4/2019,7794.639565,0 -1/5/2019,3374.991723,0 -1/6/2019,5713.91794,0 -1/7/2019,2387.029152,0 -1/8/2019,3812.721952,0 -1/9/2019,3925.325645,0 -1/10/2019,7034.873335,0 -1/11/2019,7185.503541,0 -1/12/2019,6144.930331,0 -1/13/2019,8316.986319,0 -1/14/2019,6511.307081,0 -1/15/2019,2631.229829,0 -1/16/2019,5556.903658,0 -1/17/2019,5562.068658,0 -1/18/2019,2569.354175,0 -1/19/2019,4005.072441,0 -1/20/2019,8325.664409,0 -1/21/2019,6980.504332,0 -1/22/2019,3860.459812,0 -1/23/2019,2468.690698,0 -1/24/2019,6631.285518,0 -1/25/2019,6296.456587,0 -1/26/2019,8187.73459,0 -1/27/2019,7245.583229,0 -1/28/2019,7082.087285,0 -1/29/2019,6519.817754,0 -1/30/2019,5608.298988,0 -1/31/2019,6823.627256,0 -2/1/2019,8480.609475,0 -2/2/2019,2929.008322,0 -2/3/2019,2332.018977,0 -2/4/2019,4439.86101,0 -2/5/2019,4818.195306,0 -2/6/2019,3097.44503,0 -2/7/2019,3586.539932,0 -2/8/2019,5021.051609,0 -2/9/2019,9161.134351,0 -2/10/2019,7567.552066,0 -2/11/2019,9433.514335,0 -2/12/2019,3226.100256,0 -2/13/2019,6653.096504,0 -2/14/2019,8769.29564,0 -2/15/2019,3663.694073,0 -2/16/2019,10013.0534,0 -2/17/2019,9006.626523,0 -2/18/2019,8734.889577,0 -2/19/2019,10525.63275,0 -2/20/2019,6594.509424,0 -2/21/2019,4091.880169,0 -2/22/2019,5850.289982,0 -2/23/2019,8197.571652,0 -2/24/2019,5839.657784,0 -2/25/2019,5685.324644,0 -2/26/2019,10592.2443,0 -2/27/2019,7095.911562,0 -2/28/2019,11629.237,0 -3/1/2019,11712.02809,0 -3/2/2019,8561.690785,0 -3/3/2019,8524.438294,0 -3/4/2019,11256.95475,0 -3/5/2019,10570.99513,0 -3/6/2019,11604.80307,0 -3/7/2019,10174.57578,0 -3/8/2019,13720.74463,0 -3/9/2019,12403.2454,0 -3/10/2019,5620.541551,0 -3/11/2019,5431.669949,0 -3/12/2019,13088.82921,0 -3/13/2019,7206.555034,0 -3/14/2019,4542.088359,0 -3/15/2019,5923.185435,0 -3/16/2019,9288.659714,0 -3/17/2019,8360.642663,0 -3/18/2019,14268.71597,0 -3/19/2019,11577.75876,0 -3/20/2019,13991.6929,0 -3/21/2019,6977.482577,0 -3/22/2019,8388.507276,0 -3/23/2019,15579.20169,0 -3/24/2019,12818.05157,0 -3/25/2019,16115.42015,0 -3/26/2019,15388.74195,0 -3/27/2019,14727.48219,0 -3/28/2019,2453.859064,0 -3/29/2019,15084.55963,0 -3/30/2019,3222.288619,0 -3/31/2019,13564.40105,0 -4/1/2019,14688.06138,0 -4/2/2019,10137.96634,0 -4/3/2019,13892.71092,0 -4/4/2019,14356.64761,0 -4/5/2019,3269.867923,0 -4/6/2019,5172.60588,0 -4/7/2019,7307.731503,0 -4/8/2019,7541.913041,0 -4/9/2019,1906.471188,0 -4/10/2019,13998.64738,0 -4/11/2019,3967.92809,0 -4/12/2019,5135.552028,0 -4/13/2019,15763.8888,0 -4/14/2019,3087.713372,0 -4/15/2019,12248.35584,0 -4/16/2019,11165.00891,0 -4/17/2019,13636.26553,0 -4/18/2019,4583.972916,0 -4/19/2019,2001.253424,0 -4/20/2019,2557.261301,0 -4/21/2019,7523.39296,0 -4/22/2019,12171.16833,0 -4/23/2019,3694.73616,0 -4/24/2019,9786.149972,0 -4/25/2019,15067.38907,0 -4/26/2019,2258.705221,0 -4/27/2019,6946.464593,0 -4/28/2019,17263.2327,0 -4/29/2019,5829.07146,0 -4/30/2019,8505.770558,0 -5/1/2019,1476.64042,0 -5/2/2019,6195.874983,0 -5/3/2019,3381.437436,0 -5/4/2019,4675.098357,0 -5/5/2019,16628.15799,0 -5/6/2019,10091.0655,0 -5/7/2019,12294.71762,0 -5/8/2019,16508.74218,0 -5/9/2019,5087.51782,0 -5/10/2019,4639.93197,0 -5/11/2019,10531.41321,0 -5/12/2019,4352.301971,0 -5/13/2019,3633.199206,0 -5/14/2019,8813.806361,0 -5/15/2019,12873.90689,0 -5/16/2019,7922.13719,0 -5/17/2019,12708.61479,0 -5/18/2019,9537.019438,0 -5/19/2019,8836.778089,0 -5/20/2019,3575.287539,0 -5/21/2019,17567.90034,0 -5/22/2019,4085.772553,0 -5/23/2019,7250.52953,0 -5/24/2019,11586.79172,0 -5/25/2019,4796.966054,0 -5/26/2019,13968.68652,0 -5/27/2019,14405.23029,0 -5/28/2019,2972.883302,0 -5/29/2019,5040.190037,0 -5/30/2019,12098.82078,0 -5/31/2019,13523.6788,0 -6/1/2019,11133.67014,0 -6/2/2019,16842.53023,0 -6/3/2019,17002.23259,0 -6/4/2019,2533.970874,0 -6/5/2019,4688.353836,0 -6/6/2019,17418.37337,0 -6/7/2019,17622.17686,0 -6/8/2019,17587.91999,0 -6/9/2019,13912.87927,0 -6/10/2019,3108.072605,0 -6/11/2019,17669.12281,0 -6/12/2019,16234.56044,0 -6/13/2019,2915.440753,0 -6/14/2019,15500.46045,0 -6/15/2019,2219.953832,0 -6/16/2019,12849.05544,0 -6/17/2019,11353.18139,0 -6/18/2019,11702.66435,0 -6/19/2019,9523.875414,0 -6/20/2019,4054.563192,0 -6/21/2019,17358.43754,0 -6/22/2019,17509.01929,0 -6/23/2019,17519.72576,0 -6/24/2019,8589.149727,0 -6/25/2019,10079.09776,0 -6/26/2019,14760.54593,0 -6/27/2019,15571.19424,0 -6/28/2019,4271.425327,0 -6/29/2019,15011.06392,0 -6/30/2019,17543.89457,0 -7/1/2019,15643.52682,0 -7/2/2019,9630.555923,0 -7/3/2019,16859.98695,0 -7/4/2019,15426.3468,0 -7/5/2019,12771.58944,0 -7/6/2019,14255.90602,0 -7/7/2019,17570.87061,0 -7/8/2019,16876.58307,0 -7/9/2019,16492.43167,0 -7/10/2019,15810.43532,0 -7/11/2019,13470.85589,0 -7/12/2019,9977.339446,0 -7/13/2019,8968.32742,0 -7/14/2019,16984.77645,0 -7/15/2019,12971.73203,0 -7/16/2019,10734.08773,0 -7/17/2019,10363.81793,0 -7/18/2019,13282.00378,0 -7/19/2019,7515.979465,0 -7/20/2019,11265.06993,0 -7/21/2019,16595.44949,0 -7/22/2019,8107.093561,0 -7/23/2019,16564.1656,0 -7/24/2019,16329.96611,0 -7/25/2019,16052.991,0 -7/26/2019,12755.7437,0 -7/27/2019,9387.599672,0 -7/28/2019,14899.65828,0 -7/29/2019,10096.97687,0 -7/30/2019,11033.61381,0 -7/31/2019,14287.92062,0 -8/1/2019,16515.45402,0 -8/2/2019,15849.75463,0 -8/3/2019,15810.2406,0 -8/4/2019,16418.61556,0 -8/5/2019,14631.42329,0 -8/6/2019,7367.90319,0 -8/7/2019,15893.52288,0 -8/8/2019,7255.943703,0 -8/9/2019,10747.86925,0 -8/10/2019,15512.52726,0 -8/11/2019,15545.55103,0 -8/12/2019,7767.71784,0 -8/13/2019,13184.74453,0 -8/14/2019,16077.2408,0 -8/15/2019,9386.403721,0 -8/16/2019,11812.85624,0 -8/17/2019,12116.68585,0 -8/18/2019,10890.1773,0 -8/19/2019,16015.32474,0 -8/20/2019,13224.90163,0 -8/21/2019,11386.2298,0 -8/22/2019,13109.48152,0 -8/23/2019,13559.23117,0 -8/24/2019,14563.35971,0 -8/25/2019,13390.64059,0 -8/26/2019,12303.9787,0 -8/27/2019,2690.81193,0 -8/28/2019,13494.91672,0 -8/29/2019,13832.19082,0 -8/30/2019,13118.09373,0 -8/31/2019,14005.55878,0 -9/1/2019,6138.593534,0 -9/2/2019,5442.758426,0 -9/3/2019,4797.722287,0 -9/4/2019,4565.835224,0 -9/5/2019,15057.4775,0 -9/6/2019,1955.400618,0 -9/7/2019,9055.914056,0 -9/8/2019,8071.916679,0 -9/9/2019,14701.22811,0 -9/10/2019,4346.466749,0 -9/11/2019,9842.482843,0 -9/12/2019,12850.76992,0 -9/13/2019,4181.876024,0 -9/14/2019,9451.571889,0 -9/15/2019,2729.783985,0 -9/16/2019,3784.205474,0 -9/17/2019,14065.56378,0 -9/18/2019,11803.8604,0 -9/19/2019,11866.10663,0 -9/20/2019,8142.085836,0 -9/21/2019,11396.39182,0 -9/22/2019,5684.437689,0 -9/23/2019,5414.109984,0 -9/24/2019,10273.97031,0 -9/25/2019,7745.092696,0 -9/26/2019,7497.764831,0 -9/27/2019,4324.62542,0 -9/28/2019,4338.754593,0 -9/29/2019,7314.286492,0 -9/30/2019,10031.5344,0 -10/1/2019,5496.397492,0 -10/2/2019,2373.89365,0 -10/3/2019,2053.146285,0 -10/4/2019,6141.6799,0 -10/5/2019,11072.38864,0 -10/6/2019,6775.32267,0 -10/7/2019,7202.894471,0 -10/8/2019,12773.04014,0 -10/9/2019,12816.50995,0 -10/10/2019,12482.08132,0 -10/11/2019,12285.01407,0 -10/12/2019,6445.190611,0 -10/13/2019,11310.01681,0 -10/14/2019,7600.96484,0 -10/15/2019,10668.62125,0 -10/16/2019,955.3635891,0 -10/17/2019,1441.010423,0 -10/18/2019,8414.864565,0 -10/19/2019,10656.50051,0 -10/20/2019,9107.168159,0 -10/21/2019,6386.358055,0 -10/22/2019,3379.280933,0 -10/23/2019,4405.819372,0 -10/24/2019,4402.188503,0 -10/25/2019,4443.728877,0 -10/26/2019,8593.359805,0 -10/27/2019,1377.262666,0 -10/28/2019,10664.00507,0 -10/29/2019,2951.20521,0 -10/30/2019,776.6448042,0 -10/31/2019,666.3062349,0 -11/1/2019,1679.841208,0 -11/2/2019,2129.001254,0 -11/3/2019,4395.273817,0 -11/4/2019,4260.275797,0 -11/5/2019,4534.421295,0 -11/6/2019,5311.33677,0 -11/7/2019,5211.33424,0 -11/8/2019,9690.454225,0 -11/9/2019,6156.361829,0 -11/10/2019,3542.008892,0 -11/11/2019,5419.390924,0 -11/12/2019,6927.488169,0 -11/13/2019,7624.839014,0 -11/14/2019,4112.801278,0 -11/15/2019,3376.551783,0 -11/16/2019,9141.099714,0 -11/17/2019,8731.813011,0 -11/18/2019,4460.006098,0 -11/19/2019,4445.878527,0 -11/20/2019,6724.737815,0 -11/21/2019,2998.416104,0 -11/22/2019,4284.443243,0 -11/23/2019,8467.142672,0 -11/24/2019,7890.666951,0 -11/25/2019,4596.657249,0 -11/26/2019,7886.579524,0 -11/27/2019,893.1539652,0 -11/28/2019,5731.191376,0 -11/29/2019,3007.056154,0 -11/30/2019,5688.576937,0 -12/1/2019,461.9405033,0 -12/2/2019,4439.005361,0 -12/3/2019,3534.95296,0 -12/4/2019,4498.532811,0 -12/5/2019,2369.075048,0 -12/6/2019,6097.292158,0 -12/7/2019,3548.632875,0 -12/8/2019,2219.881759,0 -12/9/2019,2912.266046,0 -12/10/2019,3103.758784,0 -12/11/2019,6631.737702,0 -12/12/2019,3905.54911,0 -12/13/2019,4689.338784,0 -12/14/2019,2216.501006,0 -12/15/2019,4418.817686,0 -12/16/2019,5791.02657,0 -12/17/2019,3915.18811,0 -12/18/2019,4187.698277,0 -12/19/2019,4490.246377,0 -12/20/2019,6912.76841,0 -12/21/2019,7552.303703,0 -12/22/2019,7445.415622,0 -12/23/2019,6300.122247,0 -12/24/2019,5475.798944,0 -12/25/2019,1873.834193,0 -12/26/2019,1745.481752,0 -12/27/2019,2139.305485,0 -12/28/2019,6332.060545,0 -12/29/2019,1566.479863,0 -12/30/2019,3281.068125,0 -12/31/2019,3725.131942,0 -1/1/2020,2956.163661,0 -1/2/2020,3643.084938,0 -1/3/2020,2860.862163,0 -1/4/2020,3612.581542,0 -1/5/2020,4366.789417,0 -1/6/2020,2835.559854,0 -1/7/2020,4639.797953,0 -1/8/2020,5806.088611,0 -1/9/2020,4684.11485,0 -1/10/2020,1730.593539,0 -1/11/2020,2312.93567,0 -1/12/2020,5312.248875,0 -1/13/2020,2247.205951,0 -1/14/2020,2315.733852,0 -1/15/2020,3080.190639,0 -1/16/2020,5462.752598,0 -1/17/2020,7682.078036,0 -1/18/2020,2199.463346,0 -1/19/2020,5543.860228,0 -1/20/2020,8598.4741,0 -1/21/2020,5740.309924,0 -1/22/2020,5180.994142,0 -1/23/2020,6512.680728,0 -1/24/2020,5939.883251,0 -1/25/2020,2902.873696,0 -1/26/2020,3528.997941,0 -1/27/2020,3002.715606,0 -1/28/2020,4322.977017,0 -1/29/2020,9875.709065,0 -1/30/2020,5505.032637,0 -1/31/2020,4490.83173,0 -2/1/2020,4706.475202,0 -2/2/2020,5053.666218,0 -2/3/2020,8975.878965,0 -2/4/2020,4375.008877,0 -2/5/2020,9296.68621,0 -2/6/2020,2525.8039,0 -2/7/2020,7154.044706,0 -2/8/2020,10576.92202,0 -2/9/2020,6092.720936,0 -2/10/2020,5020.803529,0 -2/11/2020,7552.693161,0 -2/12/2020,8720.917234,0 -2/13/2020,8324.63576,0 -2/14/2020,8890.724262,0 -2/15/2020,8279.754746,0 -2/16/2020,7018.240088,0 -2/17/2020,10998.50205,0 -2/18/2020,2626.583792,0 -2/19/2020,7567.035733,0 -2/20/2020,10963.37089,0 -2/21/2020,12242.04844,0 -2/22/2020,12024.08892,0 -2/23/2020,11693.84809,0 -2/24/2020,10833.99996,0 -2/25/2020,6702.26963,0 -2/26/2020,5105.162234,0 -2/27/2020,7188.789004,0 -2/28/2020,8461.181503,0 -3/1/2020,11158.26237,0 -3/2/2020,5570.893103,0 -3/3/2020,4861.166836,0 -3/4/2020,6570.092924,0 -3/5/2020,12658.1064,0 -3/6/2020,10154.97107,0 -3/7/2020,13728.7694,0 -3/8/2020,13063.61973,0 -3/9/2020,7507.38892,0 -3/10/2020,5475.498563,0 -3/11/2020,8857.88158,0 -3/12/2020,10742.31519,0 -3/13/2020,6775.426045,0 -3/14/2020,3522.96737,0 -3/15/2020,14651.62888,0 -3/16/2020,10764.46976,0 -3/17/2020,7174.753407,0 -3/18/2020,7175.265629,0 -3/19/2020,3327.099396,0 -3/20/2020,1640.03618,0 -3/21/2020,15158.54829,0 -3/22/2020,14980.71526,0 -3/23/2020,4742.619752,0 -3/24/2020,11606.19428,0 -3/25/2020,7982.332604,0 -3/26/2020,6551.453927,0 -3/27/2020,13799.08513,0 -3/28/2020,3390.759414,0 -3/29/2020,2873.843863,0 -3/30/2020,2553.8503,0 -3/31/2020,2853.328178,0 -4/1/2020,15327.8226,0 -4/2/2020,15530.72512,0 -4/3/2020,10574.048,0 -4/4/2020,5538.980319,0 -4/5/2020,7572.286512,0 -4/6/2020,13578.57158,0 -4/7/2020,8223.222249,0 -4/8/2020,6545.160035,0 -4/9/2020,7525.706372,0 -4/10/2020,12369.94922,0 -4/11/2020,11085.51129,0 -4/12/2020,4766.987239,0 -4/13/2020,2108.110366,0 -4/14/2020,10716.68973,0 -4/15/2020,9223.373517,0 -4/16/2020,8582.381253,0 -4/17/2020,10137.79157,0 -4/18/2020,11888.22801,0 -4/19/2020,4163.572356,0 -4/20/2020,16257.10239,0 -4/21/2020,6754.33993,0 -4/22/2020,17613.45871,0 -4/23/2020,12615.25388,0 -4/24/2020,3617.756834,0 -4/25/2020,15468.75682,0 -4/26/2020,7293.09635,0 -4/27/2020,15098.69628,0 -4/28/2020,5936.184401,0 -4/29/2020,2468.059261,0 -4/30/2020,4929.414783,0 -5/1/2020,11328.5269,0 -5/2/2020,5043.77965,0 -5/3/2020,16520.61676,0 -5/4/2020,13589.20632,0 -5/5/2020,15645.31321,0 -5/6/2020,16985.70265,0 -5/7/2020,9113.673954,0 -5/8/2020,16504.59477,0 -5/9/2020,8289.713997,0 -5/10/2020,4661.681371,0 -5/11/2020,12978.79126,0 -5/12/2020,8763.872166,0 -5/13/2020,17633.49684,0 -5/14/2020,5297.488095,0 -5/15/2020,3860.553174,0 -5/16/2020,16914.68972,0 -5/17/2020,7307.841391,0 -5/18/2020,4207.461799,0 -5/19/2020,7944.606985,0 -5/20/2020,17803.39678,0 -5/21/2020,17842.2091,0 -5/22/2020,17169.53221,0 -5/23/2020,16382.25351,0 -5/24/2020,10064.51595,0 -5/25/2020,15626.48864,0 -5/26/2020,12986.79012,0 -5/27/2020,12632.96134,0 -5/28/2020,6427.084313,0 -5/29/2020,7531.727017,0 -5/30/2020,6827.477106,0 -5/31/2020,15668.94665,0 -6/1/2020,16507.77732,0 -6/2/2020,9271.311633,0 -6/3/2020,13731.60827,0 -6/4/2020,15794.74618,0 -6/5/2020,14520.42892,0 -6/6/2020,17206.13557,0 -6/7/2020,17551.7435,0 -6/8/2020,16890.00497,0 -6/9/2020,16490.13524,0 -6/10/2020,13550.04814,0 -6/11/2020,12097.79279,0 -6/12/2020,17130.87927,0 -6/13/2020,17717.22252,0 -6/14/2020,17892.66636,0 -6/15/2020,17737.04771,0 -6/16/2020,17449.04386,0 -6/17/2020,17537.11928,0 -6/18/2020,17005.34436,0 -6/19/2020,15267.15859,0 -6/20/2020,15975.1341,0 -6/21/2020,12694.02747,0 -6/22/2020,8658.339297,0 -6/23/2020,4744.669672,0 -6/24/2020,7340.973966,0 -6/25/2020,13769.21899,0 -6/26/2020,16202.14495,0 -6/27/2020,14338.2578,0 -6/28/2020,16969.51547,0 -6/29/2020,17087.16903,0 -6/30/2020,15896.10923,0 -7/1/2020,15483.84742,0 -7/2/2020,16547.04605,0 -7/3/2020,16288.06526,0 -7/4/2020,17209.17833,0 -7/5/2020,13372.82465,0 -7/6/2020,15643.54396,0 -7/7/2020,13825.19133,0 -7/8/2020,16743.67571,0 -7/9/2020,15060.47593,0 -7/10/2020,12407.36149,0 -7/11/2020,4026.15988,0 -7/12/2020,10481.99137,0 -7/13/2020,11397.50002,0 -7/14/2020,15119.74778,0 -7/15/2020,12776.1142,0 -7/16/2020,4558.000763,0 -7/17/2020,16826.84902,0 -7/18/2020,14846.5161,0 -7/19/2020,5342.8626,0 -7/20/2020,14120.95582,0 -7/21/2020,12116.8764,0 -7/22/2020,8120.457734,0 -7/23/2020,15380.38538,0 -7/24/2020,16869.32913,0 -7/25/2020,15457.86622,0 -7/26/2020,15028.68092,0 -7/27/2020,11893.52185,0 -7/28/2020,12220.78883,0 -7/29/2020,10946.60824,0 -7/30/2020,15760.0071,0 -7/31/2020,14180.93982,0 -8/1/2020,11742.49429,0 -8/2/2020,2734.346877,0 -8/3/2020,5619.873042,0 -8/4/2020,5387.701266,0 -8/5/2020,14244.51616,0 -8/6/2020,15907.83816,0 -8/7/2020,14326.34832,0 -8/8/2020,15486.31946,0 -8/9/2020,14623.02136,0 -8/10/2020,13499.02483,0 -8/11/2020,10405.21136,0 -8/12/2020,16186.10646,0 -8/13/2020,15615.85925,0 -8/14/2020,15896.21119,0 -8/15/2020,14616.02054,0 -8/16/2020,3786.657836,0 -8/17/2020,8226.161644,0 -8/18/2020,11446.74166,0 -8/19/2020,16148.48221,0 -8/20/2020,10388.88004,0 -8/21/2020,14008.6154,0 -8/22/2020,11642.40043,0 -8/23/2020,13691.78892,0 -8/24/2020,12878.77993,0 -8/25/2020,15423.84957,0 -8/26/2020,7743.578579,0 -8/27/2020,8753.68287,0 -8/28/2020,10209.98169,0 -8/29/2020,5856.67849,0 -8/30/2020,14256.20992,0 -8/31/2020,15018.48112,0 -9/1/2020,11816.65565,0 -9/2/2020,8897.129697,0 -9/3/2020,14213.78797,0 -9/4/2020,12584.90179,0 -9/5/2020,10879.63324,0 -9/6/2020,14026.53022,0 -9/7/2020,4593.295231,0 -9/8/2020,2263.251521,0 -9/9/2020,2293.512554,0 -9/10/2020,4102.742507,0 -9/11/2020,14791.83572,0 -9/12/2020,9681.716906,0 -9/13/2020,7790.848172,0 -9/14/2020,14292.00701,0 -9/15/2020,11149.52574,0 -9/16/2020,10184.06691,0 -9/17/2020,13332.97248,0 -9/18/2020,13511.12505,0 -9/19/2020,10573.14829,0 -9/20/2020,14060.80162,0 -9/21/2020,13118.51705,0 -9/22/2020,12104.57601,0 -9/23/2020,13625.64641,0 -9/24/2020,9664.068416,0 -9/25/2020,12276.01502,0 -9/26/2020,8642.357104,0 -9/27/2020,9370.055198,0 -9/28/2020,9628.796177,0 -9/29/2020,8522.225842,0 -9/30/2020,4411.299247,0 -10/1/2020,7450.122669,0 -10/2/2020,4727.527731,0 -10/3/2020,3819.599717,0 -10/4/2020,1169.692977,0 -10/5/2020,10725.29123,0 -10/6/2020,5810.316309,0 -10/7/2020,5355.718702,0 -10/8/2020,6212.58739,0 -10/9/2020,9300.728677,0 -10/10/2020,4211.706347,0 -10/11/2020,12547.44295,0 -10/12/2020,4277.432968,0 -10/13/2020,11953.00999,0 -10/14/2020,8678.605484,0 -10/15/2020,672.4406962,0 -10/16/2020,9705.166031,0 -10/17/2020,9043.486519,0 -10/18/2020,1046.909498,0 -10/19/2020,2790.19428,0 -10/20/2020,3495.365385,0 -10/21/2020,2438.197513,0 -10/22/2020,1540.045565,0 -10/23/2020,8600.502935,0 -10/24/2020,8791.752692,0 -10/25/2020,5383.833382,0 -10/26/2020,1591.498905,0 -10/27/2020,1010.539775,0 -10/28/2020,9698.669775,0 -10/29/2020,1374.989733,0 -10/30/2020,4414.102452,0 -10/31/2020,8819.842803,0 -11/1/2020,1946.950342,0 -11/2/2020,4692.967616,0 -11/3/2020,4261.017643,0 -11/4/2020,9857.057228,0 -11/5/2020,4274.0324,0 -11/6/2020,6912.325677,0 -11/7/2020,6668.830447,0 -11/8/2020,9737.241988,0 -11/9/2020,7256.506654,0 -11/10/2020,7653.472117,0 -11/11/2020,8585.680445,0 -11/12/2020,9314.584695,0 -11/13/2020,1865.252085,0 -11/14/2020,7876.612146,0 -11/15/2020,749.4676695,0 -11/16/2020,1182.072197,0 -11/17/2020,2617.910709,0 -11/18/2020,1692.261079,0 -11/19/2020,3009.688824,0 -11/20/2020,3880.780748,0 -11/21/2020,1619.265672,0 -11/22/2020,636.0571262,0 -11/23/2020,1239.421189,0 -11/24/2020,2810.71196,0 -11/25/2020,1408.923576,0 -11/26/2020,3161.493659,0 -11/27/2020,1400.401188,0 -11/28/2020,6223.729101,0 -11/29/2020,7092.984898,0 -11/30/2020,525.9135964,0 -12/1/2020,738.9531896,0 -12/2/2020,3443.963737,0 -12/3/2020,2671.684817,0 -12/4/2020,2070.805424,0 -12/5/2020,3740.91636,0 -12/6/2020,8365.371008,0 -12/7/2020,6790.181934,0 -12/8/2020,7105.36579,0 -12/9/2020,2232.08232,0 -12/10/2020,3141.441706,0 -12/11/2020,4903.094799,0 -12/12/2020,2100.345771,0 -12/13/2020,1320.325044,0 -12/14/2020,2879.842615,0 -12/15/2020,6287.183565,0 -12/16/2020,4293.22747,0 -12/17/2020,7076.177819,0 -12/18/2020,7961.11884,0 -12/19/2020,3048.121544,0 -12/20/2020,2400.199955,0 -12/21/2020,3034.299038,0 -12/22/2020,3356.94441,0 -12/23/2020,3465.008165,0 -12/24/2020,679.2752052,0 -12/25/2020,3427.496553,0 -12/26/2020,3383.54864,0 -12/27/2020,3011.290169,0 -12/28/2020,1545.146501,0 -12/29/2020,3499.133498,0 -12/30/2020,2058.199291,0 -12/31/2020,1635.206888,0 diff --git a/pvanalytics/quality/__init__.py b/pvanalytics/quality/__init__.py index c6e24cf5..7a4c60f6 100644 --- a/pvanalytics/quality/__init__.py +++ b/pvanalytics/quality/__init__.py @@ -4,4 +4,3 @@ from pvanalytics.quality import weather # noqa: F401 from pvanalytics.quality import outliers # noqa: F401 from pvanalytics.quality import time # noqa: F401 -from pvanalytics.quality import data_shifts # noqa: F401 diff --git a/pvanalytics/quality/data_shifts.py b/pvanalytics/quality/data_shifts.py deleted file mode 100644 index 13640bcd..00000000 --- a/pvanalytics/quality/data_shifts.py +++ /dev/null @@ -1,298 +0,0 @@ -""" -Quality tests related to detecting and filtering out data shifts in data -streams. -""" - -from pvanalytics.quality import gaps -import numpy as np -import pandas as pd - - -def _run_data_checks(time_series): - """ - Check that the passed parameters can be run through the function. - This includes checking the passed time series to ensure it has a - datetime index, and that it is a daily sampled time series. - - Parameters - ---------- - time_series : Pandas series with datetime index. - Daily time series of a PV data stream, which can include irradiance - and power data streams. This series represents the summed daily - values of the particular data stream. - - Returns - ------- - None. - """ - # Check that the time series has a datetime index, and consists of numeric - # values - if not isinstance(time_series.index, pd.DatetimeIndex): - raise TypeError('Must be a Pandas series with a datetime index.') - # Check that the time series is sampled on a daily basis. If not, - # throw a ValueError exception - if time_series.index.to_series().diff().value_counts().idxmax().days != 1: - raise ValueError("Time series frequency not daily. Please resample " - "time series to daily summed values.") - return - - -def _erroneous_filter(time_series): - """ - Remove any outliers from the time series. - - Parameters - ---------- - time_series : Pandas series with datetime index. - Daily time series of a PV data stream, which can include irradiance - and power data streams. This series represents the summed daily values - of the particular data stream. - - Returns - ------- - time_series: Pandas series, with a datetime index. - Time series, after filtering out outliers. This includes removal - of stale repeat readings, negative readings, and data greater than - the 99th percentile or less than the 1st percentile. - """ - # Detect and mask stale data - stale_mask = gaps.stale_values_round(time_series, window=6, - decimals=3, mark='tail') - # Mask negative and 0 values - negative_mask = (time_series <= 0) - # Mask the top 1% and bottom 1% of data points - quantile_mask = ((time_series <= time_series.quantile(.01)) | - (time_series >= time_series.quantile(.99))) - # Filter out the associated data by masking - time_series = time_series[(~stale_mask) & (~negative_mask) & - (~quantile_mask)] - return time_series - - -def _preprocess_data(time_series, remove_seasonality): - """ - Pre-process the time series, including the following: - 1. Min-max normalization of the time series. - 2. Removing seasonality from the time series. - - Parameters - ---------- - time_series : Pandas series with datetime index. - Daily time series of a PV data stream, which can include irradiance - and power data streams. This series represents the summed daily values - of the particular data stream. - remove_seasonality: Boolean. - Whether or not to remove seasonality from the time series. If set to - True, the seasonality-removal routine is run on the min-max normalized - data. If not, the routine is skipped. - - Returns - ------- - Pandas series with a datetime index: - Time series, after data processing. This includes min-max - normalization, and, if the time series is in greater than 2 years in - length, seasonality removal. - """ - # Min-max normalize the series - time_series_normalized = (time_series - time_series.min()) \ - / (time_series.max() - time_series.min()) - # Check if the time series is greater than two years in length. If not, - # pass back the normalized time series - if not remove_seasonality: - return time_series_normalized - else: - # Take the median of every day of the year across all years in the - # data, and use this as the seasonality of the time series - month_values = pd.DatetimeIndex(time_series.index).month - day_values = pd.DatetimeIndex(pd.Series(time_series.index)).day - time_series_seasonality = time_series_normalized.groupby([month_values, - day_values])\ - .transform("median") - # Remove seasonality from the time series - return (time_series_normalized - time_series_seasonality) - - -def detect_data_shifts(time_series, - filtering=True, use_default_models=True, - method=None, cost=None, penalty=40): - """ - Detect data shifts in the time series, and return list of dates where these - data shifts occur. - - Parameters - ---------- - time_series : Pandas series with datetime index. - Daily time series of a PV data stream, which can include irradiance - and power data streams. This series represents the summed daily values - of the particular data stream. - filtering : Boolean, default True. - Whether or not to filter out outliers and stale data from the time - series. If True, then this data is filtered out before running the - data shift detection sequence. If False, this data is not filtered - out. Default set to True. - use_default_models: Boolean, default True - If True, then default change point detection search parameters are - used. For time series shorter than 2 years in length, the search - function is `rpt.Window` with `model='rbf'`, `width=40` and - `penalty=30`. For time series 2 years or longer in length, the - search function is `rpt.BottomUp` with `model='rbf'` - and `penalty=40`. - method: ruptures search method instance or None, default None. - Ruptures search method instance. See - https://centre-borelli.github.io/ruptures-docs/user-guide/. - cost: str or None, default None - Cost function passed to the ruptures changepoint search instance. - See https://centre-borelli.github.io/ruptures-docs/user-guide/ - penalty: int, default 40 - Penalty value passed to the ruptures changepoint detection method. - Default set to 40. - - Returns - ------- - Pandas Series - Series of boolean values with a datetime index, where detected - changepoints are labeled as True, and all other values are labeled - as False. - - .. warning:: If the passed time series is less than 2 years in length, - it will not be corrected for seasonality. Data shift detection will - be run on the min-max normalized time series with no seasonality - correction. - - References - ------- - .. [1] Perry K., and Muller, M. "Automated shift detection in sensor-based - PV power and irradiance time series", 2022 IEEE 48th Photovoltaic - Specialists Conference (PVSC). Submitted. - """ - try: - import ruptures as rpt - except ImportError: - raise ImportError("data_shifts() requires ruptures.") - # Run data checks on cleaned data to make sure that the data can be run - # successfully through the routine - _run_data_checks(time_series) - # Run the filtering sequence, if marked as True - if filtering: - time_series_filtered = _erroneous_filter(time_series) - # Drop any duplicated data from the time series - time_series_filtered = time_series_filtered.drop_duplicates() - # Check if the time series is more than 2 years long. If so, remove - # seasonality. If not, run analysis on the normalized time series - if (time_series_filtered.index.max() - - time_series_filtered.index.min()).days <= 730: - time_series_processed = _preprocess_data(time_series_filtered, - remove_seasonality=False) - seasonality_rmv = False - else: - # Perform pre-processing on the time series, to get the - # seasonality-removed time series. - time_series_processed = _preprocess_data(time_series_filtered, - remove_seasonality=True) - seasonality_rmv = True - points = np.array(time_series_processed.dropna()) - # If seasonality has been removed and default model is used, run - # BottomUp method - if (seasonality_rmv) & (use_default_models): - algo = rpt.BottomUp(model='rbf').fit(points) - result = algo.predict(pen=40) - # If there is no seasonality but default model is used, run - # Window-based method - elif (not seasonality_rmv) & (use_default_models): - algo = rpt.Window(model='rbf', - width=50).fit(points) - result = algo.predict(pen=30) - # Otherwise run changepoint detection with the passed parameters - else: - algo = method(model=cost).fit(points) - result = algo.predict(pen=penalty) - # Remove the last index of the time series, if present - if len(points) in result: - result.remove(len(points)) - # Return a list of dates where changepoints are detected - time_series_processed.index.name = "datetime" - mask = pd.Series(False, index=time_series_processed.index) - mask.iloc[result] = True - # Re-index the mask to include any timestamps that were - # filtered out as outliers - mask = mask.reindex(time_series.index, fill_value=False) - return mask - - -def get_longest_shift_segment_dates(time_series, - filtering=True, - use_default_models=True, - method=None, cost=None, - penalty=40, buffer_day_length=7): - """ - Return the start and end dates of the longest continuous time series - segment. During this process, data shift detection is performed, and the - longest time series segment between changepoints is identified, and the - start and end dates of that segment are returned, with a settable buffer - period added to the start date and subtracted from the end date, - to allow for the segment to stabilize (this helps if the - changepoint is detected a few days early or a few days late, - compared to the actual shift date). - - Parameters - ---------- - time_series : Pandas series with datetime index. - Daily time series of a PV data stream, which can include irradiance - and power data streams. This series represents the summed daily values - of the particular data stream. - filtering : Boolean, default True. - Whether or not to filter out outliers and stale data from the time - series. If True, then this data is filtered out before running the - data shift detection sequence. If False, this data is not filtered - out. Default set to True. - use_default_models: Boolean, default True - If True, then default change point detection search parameters are - used. For time series shorter than 2 years in length, the search - function is `rpt.Window` with `model='rbf'`, `width=40` and - `penalty=30`. For time series 2 years or longer in length, the - search function is `rpt.BottomUp` with `model='rbf'` - and `penalty=40`. - method: ruptures search method instance or None, default None. - Ruptures search method instance. See - https://centre-borelli.github.io/ruptures-docs/user-guide/. - cost: str or None, default None - Cost function passed to the ruptures changepoint search instance. - See https://centre-borelli.github.io/ruptures-docs/user-guide/ - penalty: int, default 40 - Penalty value passed to the ruptures changepoint detection method. - Default set to 40. - buffer_day_length: int, default 7 - Number of days to add to the start date and subtract from the - end date of the longest detected data shift-free period. This - buffer period helps to filter out any data that doesn't fit - within the current data segment. This issue occurs when the - changepoint is detected a few days early or late compared - to the actual data shift date. - - Returns - ------- - passing_dates_dict: Dictionary. - Dictionary object containing the longest continuous time segment - with no detected data shifts. The start date of the period is - represented in the "start_date" field, and the end date of the - period is represented in the "end_date" field. - - References - ------- - .. [1] Perry K., and Muller, M. "Automated shift detection in sensor-based - PV power and irradiance time series", 2022 IEEE 48th Photovoltaic - Specialists Conference (PVSC). Submitted. - """ - # Detect indices where data shifts occur - cpd_mask = detect_data_shifts(time_series, filtering, - use_default_models, - method, cost, penalty) - interval_id = cpd_mask.cumsum() - longest_interval_id = interval_id.value_counts().idxmax() - index = interval_id.index[interval_id == longest_interval_id] - # Add a week-long buffer for the start and end dates - passing_dates_dict = {'start_date': index.min() + - pd.DateOffset(days=buffer_day_length), - 'end_date': index.max() - - pd.DateOffset(days=buffer_day_length)} - return passing_dates_dict diff --git a/pvanalytics/tests/conftest.py b/pvanalytics/tests/conftest.py index ab8cb653..ccfb55ff 100644 --- a/pvanalytics/tests/conftest.py +++ b/pvanalytics/tests/conftest.py @@ -5,11 +5,8 @@ import pvlib from pvlib import location, pvsystem from pvlib.temperature import TEMPERATURE_MODEL_PARAMETERS -from pathlib import Path -from pkg_resources import Requirement, parse_version -TEST_DIR = Path(__file__).parent -DATA_DIR = TEST_DIR.parent / 'data' +from pkg_resources import Requirement, parse_version def pytest_addoption(parser): diff --git a/pvanalytics/tests/quality/test_data_shifts.py b/pvanalytics/tests/quality/test_data_shifts.py deleted file mode 100644 index 4b6927ee..00000000 --- a/pvanalytics/tests/quality/test_data_shifts.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Tests for data shift quality control functions.""" -import pandas as pd -import pytest -from pvanalytics.quality import data_shifts as dt -from ..conftest import DATA_DIR -import ruptures - -test_file_1 = DATA_DIR / "pvlib_data_shift.csv" - -@pytest.fixture -def generate_time_series(): - # Pull down the saved PVLib dataframe and process it - df = pd.read_csv(test_file_1) - signal_no_index = df['value'] - df.index = pd.to_datetime(df['timestamp']) - signal_datetime_index = df['value'] - changepoint_date = df[df['label'] == 1].index[0] - df_weekly_resample = df.resample('W').median()['value'] - return (signal_no_index, signal_datetime_index, - df_weekly_resample, changepoint_date) - - -def requires_ruptures(test): - """Skip `test` if ruptures is not installed.""" - try: - import ruptures # noqa: F401 - has_ruptures = True - except ImportError: - has_ruptures = False - return pytest.mark.skipif( - not has_ruptures, reason="requires ruptures")(test) - - -@requires_ruptures -def test_detect_data_shifts(generate_daily_time_series): - """ - Unit test that data shifts are correctly identified in the simulated time - series. - """ - signal_no_index, signal_datetime_index, df_weekly_resample, \ - changepoint_date = generate_daily_time_series - # Test that an error is thrown when a Pandas series with no datetime - # index is passed - pytest.raises(TypeError, dt.detect_data_shifts, signal_no_index) - # Test that an error is thrown when an incorrect ruptures method is passed - pytest.raises(TypeError, dt.detect_data_shifts, signal_datetime_index, - True, False, "Pelt") - # Test that an error is thrown when weekly data is passed - pytest.raises(ValueError, dt.detect_data_shifts, df_weekly_resample) - # Test that an error is thrown when an incorrect string is passed as the - # cost variable - pytest.raises(ValueError, dt.detect_data_shifts, signal_datetime_index, - True, False, ruptures.Binseg, "none") - # Test that a data shift is successfully detected within 5 days of - # inserted changepoint - shift_index = dt.detect_data_shifts(time_series=signal_datetime_index) - shift_index_dates = list(shift_index[shift_index].index) - # Test that the column name is handled if a series with no name is passed - signal_unnamed = signal_datetime_index.rename(None) - shift_index_unnamed = dt.detect_data_shifts(signal_unnamed) - shift_index_unnamed_dates = list( - shift_index_unnamed[shift_index_unnamed].index) - # Run model with manually entered parameters - shift_index_param = dt.detect_data_shifts(signal_datetime_index, True, - False, ruptures.BottomUp, "rbf") - shift_index_param_dates = list( - shift_index_param[shift_index_param].index) - assert (abs((changepoint_date - shift_index_dates[0]).days) <= 5) - assert (abs((changepoint_date - shift_index_unnamed_dates[0]).days) <= 5) - assert (abs((changepoint_date - shift_index_param_dates[0]).days) <= 5) - assert (len(shift_index_param.index) == len(signal_datetime_index.index)) - - -def test_filter_data_shifts(generate_daily_time_series): - """ - Unit test that the longest interval between data shifts is selected for - the simulated daily time series data set. - """ - signal_no_index, signal_datetime_index, df_weekly_resample, \ - changepoint_date = generate_daily_time_series - # Run the time series where there are no changepoints - interval_dict_short = dt.get_longest_shift_segment_dates( - time_series=signal_datetime_index[:100]) - # Run the time series where there is a changepoint - interval_dict = dt.get_longest_shift_segment_dates( - time_series=signal_datetime_index) - assert (interval_dict['start_date'] == pd.to_datetime('2015-11-06')) & \ - (interval_dict['end_date'] == pd.to_datetime('2020-12-24')) - assert (interval_dict_short['start_date'] == - signal_datetime_index.index.min()+pd.DateOffset(days=7)) & \ - (interval_dict_short['end_date'] == - signal_datetime_index[:100].index.max()-pd.DateOffset(days=7))