From 6b8f4eac4e3f4feae3e68e52d1e15a08fcd39144 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 8 Jan 2021 13:55:23 -0700 Subject: [PATCH 01/15] Replace xlrd with openpyxl to read excel files through pandas --- ci/requirements-py36.yml | 2 +- ci/requirements-py37.yml | 2 +- ci/requirements-py38.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ci/requirements-py36.yml b/ci/requirements-py36.yml index 595faa2..7738d6d 100644 --- a/ci/requirements-py36.yml +++ b/ci/requirements-py36.yml @@ -12,7 +12,7 @@ dependencies: - pvlib - plotly - ephem - - xlrd + - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file diff --git a/ci/requirements-py37.yml b/ci/requirements-py37.yml index 34d804a..9bf6d4e 100644 --- a/ci/requirements-py37.yml +++ b/ci/requirements-py37.yml @@ -12,7 +12,7 @@ dependencies: - pvlib - plotly - ephem - - xlrd + - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file diff --git a/ci/requirements-py38.yml b/ci/requirements-py38.yml index 6859532..b089cb8 100644 --- a/ci/requirements-py38.yml +++ b/ci/requirements-py38.yml @@ -12,7 +12,7 @@ dependencies: - pvlib - plotly - ephem - - xlrd + - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file From 7bc01aaa56b45518bd50e8d3263a6a55b7941b05 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 8 Jan 2021 13:56:41 -0700 Subject: [PATCH 02/15] Pass min_failure to outlier streaming test --- README.md | 2 +- pecos/monitoring.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3fad313..7c575df 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ ![Pecos](documentation/figures/logo.png) -======================================= +========================================= [![TravisCI](https://travis-ci.org/sandialabs/pecos.svg?branch=master)](https://travis-ci.org/sandialabs/pecos) [![Coverage Status](https://coveralls.io/repos/github/sandialabs/pecos/badge.svg?branch=master)](https://coveralls.io/github/sandialabs/pecos?branch=master) diff --git a/pecos/monitoring.py b/pecos/monitoring.py index 90e4056..70f3bb3 100644 --- a/pecos/monitoring.py +++ b/pecos/monitoring.py @@ -666,7 +666,7 @@ def outlier(data_pt, history): error_prefix = 'Outlier' if streaming: - metadata = self.check_custom_streaming(outlier, window, rebase=0.5, error_message=error_prefix) + metadata = self.check_custom_streaming(outlier, window, rebase=0.5, min_failures=min_failures, error_message=error_prefix) else: # Compute normalized data if window is not None: From c854c22f8acc06566d7644a0e78dad31771d3c6e Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 10:26:01 -0700 Subject: [PATCH 03/15] Removed pecos logo from monitoring reports --- pecos/io.py | 8 -------- pecos/templates/base.html | 2 +- pecos/templates/monitoring_report.tex | 6 +++++- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/pecos/io.py b/pecos/io.py index beb18d4..dd1bcaf 100644 --- a/pecos/io.py +++ b/pecos/io.py @@ -308,8 +308,6 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], if metrics is None: metrics = pd.DataFrame() - pecos_logo = join(dirname(pecos.__file__), '..', 'documentation', 'figures', 'logo.png') - content = {'start_time': str(start_time), 'end_time': str(end_time), 'num_notes': str(notes_df.shape[0]), @@ -323,7 +321,6 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], if file_format == 'html': content['test_results_graphics'] = test_results_graphics content['custom_graphics'] = custom_graphics - content['pecos_logo'] = pecos_logo if isinstance(metrics, pd.Series): metrics_html = metrics.to_frame().to_html(header=False) @@ -343,11 +340,9 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], else: test_results_graphics = [g.replace('\\', '/') for g in test_results_graphics] custom_graphics = [g.replace('\\', '/') for g in custom_graphics] - pecos_logo = pecos_logo.replace('\\', '/') content['test_results_graphics'] = test_results_graphics content['custom_graphics'] = custom_graphics - content['pecos_logo'] = pecos_logo content['metrics'] = metrics.to_latex(longtable=True) content['test_results'] = test_results.to_latex(longtable=True) @@ -477,9 +472,6 @@ def _html_template_monitoring_report(content, title, logo, im_width_test_results for im in content['test_results_graphics']: img_encode = base64.b64encode(open(im, "rb").read()).decode("utf-8") img_dic[im] = img_encode - im = content['pecos_logo'] - img_encode = base64.b64encode(open(im, "rb").read()).decode("utf-8") - img_dic[im] = img_encode template = env.get_template('monitoring_report.html') diff --git a/pecos/templates/base.html b/pecos/templates/base.html index a156d3e..3eed23d 100644 --- a/pecos/templates/base.html +++ b/pecos/templates/base.html @@ -7,7 +7,7 @@ {% block body %} -
Report generated by Pecos
+
Report generated by Pecos
Version {{ version }}, Date {{ datestr }} {% endblock %} diff --git a/pecos/templates/monitoring_report.tex b/pecos/templates/monitoring_report.tex index 7d765c3..a4e1cc1 100644 --- a/pecos/templates/monitoring_report.tex +++ b/pecos/templates/monitoring_report.tex @@ -45,7 +45,11 @@ {% if content['num_metrics']|int > 0 %} \textbf{\Large{Performance Metrics}} + + \vspace{0.1in} + \small{\centering{ {{ content['metrics'] }} + }} {% endif %} \textbf{\Large{Test Results}} @@ -77,7 +81,7 @@ \underline{\hspace{\linewidth}} \footnotesize{ -Report generated by \href{https://pecos.readthedocs.io/}{\includegraphics[height=0.26cm]{% raw -%}{{%- endraw %}{{content['pecos_logo']}}{% raw -%}}{%- endraw %} } +Report generated by \href{https://github.com/sandialabs/pecos}{Pecos} Version {{ version }}, Date {{ datestr }} } From 24eb3c836e4fc318e4f3b6b81c89a3419e43ccd6 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 12:16:21 -0700 Subject: [PATCH 04/15] Debug tests run on travis --- pecos/tests/test_monitoring.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pecos/tests/test_monitoring.py b/pecos/tests/test_monitoring.py index 599d43e..98f852d 100644 --- a/pecos/tests/test_monitoring.py +++ b/pecos/tests/test_monitoring.py @@ -105,6 +105,10 @@ def test_check_timestamp(self): # Object-oriented test test_results = self.pm.test_results + print() + print(test_results) + print() + print(expected) assert_frame_equal(test_results, expected, check_dtype=False) # Functional test @@ -121,6 +125,10 @@ def test_check_missing(self): # Object-oriented test self.pm.check_missing() test_results = self.pm.test_results[self.pm.test_results['Error Flag'] == 'Missing data'] + print() + print(self.pm.test_results) + print() + print(expected) assert_frame_equal(test_results.reset_index(drop=True), expected, check_dtype=False) # Functional test From 63936ebfb4a54824c082bacb3481c6c34e5b2f39 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 12:51:01 -0700 Subject: [PATCH 05/15] Debug tests run on travis --- pecos/tests/test_monitoring.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pecos/tests/test_monitoring.py b/pecos/tests/test_monitoring.py index 98f852d..f09e57a 100644 --- a/pecos/tests/test_monitoring.py +++ b/pecos/tests/test_monitoring.py @@ -106,6 +106,8 @@ def test_check_timestamp(self): # Object-oriented test test_results = self.pm.test_results print() + print(self.pm.data) + print() print(test_results) print() print(expected) From 8e743319964a197cc8aa896ccd82bde7e65f9103 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 13:16:00 -0700 Subject: [PATCH 06/15] changed excel example file to csv --- examples/simple/simple.csv | 97 ++++++++++++++++++++++++++++++++++ pecos/tests/test_monitoring.py | 16 +++--- 2 files changed, 105 insertions(+), 8 deletions(-) create mode 100644 examples/simple/simple.csv diff --git a/examples/simple/simple.csv b/examples/simple/simple.csv new file mode 100644 index 0000000..7552ea1 --- /dev/null +++ b/examples/simple/simple.csv @@ -0,0 +1,97 @@ +,A,B,C,D +1/1/2015 0:00,0.00,0.429793393,0,-0.035103303 +1/1/2015 0:15,0.01,0.510237161,0.103978389,0.109096969 +1/1/2015 0:30,0.02,0.460397817,0.20682956,0.187028468 +1/1/2015 0:45,0.03,0.62928264,0.307438515,0.372079834 +1/1/2015 1:00,0.04,0.111771863,0.404714563,0.210600495 +1/1/2015 1:15,0.05,0.647281193,0.497603148,0.571243744 +1/1/2015 1:30,0.06,0.424915498,0.585097273,0.547555022 +1/1/2015 1:45,0.07,0.1707199,0.666248425,0.501608375 +1/1/2015 2:00,0.08,0.810439948,0.740176853,0.895396827 +1/1/2015 2:15,0.09,0.912303974,0.806081108,1.012233095 +1/1/2015 2:30,0.10,0.87598201,0.863246729,1.051237735 +1/1/2015 2:45,0.11,0.161385063,0.911053991,0.741746522 +1/1/2015 3:00,0.12,0.672271076,0.948984619,1.035120157 +1/1/2015 3:15,0.14,0.772940816,0.976627413,1.113097821 +1/1/2015 3:30,0.15,0.687847121,0.9936827,1.08760626 +1/1/2015 3:45,0.16,0.38357856,0.999965586,0.941754866 +1/1/2015 4:00,0.17,0.740154063,0.995407958,1.11548499 +1/1/2015 4:15,0.18,0.451618353,0.980059225,0.955868402 +1/1/2015 4:30,0.19,0.949575356,0.954085782,1.17887346 +1/1/2015 4:45,0.20,0.687189909,0.917769203,1.011364157 +1/1/2015 5:15,0.22,0.601406805,0.815789314,0.866492716 +1/1/2015 5:30,0.23,0.680165564,0.751231556,0.841314338 +1/1/2015 5:45,0.24,0.522002065,0.678529782,0.689530815 +1/1/2015 6:00,0.25,0.015504149,0.598472145,0.356224219 +1/1/2015 6:15,0.26,0.772375249,0.511926538,0.648114163 +1/1/2015 6:30,0.27,-0.001,0.419831194,0.171936862 +1/1/2015 6:45,0.28,0.559056037,0.323184508,0.352712526 +1/1/2015 7:00,0.29,0.847987577,0.223034215,0.397028003 +1/1/2015 7:15,0.30,0.621564606,0.120466033,0.181248336 +1/1/2015 7:30,0.31,0.7372716,-999,0.135227693 +1/1/2015 7:45,0.32,0.316489709,-999,-0.179217263 +1/1/2015 8:00,0.33,0.785302493,-999,-0.047916716 +1/1/2015 8:15,0.34,0.579974315,-999,-0.251620723 +1/1/2015 8:30,0.35,0.345476747,-999,-0.466748138 +1/1/2015 8:45,0.36,0.350357633,-999,-0.557963946 +1/1/2015 9:00,0.37,0.559362238,-999,-0.541880199 +1/1/2015 9:15,0.39,0.205868519,-999,-0.800849383 +1/1/2015 9:30,0.40,0.793399286,-999,-0.582218729 +1/1/2015 9:45,0.41,0.581206564,-0.796150981,-0.755547699 +1/1/2015 10:00,0.42,0.88546213,-0.854752607,-0.662021542 +1/1/2015 10:15,0.43,0.862051747,-0.904087957,-0.723062084 +1/1/2015 10:30,0.44,0.69936246,-0.943622192,-0.843940962 +1/1/2015 10:45,0.45,0.736740858,-0.972926726,-0.854556297 +1/1/2015 11:00,0.46,0.506848318,-0.991683872,-0.988259713 +1/1/2015 11:15,0.47,0.403798294,-0.999690285,-1.047791138 +1/1/2015 11:30,0.48,0.535661908,-0.99685917,-0.979028216 +1/1/2015 11:45,0.49,0.862132565,-0.983221217,-0.802154935 +1/1/2015 12:00,0.50,0.883275665,-0.958924275,-0.767286442 +1/1/2015 12:15,0.50,0.786830248,-0.924231744,-0.780816619 +1/1/2015 12:30,0.50,0.427837005,-0.879519721,-0.915601218 +1/1/2015 12:45,0.50,0.021097359,-0.825272924,-1.064724245 +1/1/2015 13:00,0.50,0.073028713,-0.112079438,-0.975565081 +1/1/2015 13:15,0.50,0.328392757,-0.090624334,-0.776427956 +1/1/2015 13:30,0.50,0.373087924,-0.061682251,-0.675138289 +1/1/2015 13:45,0.50,0.618797188,-0.02610899,-0.466710396 +1/1/2015 14:00,0.50,0.570540234,0.015167759,-0.399562124 +1/1/2015 14:15,0.50,0.565068395,0.061158475,-0.306307327 +1/1/2015 14:30,0.50,0.981633604,0.110822534,0.001639335 +1/1/2015 14:45,0.61,0.906677808,0.163079488,0.066418392 +1/1/2015 15:00,0.62,0.956760766,0.216820782,0.195201165 +1/1/2015 15:15,0.64,0.015060399,0.270921768,-0.171548032 +1/1/2015 15:30,0.65,1.001,0.324253899,0.421727402 +1/1/2015 15:45,0.66,0.2512004,0.375696964,0.151297164 +1/1/2015 16:00,0.67,0.643948326,0.424151229,0.446125392 +1/1/2015 16:15,0.68,0.84826817,0.468549363,0.642683448 +1/1/2015 16:30,0.69,0.908221965,0.557868007,0.761978989 +1/1/2015 16:45,0.70,0.048439506,0.641138867,0.41535862 +1/1/2015 17:00,0.71,0.181077653,0.717459213,0.557998039 +1/1/2015 17:00,0.71,0.771620858,0.717459213,0.853269642 +1/1/2015 17:15,0.72,0.088979337,0.786001665,0.580491334 +1/1/2015 17:30,0.73,0.363817745,0.846023162,0.777932035 +1/1/2015 17:45,0.74,0.648708326,0.896873019, +1/1/2015 18:00,0.75,0.832214314,0.937999976, +1/1/2015 18:15,0.76,0.694004841,0.968958183, +1/1/2015 18:30,0.77,0.568827238,0.989412023,1.023825642 +1/1/2015 18:45,0.78,0.753781269,0.99913976,1.126030395 +1/1/2015 19:00,0.79,0.178798582,0.998035937,0.837435228 +1/1/2015 19:15,0.80,0.541904069,0.986112519,1.007064553 +1/1/2015 19:45,0.82,0.722501127,0.930439834,1.041690398 +1/1/2015 19:30,0.81,0.678701932,0.963498767,1.052849733 +1/1/2015 20:00,0.83,0.102360557,0.887294109,0.688474387 +1/1/2015 20:15,0.84,0.140058519,0.834529329,0.654558588 +1/1/2015 20:30,0.85,0.23017013,0.772717511,0.637802576 +1/1/2015 20:45,0.86,0.085699622,0.70252875,0.495378561 +1/1/2015 21:00,0.87,0.742430465,0.624723955,0.745939188 +1/1/2015 21:15,0.89,0.897746216,0.540146599,0.739019707 +1/1/2015 21:30,0.90,0.062808732,0.449713574,0.23111794 +1/1/2015 21:45,0.91,0.153075676,0.354405256,0.180943093 +1/1/2015 22:00,0.92,0.576533359,0.25525487,0.293521549 +1/1/2015 22:15,0.93,0.003205705,0.153337295,-0.095059852 +1/1/2015 22:30,0.94,0.71136348,0.049757408,0.155439148 +1/1/2015 22:45,0.95,0.951160038,-0.054361893,0.171218126 +1/1/2015 23:00,0.96,0.028180644,-0.157891863,-0.393801541 +1/1/2015 23:15,0.97,0.154533482,-0.259710145,-0.432443404 +1/1/2015 23:30,0.98,0.543068484,-0.35871294,-0.337178698 +1/1/2015 23:45,0.99,0.585191477,-0.453826968,-0.411231229 diff --git a/pecos/tests/test_monitoring.py b/pecos/tests/test_monitoring.py index f09e57a..e2ec29c 100644 --- a/pecos/tests/test_monitoring.py +++ b/pecos/tests/test_monitoring.py @@ -77,9 +77,9 @@ def setUp(self): 'Random': ['B'], 'Wave': ['C','D']} - file_name = join(simpleexampledir,'simple.xlsx') + file_name = join(simpleexampledir,'simple.csv') - self.raw_data = pd.read_excel(file_name, index_col=0) + self.raw_data = pd.read_csv(file_name, index_col=0, parse_dates=True) self.pm = pecos.monitoring.PerformanceMonitoring() self.pm.add_dataframe(self.raw_data) self.pm.add_translation_dictionary(trans) @@ -274,8 +274,8 @@ def test_composite_signal(self): assert_frame_equal(temp, expected, check_dtype=False) def test_full_example(self): - data_file = join(simpleexampledir,'simple.xlsx') - df = pd.read_excel(data_file, index_col=0) + data_file = join(simpleexampledir,'simple.csv') + df = pd.read_csv(data_file, index_col=0, parse_dates=True) QCI = simple_example_run_analysis(df) @@ -294,8 +294,8 @@ def test_full_example(self): assert_frame_equal(actual, expected, check_dtype=False) def test_millisecond_timestamp(self): - data_file = join(simpleexampledir,'simple.xlsx') - df = pd.read_excel(data_file, index_col=0) + data_file = join(simpleexampledir,'simple.csv') + df = pd.read_csv(data_file, index_col=0, parse_dates=True) index = pecos.utils.datetime_to_elapsedtime(df.index) df.index = index/1e5 # millisecond resolution @@ -318,8 +318,8 @@ def test_millisecond_timestamp(self): assert_frame_equal(pm.test_results, expected, check_dtype=False) def test_full_example_with_timezone(self): - data_file = join(simpleexampledir,'simple.xlsx') - df = pd.read_excel(data_file, index_col=0) + data_file = join(simpleexampledir,'simple.csv') + df = pd.read_csv(data_file, index_col=0, parse_dates=True) df.index = df.index.tz_localize('MST') QCI = simple_example_run_analysis(df) From a313bc6f5c806b5d84d7d648ee9e25bd71d7c45f Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 15:29:53 -0700 Subject: [PATCH 07/15] Change example files from excel to csv --- .../System1_2015_performance_metrics.csv | 399 ++++++++++++++++++ .../System1_2015_performance_metrics.xlsx | Bin 42414 -> 0 bytes examples/metrics/metrics_example.py | 8 +- examples/simple/simple.xlsx | Bin 26560 -> 0 bytes examples/simple/simple_example.py | 8 +- .../simple/simple_example_using_config.py | 4 +- 6 files changed, 409 insertions(+), 10 deletions(-) create mode 100644 examples/metrics/System1_2015_performance_metrics.csv delete mode 100644 examples/metrics/System1_2015_performance_metrics.xlsx delete mode 100644 examples/simple/simple.xlsx diff --git a/examples/metrics/System1_2015_performance_metrics.csv b/examples/metrics/System1_2015_performance_metrics.csv new file mode 100644 index 0000000..507fa11 --- /dev/null +++ b/examples/metrics/System1_2015_performance_metrics.csv @@ -0,0 +1,399 @@ +,Quality Control Index,Performance Ratio +1/1/2015,0.955603448,0.88984202 +1/2/2015,0.947868585,0.889105932 +1/3/2015,0.954879423,0.934635912 +1/4/2015,0.957177539,0.927932798 +1/5/2015,0.951231527,0.938031582 +1/6/2015,0.953568876,0.912235587 +1/7/2015,0.944343228,0.857848913 +1/8/2015,0.956276039,0.907509256 +1/9/2015,0.958430836,0.910073157 +1/10/2015,0.959373761,0.898035104 +1/11/2015,0.953569075,0.868802475 +1/12/2015,0.961491336,0.857900582 +1/13/2015,0.958336971,0.852716219 +1/14/2015,0.95321752,0.849064364 +1/15/2015,0.957264772,0.875677399 +1/16/2015,0.961909083,0.856211057 +1/17/2015,0.96112069,0.838436043 +1/18/2015,0.960701694,0.830289753 +1/19/2015,0.959134718,0.860527002 +1/20/2015,0.948788617,0.845570524 +1/21/2015,0.938365799,0.869293438 +1/22/2015,0.951443514,0.869310363 +1/23/2015,0.953005047,0.890299422 +1/24/2015,0.959530358,0.874913574 +1/25/2015,0.959355084,0.893494607 +1/26/2015,0.9481285,0.89083644 +1/27/2015,0.958881095,0.848866169 +1/28/2015,0.954770185,0.853872819 +1/29/2015,0.951745037,0.854456812 +1/30/2015,0.952528875,0.876158873 +1/31/2015,0.957052535,0.865836294 +2/1/2015,0.953939998,0.888252343 +2/2/2015,0.959321121,0.875873501 +2/3/2015,0.95257587,0.840309753 +2/4/2015,0.946027883,0.918899538 +2/5/2015,0.952004285,0.837994215 +2/6/2015,0.954009289,0.828956141 +2/7/2015,0.949321415,0.827040204 +2/8/2015,0.955348723,0.83750544 +2/9/2015,0.948316767,0.853874125 +2/10/2015,0.94684589,0.906763648 +2/11/2015,0.945626478,0.933681628 +2/12/2015,0.95375805,0.918462844 +2/13/2015,0.958075797,0.869106525 +2/14/2015,0.960379351,0.848367625 +2/15/2015,0.953752535,0.877266361 +2/16/2015,0.962052757,0.889239746 +2/17/2015,0.960559333,0.874806435 +2/18/2015,0.942710863,0.845447313 +2/19/2015,0.955091752,0.84972823 +2/20/2015,0.958419036,0.846411316 +2/21/2015,0.942253464,0.871887895 +2/22/2015,0.956050596,0.842993061 +2/23/2015,0.957429687,0.854355761 +2/24/2015,0.942240373,0.878581623 +2/25/2015,0.951977628,0.845808362 +2/26/2015,0.958664898,0.85785912 +2/27/2015,0.955590387,0.85620158 +2/28/2015,0.953801945,0.880221098 +3/1/2015,0.959435591,0.851972294 +3/2/2015,0.945743911,0.827832066 +3/3/2015,0.956735793,0.835745151 +3/4/2015,0.942890443,0.837258788 +3/5/2015,0.957439113,0.848375424 +3/6/2015,0.956544482,0.853414197 +3/7/2015,0.960286485,0.849863398 +3/8/2015,0.959059268,0.880561063 +3/9/2015,0.946442958,0.880396984 +3/10/2015,0.950128908,0.893196744 +3/11/2015,0.956261343,0.837964024 +3/12/2015,0.939241783,0.81373208 +3/13/2015,0.95752241,0.845145289 +3/14/2015,0.95948074,0.840341192 +3/15/2015,0.94726523,0.918257259 +3/16/2015,0.960276024,0.845167859 +3/17/2015,0.961789376,0.832255072 +3/18/2015,0.956511156,0.835863326 +3/19/2015,0.951545429,0.866489756 +3/20/2015,0.953114834,0.89731324 +3/21/2015,0.960238852,0.837875719 +3/22/2015,0.958078585,0.821832048 +3/23/2015,0.959457254,0.823272711 +3/24/2015,0.96150857,0.82358776 +3/25/2015,0.956168765,0.830886558 +3/26/2015,0.950102627,0.854740679 +3/27/2015,0.960646911,0.855322004 +3/28/2015,0.956032425,0.846845848 +3/29/2015,0.950523841,0.837161648 +3/30/2015,0.951438849,0.831086286 +3/31/2015,0.957311008,0.817254529 +4/1/2015,0.950848583,0.838854148 +4/2/2015,0.955534296,0.833447251 +4/3/2015,0.952232217,0.839440063 +4/4/2015,0.948818569,0.846374807 +4/5/2015,0.952753599,0.825059841 +4/6/2015,0.953246917,0.820025768 +4/7/2015,0.953784693,0.815590918 +4/8/2015,0.95866706,0.813633092 +4/9/2015,0.960023665,0.809461313 +4/10/2015,0.95043633,0.836969679 +4/11/2015,0.952756073,0.809628793 +4/12/2015,0.94916986,0.831333275 +4/13/2015,0.958326221,0.831298752 +4/14/2015,0.958278004,0.82841677 +4/15/2015,0.948919998,0.822344237 +4/16/2015,0.951590684,0.838209497 +4/17/2015,0.947045876,0.836494749 +4/18/2015,0.958737654,0.836102212 +4/19/2015,0.956592548,0.870002128 +4/20/2015,0.958367845,0.828813402 +4/21/2015,0.9546648,0.83210756 +4/22/2015,0.942243573,0.86816181 +4/23/2015,0.953971675,0.832449983 +4/24/2015,0.950704225,0.836848936 +4/25/2015,0.952149086,0.843259953 +4/26/2015,0.958429613,0.842260217 +4/27/2015,0.960304731,0.833541751 +4/28/2015,0.961961626,0.825185328 +4/29/2015,0.962714676,0.818851296 +4/30/2015,0.960655443,0.829846172 +5/1/2015,0.956467774,0.822117477 +5/2/2015,0.948003987,0.822152667 +5/3/2015,0.960051018,0.825478598 +5/4/2015,0.960287737,0.829936802 +5/5/2015,0.95368672,0.827291085 +5/6/2015,0.953356322,0.839831041 +5/7/2015,0.959677792,0.839137326 +5/8/2015,0.953582684,0.851424984 +5/9/2015,0.961073107,0.832867065 +5/10/2015,0.957118193,0.845547135 +5/11/2015,0.956498313,0.81971196 +5/12/2015,0.948934469,0.825129913 +5/13/2015,0.959872461,0.823849271 +5/14/2015,0.959232557,0.82587655 +5/15/2015,0.949799962,0.838992696 +5/16/2015,0.963269406,0.830256502 +5/17/2015,0.962711621,0.827884042 +5/18/2015,0.962988827,0.824407916 +5/19/2015,0.959544421,0.821815418 +5/20/2015,0.944754735,0.835170071 +5/21/2015,0.953917163,0.821046009 +5/22/2015,0.948521116,0.88221502 +5/23/2015,0.958261597,0.84099738 +5/24/2015,0.957835194,0.855898814 +5/25/2015,0.944182585,0.851467438 +5/26/2015,0.951166035,0.825037337 +5/27/2015,0.963440268,0.845874206 +5/28/2015,0.963604329,0.838743999 +5/29/2015,0.964101527,0.83379854 +5/30/2015,0.963083164,0.834163825 +5/31/2015,0.951204604,0.846379321 +6/1/2015,0.95231761,0.871698771 +6/2/2015,0.960146976,0.877402289 +6/3/2015,0.958331179,0.862665835 +6/4/2015,0.963595762,0.857098556 +6/5/2015,0.962387188,0.875841131 +6/6/2015,0.959621633,0.881512653 +6/7/2015,0.964569624,0.876603853 +6/8/2015,0.964327269,0.878138435 +6/9/2015,0.955103342,0.860741859 +6/10/2015,0.946674496,0.820869331 +6/11/2015,0.93135625,0.778601657 +6/12/2015,0.954903017,0.900309103 +6/13/2015,0.960827369,0.946532662 +6/14/2015,0.961077518,0.90345114 +6/15/2015,0.963711002,0.892141599 +6/16/2015,0.957747639,0.890970632 +6/17/2015,0.949381079,0.893352116 +6/18/2015,0.954689322,0.859875538 +6/19/2015,0.962085705,0.899060683 +6/20/2015,0.929237336,0.807726458 +6/21/2015,0,NaN +6/22/2015,0.956612976,0.901117064 +6/23/2015,0.9619324,0.887168348 +6/24/2015,0.952371406,0.867343995 +6/25/2015,0.950204364,0.885327631 +6/26/2015,0.957664445,0.909412447 +6/27/2015,0.942038366,0.823843668 +6/28/2015,0.962855622,0.955219464 +6/29/2015,0.944292509,0.881780069 +6/30/2015,0.951742067,0.888348996 +7/1/2015,0.942508711,0.869778902 +7/2/2015,0.951572898,0.886598035 +7/3/2015,0.956623361,0.928004193 +7/4/2015,0.942905096,0.825223034 +7/5/2015,0.957710984,0.922591297 +7/6/2015,0.96351243,0.946035735 +7/7/2015,0.942311277,0.815860017 +7/8/2015,0.943380932,0.855876257 +7/9/2015,0.949469254,0.879717142 +7/10/2015,0.959181744,0.938020728 +7/11/2015,0.936771045,0.809124131 +7/12/2015,0.955906769,0.929097681 +7/13/2015,0.954813485,0.887826939 +7/14/2015,0.963809217,0.920728441 +7/15/2015,0.953039927,0.871147349 +7/16/2015,0.932110032,0.757576923 +7/17/2015,0.953028714,0.912931487 +7/18/2015,0.959220676,0.938242935 +7/19/2015,0.964623734,0.939823279 +7/20/2015,0.959180951,0.91100229 +7/21/2015,0.95587546,0.896097195 +7/22/2015,0.935883621,0.753288446 +7/23/2015,0.928093306,0.659013358 +7/24/2015,0.941950622,0.765564899 +7/25/2015,0.956280788,0.918438204 +7/26/2015,0.961490811,0.948445815 +7/27/2015,0.964066063,0.948361605 +7/28/2015,0.964927496,0.949420224 +7/29/2015,0.956582438,0.803374759 +7/30/2015,0.961206897,0.918846802 +7/31/2015,0.960298992,0.987915933 +8/1/2015,0.95043546,0.926331718 +8/2/2015,0.960113758,0.962618331 +8/3/2015,0.952166774,0.89620742 +8/4/2015,0.953663793,0.995555958 +8/5/2015,0.957548224,0.936421414 +8/6/2015,0.051724138,NaN +8/7/2015,0.96368066,1.790901545 +8/8/2015,0.963338592,1.246571592 +8/9/2015,0.931185062,0.79259661 +8/10/2015,0.873651249,NaN +8/11/2015,0.922035693,1.14946554 +8/12/2015,0.870178098,NaN +8/13/2015,0.916907185,0.357029371 +8/14/2015,0.957790972,0.961172415 +8/15/2015,0.95113671,0.876426168 +8/16/2015,0.957524549,0.852764764 +8/17/2015,0.944766555,0.829971978 +8/18/2015,0.919068736,0.693887664 +8/19/2015,0.956686291,0.894970487 +8/20/2015,0.964523282,1.078456497 +8/21/2015,0.959118774,1.042923074 +8/22/2015,0.961312027,0.934670534 +8/23/2015,0.935889594,0.596605169 +8/24/2015,0.939483141,0.756717504 +8/25/2015,0.948314007,0.816187316 +8/26/2015,0.947587736,0.944956782 +8/27/2015,0.950869698,0.811201577 +8/28/2015,0.949722159,0.948279566 +8/29/2015,0.948921464,0.955899414 +8/30/2015,0.965365669,0.995223905 +8/31/2015,0.94646098,0.857457365 +9/1/2015,0.957669962,0.935662681 +9/2/2015,0.946130101,0.942754689 +9/3/2015,0.953797611,0.902298551 +9/4/2015,0.930472264,0.735346276 +9/5/2015,0.953399656,0.843335678 +9/6/2015,0.960927004,0.944816178 +9/7/2015,0.95903776,0.941271561 +9/8/2015,0.933444568,0.748459519 +9/9/2015,0.953492674,0.942365966 +9/10/2015,0.957466363,0.973430488 +9/11/2015,0.957483492,0.881394541 +9/12/2015,0.923054396,0.351520795 +9/13/2015,0.952358387,0.134664704 +9/14/2015,0.95972182,0.548744927 +9/15/2015,0.963709969,1.027038642 +9/16/2015,0.945504283,0.933758228 +9/17/2015,0.963692946,0.989419348 +9/18/2015,0.957199971,0.956405149 +9/19/2015,0.895806726,0.029412549 +9/20/2015,0.962266817,0.496872431 +9/21/2015,0.963234778,0.977178041 +9/22/2015,0.962754424,1.012148677 +9/23/2015,0.955158509,0.977806554 +9/24/2015,0.95880072,0.959182926 +9/25/2015,0.958565627,0.902039315 +9/26/2015,0.956673751,1.077956267 +9/27/2015,0.949332152,0.79704649 +9/28/2015,0.961410535,0.95123902 +9/29/2015,0.962041973,1.03271728 +9/30/2015,0.906432749,0.027289554 +10/1/2015,0.940939105,0.078001945 +10/2/2015,0.943259584,0.100009742 +10/3/2015,0.878286431,NaN +10/4/2015,0.850947618,0.006183093 +10/5/2015,0.878689916,0.015788212 +10/6/2015,0.913175016,0.019561578 +10/7/2015,0.8681827,0.015609266 +10/8/2015,0.882913021,NaN +10/9/2015,0.868018681,NaN +10/10/2015,0.863055096,NaN +10/11/2015,0.876906042,NaN +10/12/2015,0.84913008,NaN +10/13/2015,0.876275111,NaN +10/14/2015,0.893414104,0.010878626 +10/15/2015,0.876617347,NaN +10/16/2015,0.882844674,0.010752095 +10/17/2015,0.889092688,0.012951565 +10/18/2015,0.875722192,0.013121776 +10/19/2015,0.917332123,0.242147672 +10/20/2015,0.88608052,NaN +10/21/2015,0.923611111,0.134691187 +10/22/2015,0.909624203,0.388376744 +10/23/2015,0.943159638,0.795382465 +10/24/2015,0.962687887,1.021638248 +10/25/2015,0.939347813,1.022803555 +10/26/2015,0.963099953,0.966686865 +10/27/2015,0.958794552,1.033182024 +10/28/2015,0.953004267,0.946817532 +10/29/2015,0.954415055,0.964541381 +10/30/2015,0.961527501,0.983285409 +10/31/2015,0.95094147,0.847368935 +11/1/2015,0.95908347,0.978718905 +11/2/2015,0.952403684,0.917656354 +11/3/2015,0.961605097,1.028164717 +11/4/2015,0.953689822,0.968474494 +11/5/2015,0.962698939,0.970447138 +11/6/2015,0.962707943,0.980753488 +11/7/2015,0.948850575,0.91053878 +11/8/2015,0.959633927,0.94711413 +11/9/2015,0.950010844,0.928350379 +11/10/2015,0.963011853,0.927522398 +11/11/2015,0.963533008,0.95817757 +11/12/2015,0.952632986,0.964626163 +11/13/2015,0.924127305,0.239211432 +11/14/2015,0.962343981,0.900127033 +11/15/2015,0.941458278,0.906060625 +11/16/2015,0.961069541,0.927992375 +11/17/2015,0.965074487,0.945310115 +11/18/2015,0.961628208,0.97152058 +11/19/2015,0.955668717,0.965980518 +11/20/2015,0.963153297,0.947733417 +11/21/2015,0.964800982,0.964709762 +11/22/2015,0.964778689,0.935542698 +11/23/2015,0.956110548,0.925049774 +11/24/2015,0.949889091,0.883263898 +11/25/2015,0.947347287,0.903458901 +11/26/2015,0.960437416,0.985231834 +11/27/2015,0.963897748,0.915753449 +11/28/2015,0.494091632,0.205613714 +11/29/2015,0.963431591,1.06253759 +11/30/2015,0.94712411,1.017543074 +12/1/2015,0.842545123,0.021095452 +12/2/2015,0.828397151,0.057383673 +12/3/2015,0.078347377,0 +12/4/2015,0.051724138,NaN +12/5/2015,0.939815806,0.89536963 +12/6/2015,0.955890805,0.928310429 +12/7/2015,0.919744626,0.623476678 +12/8/2015,0.875869313,NaN +12/9/2015,0.878182744,0.009115166 +12/10/2015,0.934760374,0.293583868 +12/11/2015,0.951973058,0.918009848 +12/12/2015,0.938570693,0.878956985 +12/13/2015,0.963671269,0.96725543 +12/14/2015,0.94097145,0.831732802 +12/15/2015,0.953663793,0.995555958 +12/16/2015,0.957548224,0.936421414 +12/17/2015,0.051724138,NaN +12/18/2015,0.96368066,1.790901545 +12/19/2015,0.963338592,1.246571592 +12/20/2015,0.931185062,0.79259661 +12/21/2015,0.873651249,NaN +12/22/2015,0.922035693,1.14946554 +12/23/2015,0.947559043,0.909905891 +12/24/2015,0.955339511,0.920903984 +12/25/2015,0.947362412,0.780118994 +12/26/2015,0.935192249,0.569652082 +12/27/2015,0.953452082,0.807538305 +12/28/2015,0.925236497,0.634790292 +12/29/2015,0.930805107,0.596915374 +12/30/2015,0.951678263,0.929611012 +12/31/2015,0.946746693,0.645779399 +1/1/2016,0.94091954,0.724529181 +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, +,, diff --git a/examples/metrics/System1_2015_performance_metrics.xlsx b/examples/metrics/System1_2015_performance_metrics.xlsx deleted file mode 100644 index 576db9f798aed39ddf1c606cf1a8e30a7ca27d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42414 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 jFS$E7^>UVWInxjk<@99+E=f9cFL<^ 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 Date: Thu, 4 Mar 2021 15:30:26 -0700 Subject: [PATCH 08/15] remove debugging --- pecos/tests/test_monitoring.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pecos/tests/test_monitoring.py b/pecos/tests/test_monitoring.py index e2ec29c..784e141 100644 --- a/pecos/tests/test_monitoring.py +++ b/pecos/tests/test_monitoring.py @@ -105,12 +105,6 @@ def test_check_timestamp(self): # Object-oriented test test_results = self.pm.test_results - print() - print(self.pm.data) - print() - print(test_results) - print() - print(expected) assert_frame_equal(test_results, expected, check_dtype=False) # Functional test @@ -127,10 +121,6 @@ def test_check_missing(self): # Object-oriented test self.pm.check_missing() test_results = self.pm.test_results[self.pm.test_results['Error Flag'] == 'Missing data'] - print() - print(self.pm.test_results) - print() - print(expected) assert_frame_equal(test_results.reset_index(drop=True), expected, check_dtype=False) # Functional test From 0cd849e54aadb6e1b1ab64d566a324c7f35ff527 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 15:31:10 -0700 Subject: [PATCH 09/15] Update docs --- documentation/example.rst | 4 ++-- examples/pv/pv_example.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/example.rst b/documentation/example.rst index 2afc5fa..ff413d6 100644 --- a/documentation/example.rst +++ b/documentation/example.rst @@ -4,7 +4,7 @@ Simple example ================ A simple example is included in the `examples/simple `_ directory. -This example uses data from an excel file, **simple.xlsx**, which +This example uses data from a CSV file, **simple.csv**, which contains 4 columns of data (A through D). * A = elapsed time in days @@ -41,7 +41,7 @@ of expected range, data that doesn't change, and data that changes abruptly, as The script, **simple_example.py** (shown below), is used to run quality control analysis using Pecos. The script performs the following steps: -* Load time series data from an excel file +* Load time series data from a CSV file * Run quality control tests diff --git a/examples/pv/pv_example.py b/examples/pv/pv_example.py index 173d7a4..8e27d33 100644 --- a/examples/pv/pv_example.py +++ b/examples/pv/pv_example.py @@ -12,7 +12,7 @@ * A performance model is computed using pvlib, additional quality control tests are run to compare observed to predicted power output * PV performance metrics are computed -* The results are written to an html report +* The results are written to an HTML report """ import yaml import pandas as pd From f9eceebd1dc1ddac117726f8b8f864de19491b84 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 16:00:54 -0700 Subject: [PATCH 10/15] Updated version number and release notes --- documentation/whatsnew.rst | 2 ++ documentation/whatsnew/v0.2.0.rst | 9 +++++++++ pecos/__init__.py | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 documentation/whatsnew/v0.2.0.rst diff --git a/documentation/whatsnew.rst b/documentation/whatsnew.rst index 8fea40d..e5bf5ed 100644 --- a/documentation/whatsnew.rst +++ b/documentation/whatsnew.rst @@ -1,6 +1,8 @@ Release Notes ================ +.. include:: whatsnew/v0.2.0.rst + .. include:: whatsnew/v0.1.9.rst .. include:: whatsnew/v0.1.8.rst diff --git a/documentation/whatsnew/v0.2.0.rst b/documentation/whatsnew/v0.2.0.rst new file mode 100644 index 0000000..b97eb32 --- /dev/null +++ b/documentation/whatsnew/v0.2.0.rst @@ -0,0 +1,9 @@ +.. _whatsnew_020: + +v0.2.0 (master) +-------------------------- + +* Removed the use of Excel files in examples which were causing test failures +* Added min_failures in the streaming outlier test +* Removed pecos logo from monitoring reports +* Updated documentation and tests diff --git a/pecos/__init__.py b/pecos/__init__.py index cc7687e..e617273 100644 --- a/pecos/__init__.py +++ b/pecos/__init__.py @@ -6,7 +6,7 @@ from pecos import utils from pecos import pv -__version__ = '0.1.9' +__version__ = '0.2.0' __copyright__ = """Copyright 2016 National Technology & Engineering Solutions of Sandia, LLC (NTESS). Under the terms of Contract From bef651e5106b325ebf1d9bc35786b748793ad2cf Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 16:19:52 -0700 Subject: [PATCH 11/15] Added timestamp to logger --- pecos/logger.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pecos/logger.py b/pecos/logger.py index f7544cd..f689c82 100644 --- a/pecos/logger.py +++ b/pecos/logger.py @@ -21,11 +21,9 @@ def initialize(): ch = logging.StreamHandler() ch.setLevel(logging.INFO) - formatter = logging.Formatter('%(message)s') + formatter = logging.Formatter("%(asctime)s : %(message)s", "%Y-%m-%d %H:%M:%S") fh.setFormatter(formatter) ch.setFormatter(formatter) if not len(pecos_logger.handlers): pecos_logger.addHandler(fh) pecos_logger.addHandler(ch) - - From a7bffb994f76764259d3ab5648386e5c6544ec2a Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 16:20:37 -0700 Subject: [PATCH 12/15] Added timestamp to logger --- documentation/whatsnew/v0.2.0.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/whatsnew/v0.2.0.rst b/documentation/whatsnew/v0.2.0.rst index b97eb32..a1ac800 100644 --- a/documentation/whatsnew/v0.2.0.rst +++ b/documentation/whatsnew/v0.2.0.rst @@ -6,4 +6,5 @@ v0.2.0 (master) * Removed the use of Excel files in examples which were causing test failures * Added min_failures in the streaming outlier test * Removed pecos logo from monitoring reports +* Added timestamp to logger * Updated documentation and tests From 394ebabdbc99899ccbf1628b27244587ff39d460 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 16:32:36 -0700 Subject: [PATCH 13/15] Updated release notes --- documentation/whatsnew/v0.2.0.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/whatsnew/v0.2.0.rst b/documentation/whatsnew/v0.2.0.rst index a1ac800..451af31 100644 --- a/documentation/whatsnew/v0.2.0.rst +++ b/documentation/whatsnew/v0.2.0.rst @@ -3,8 +3,8 @@ v0.2.0 (master) -------------------------- -* Removed the use of Excel files in examples which were causing test failures -* Added min_failures in the streaming outlier test +* Replaced the use of Excel files in examples/tests with CSV files. The Excel files were causing test failures. +* Added `min_failures` to the streaming outlier test * Removed pecos logo from monitoring reports -* Added timestamp to logger +* Added timestamp to the logger * Updated documentation and tests From 2554c3e561c99b2eddfc1011e6ca63d7c017ea25 Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Thu, 4 Mar 2021 20:12:03 -0700 Subject: [PATCH 14/15] Replaced mutable default args with None --- documentation/whatsnew/v0.2.0.rst | 4 +++- pecos/graphics.py | 14 ++++++++------ pecos/io.py | 26 ++++++++++++++++++-------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/documentation/whatsnew/v0.2.0.rst b/documentation/whatsnew/v0.2.0.rst index 451af31..d86544f 100644 --- a/documentation/whatsnew/v0.2.0.rst +++ b/documentation/whatsnew/v0.2.0.rst @@ -5,6 +5,8 @@ v0.2.0 (master) * Replaced the use of Excel files in examples/tests with CSV files. The Excel files were causing test failures. * Added `min_failures` to the streaming outlier test +* Replaced mutable default arguments with None * Removed pecos logo from monitoring reports -* Added timestamp to the logger +* Added timestamp to logger * Updated documentation and tests + diff --git a/pecos/graphics.py b/pecos/graphics.py index 39ff745..76a0bf1 100644 --- a/pecos/graphics.py +++ b/pecos/graphics.py @@ -305,9 +305,8 @@ def plot_interactive_timeseries(data, xaxis_min=None, xaxis_max=None, yaxis_min= else: plotly.offline.plot(fig, auto_open=auto_open) -def plot_heatmap(data, colors=[(0.75, 0.15, 0.15), (1, 0.75, 0.15), (0.15, 0.75, 0.15)], - nColors=12, cmap=None, vmin=None, vmax=None, - show_axis=False, title=None, figsize=(5.0, 5.0)): +def plot_heatmap(data, colors=None, nColors=12, cmap=None, vmin=None, vmax=None, + show_axis=False, title=None, figsize=(5.0, 5.0)): """ Create a heatmap. Default color scheme is red to yellow to green with 12 colors. This function can be used to generate dashboards with simple color @@ -319,10 +318,10 @@ def plot_heatmap(data, colors=[(0.75, 0.15, 0.15), (1, 0.75, 0.15), (0.15, 0.75, data : pandas DataFrame, pandas Series, or numpy array Data - colors : list, optional + colors : list or None, optional List of colors, colors can be specified in any way understandable by matplotlib.colors.ColorConverter.to_rgb(). - Default is red to yellow to green. + If None, colors transitions from red to yellow to green. num_colors : int, optional Number of colors in the colormap, default = 12 @@ -342,8 +341,11 @@ def plot_heatmap(data, colors=[(0.75, 0.15, 0.15), (1, 0.75, 0.15), (0.15, 0.75, figsize : tuple, optional Figure size, default = (5.0, 5.0) """ + if colors is None: + colors = [(0.75, 0.15, 0.15), (1, 0.75, 0.15), (0.15, 0.75, 0.15)] + if isinstance(data, (pd.DataFrame, pd.Series)): - data = data.values + data = data.values if len(data.shape) == 1: data = np.expand_dims(data, axis=0) diff --git a/pecos/io.py b/pecos/io.py index dd1bcaf..888a569 100644 --- a/pecos/io.py +++ b/pecos/io.py @@ -217,9 +217,9 @@ def write_test_results(test_results, filename='test_results.csv'): return full_filename -def write_monitoring_report(data, test_results, test_results_graphics=[], - custom_graphics=[], metrics=None, - title='Pecos Monitoring Report', config={}, logo=False, +def write_monitoring_report(data, test_results, test_results_graphics=None, + custom_graphics=None, metrics=None, + title='Pecos Monitoring Report', config=None, logo=False, im_width_test_results=1, im_width_custom=1, im_width_logo=0.1, encode=False, file_format='html', filename='monitoring_report.html'): @@ -236,12 +236,14 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], test_results : pandas DataFrame Summary of the quality control test results (pm.test_results) - test_results_graphics : list of strings, optional + test_results_graphics : list of strings or None, optional Graphics files, with full path. These graphics highlight data points - that failed a quality control test, created using pecos.graphics.plot_test_results() + that failed a quality control test, created using pecos.graphics.plot_test_results(). + If None, test results graphics are not included in the report. - custom_graphics : list of strings, optional + custom_graphics : list of strings or None, optional Custom files, with full path. Created by the user. + If None, custom graphics are not included in the report. metrics : pandas Series or DataFrame, optional Performance metrics to add as a table to the monitoring report @@ -249,8 +251,9 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], title : string, optional Monitoring report title, default = 'Pecos Monitoring Report' - config : dictionary, optional - Configuration options, to be printed at the end of the report + config : dictionary or None, optional + Configuration options, to be printed at the end of the report. + If None, configuration options are not included in the report. logo : string, optional Graphic to be added to the report header @@ -278,6 +281,13 @@ def write_monitoring_report(data, test_results, test_results_graphics=[], """ logger.info("Writing HTML report") + if test_results_graphics is None: + test_results_graphics = [] + if custom_graphics is None: + custom_graphics = [] + if config is None: + config = {} + if data.empty: logger.warning("Empty database") start_time = 'NaN' From 4513e4c405cbb32b1995d3a0cf79f74b2fa71e4e Mon Sep 17 00:00:00 2001 From: Katherine Klise Date: Fri, 5 Mar 2021 10:15:46 -0700 Subject: [PATCH 15/15] Removed openpyxl from ci requirements --- ci/requirements-py36.yml | 1 - ci/requirements-py37.yml | 1 - ci/requirements-py38.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/ci/requirements-py36.yml b/ci/requirements-py36.yml index 7738d6d..8f1e10a 100644 --- a/ci/requirements-py36.yml +++ b/ci/requirements-py36.yml @@ -12,7 +12,6 @@ dependencies: - pvlib - plotly - ephem - - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file diff --git a/ci/requirements-py37.yml b/ci/requirements-py37.yml index 9bf6d4e..d3262df 100644 --- a/ci/requirements-py37.yml +++ b/ci/requirements-py37.yml @@ -12,7 +12,6 @@ dependencies: - pvlib - plotly - ephem - - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file diff --git a/ci/requirements-py38.yml b/ci/requirements-py38.yml index b089cb8..39a8c03 100644 --- a/ci/requirements-py38.yml +++ b/ci/requirements-py38.yml @@ -12,7 +12,6 @@ dependencies: - pvlib - plotly - ephem - - openpyxl - sqlalchemy - pip: - coveralls \ No newline at end of file