diff --git a/py-scripts/tools/lf_qa.py b/py-scripts/tools/lf_qa.py index 144dab8a..1351cfb4 100755 --- a/py-scripts/tools/lf_qa.py +++ b/py-scripts/tools/lf_qa.py @@ -7,6 +7,7 @@ import sys import os import importlib import plotly.express as px +import plotly.graph_objects as go import pandas as pd import sqlite3 import argparse @@ -36,7 +37,6 @@ class csv_sql(): self.server = _server self.cut = _cut self.png = _png - self.png_generated = False self.kpi_list = [] self.html_list = [] self.conn = None @@ -255,6 +255,50 @@ class csv_sql(): exit(1) self.conn.close() + def generate_png(self,group,test_id_list,test_tag,test_rig,kpi_path_list,kpi_fig,df_tmp): + # save the figure - figures will be over written png + # for testing + png_server_img = '' + #generate the png files + print("generate png and kpi images from kpi kpi_path:{}".format(df_tmp['kpi_path'])) + # generate png img path + png_path = os.path.join(kpi_path_list[-1],"{}_{}_{}_kpi.png".format( group, test_tag, test_rig)) + png_path = png_path.replace(' ','') + # generate html graphics path + html_path = os.path.join(kpi_path_list[-1],"{}_{}_{}_kpi.html".format( group, test_tag, test_rig)) + html_path = html_path.replace(' ','') + # NOTE: html links to png do not like spaces + png_server_img = self.server + png_path.replace(self.cut,'') + # generate png image + try: + kpi_fig.write_image(png_path,scale=1,width=1200,height=350) + except: + print("ERROR: {database} Was correct database passed in, moved or duplicates of same name?".format(database=self.database)) + # generate html image (interactive) + kpi_fig.write_html(html_path) + img_kpi_html_path = self.server + html_path + img_kpi_html_path = img_kpi_html_path.replace(self.cut,'') + self.html_results += """ + + + + """.format(img_kpi_html_path=img_kpi_html_path,png_server_img=png_server_img) + # link to interactive results + kpi_html_path = self.server + html_path + kpi_html_path = kpi_html_path.replace(self.cut,'') + #self.html_results +="""
""" + # link to full test results + report_index_html_path = self.server + kpi_path_list[-1] + "index.html" + report_index_html_path = report_index_html_path.replace(self.cut,'') + self.html_results +="""{test_id}_{group}_{test_tag}_{test_rig}_Report + """.format(report_index_html_path=report_index_html_path,test_id=test_id_list[-1], group=group, test_tag=test_tag, test_rig=test_rig) + self.html_results +="""
""" + self.html_results +="""
""" + self.html_results +="""
""" + self.html_results +="""
""" + self.html_results +="""
""" + + def generate_graph_png(self): print("generate png and html to display, generate time: {}".format(time.time())) @@ -297,6 +341,7 @@ class csv_sql(): df_tmp = df_tmp.sort_values(by='Date') test_id_list = list(df_tmp['test-id']) kpi_path_list = list(df_tmp['kpi_path']) + # get Device Under Test Information , # the set reduces the redundency , list puts it back into a list # the [0] will get the latest versions for the report @@ -319,12 +364,14 @@ class csv_sql(): units_list = list(df_tmp['Units']) print("GRAPHING::: test-rig {} test-tag {} Graph-Group {}".format(test_rig,test_tag,group)) + # group of Score will have subtest if group == 'Score': + # Print out the Standard Score report , May want to check for empty pass fail kpi_fig = (px.scatter(df_tmp, x="Date", y="numeric-score", custom_data=['numeric-score','Subtest-Pass','Subtest-Fail'], color="short-description", hover_name="short-description", size_max=60)).update_traces(mode='lines+markers') - + kpi_fig.update_traces( hovertemplate="
".join([ "numeric-score: %{customdata[0]}", @@ -332,67 +379,84 @@ class csv_sql(): "Subtest-Fail: %{customdata[2]}" ]) ) + + kpi_fig.update_layout( + title="{} : {} : {} : {}".format(test_id_list[-1], group, test_tag, test_rig), + xaxis_title="Time", + yaxis_title="{}".format(units_list[-1]), + xaxis = {'type' : 'date'} + ) + + self.generate_png(df_tmp=df_tmp, + group=group, + test_id_list=test_id_list, + test_tag=test_tag, + test_rig=test_rig, + kpi_path_list=kpi_path_list, + kpi_fig=kpi_fig) + + #kpi_fig = (px.bar(df_tmp, x="Date", y=["Subtest-Pass","Subtest-Fail"], title="This is the title")) + #kpi_fig = (px.bar(df_tmp, x="Date", y="Subtest-Pass", title="This is the title")) + + df_tmp["Percent"] = df_tmp["Subtest-Pass"] / (df_tmp["Subtest-Pass"] + df_tmp["Subtest-Fail"]) + + fig1 = (px.scatter(df_tmp, x="Date", y="Percent", + custom_data=['short-description','Percent','Subtest-Pass','Subtest-Fail'], + color="short-description", hover_name="short-description", + size_max=60)).update_traces(mode='lines+markers') + + fig1.update_traces( + hovertemplate="
".join([ + "short-description: %{customdata[0]}", + "Percent: %{customdata[1]:.2%}", + "Subtest-Pass: %{customdata[2]}", + "Subtest-Fail: %{customdata[3]}" + ]) + ) + + #kpi_fig = go.Figure(data=fig1.data + fig2.data) + # the kpi_fig is a go.Figure + kpi_fig = go.Figure(data=fig1.data) + kpi_fig.update_layout(yaxis=dict(tickformat='.2%')) + kpi_fig.update_layout( + title="{} : {} : Subtests : {} : {}".format(test_id_list[-1], group, test_tag, test_rig), + xaxis_title="Time", + yaxis_title="Subtest Percent Pass", + xaxis = {'type' : 'date'} + ) + + # modify the group + group = group + "_subtests" + + self.generate_png(df_tmp=df_tmp, + group=group, + test_id_list=test_id_list, + test_tag=test_tag, + test_rig=test_rig, + kpi_path_list=kpi_path_list, + kpi_fig=kpi_fig) + + #kpi_fig.add_scatter(x=df_tmp['Date'], y=df_tmp['Subtest-Fail']).update_traces(mode='lines+markers') + else: kpi_fig = (px.scatter(df_tmp, x="Date", y="numeric-score", color="short-description", hover_name="short-description", size_max=60)).update_traces(mode='lines+markers') - kpi_fig.update_layout( - title="{} : {} : {} : {}".format(test_id_list[-1], group, test_tag, test_rig), - xaxis_title="Time", - yaxis_title="{}".format(units_list[-1]), - xaxis = {'type' : 'date'} - ) - # save the figure - figures will be over written png - # for testing - png_server_img = '' - #generate the png files - if self.png: - if self.png_generated: - pass - else: - print("generate png and kpi images from kpi kpi_path:{}".format(df_tmp['kpi_path'])) - # generate png img path - png_path = os.path.join(kpi_path_list[-1],"{}_{}_{}_kpi.png".format( group, test_tag, test_rig)) - png_path = png_path.replace(' ','') - # generate html graphics path - html_path = os.path.join(kpi_path_list[-1],"{}_{}_{}_kpi.html".format( group, test_tag, test_rig)) - html_path = html_path.replace(' ','') - # NOTE: html links to png do not like spaces - png_server_img = self.server + png_path.replace(self.cut,'') - # generate png image - try: - kpi_fig.write_image(png_path,scale=1,width=1200,height=350) - except: - print("ERROR: {database} Was correct database passed in, moved or duplicates of same name?".format(database=self.database)) - # generate html image (interactive) - kpi_fig.write_html(html_path) - img_kpi_html_path = self.server + html_path - img_kpi_html_path = img_kpi_html_path.replace(self.cut,'') + kpi_fig.update_layout( + title="{} : {} : {} : {}".format(test_id_list[-1], group, test_tag, test_rig), + xaxis_title="Time", + yaxis_title="{}".format(units_list[-1]), + xaxis = {'type' : 'date'} + ) - self.html_results += """ - - - - """.format(img_kpi_html_path=img_kpi_html_path,png_server_img=png_server_img) - - # link to interactive results - kpi_html_path = self.server + html_path - kpi_html_path = kpi_html_path.replace(self.cut,'') - #self.html_results +="""
""" - # link to full test results - report_index_html_path = self.server + kpi_path_list[-1] + "index.html" - report_index_html_path = report_index_html_path.replace(self.cut,'') - self.html_results +="""{test_id}_{group}_{test_tag}_{test_rig}_Report - """.format(report_index_html_path=report_index_html_path,test_id=test_id_list[-1], group=group, test_tag=test_tag, test_rig=test_rig) - self.html_results +="""
""" - self.html_results +="""
""" - self.html_results +="""
""" - self.html_results +="""
""" - self.html_results +="""
""" - - # TODO see if this stops the regenration of the graphs each time - self.png_generated = True + self.generate_png(df_tmp=df_tmp, + group=group, + test_id_list=test_id_list, + test_tag=test_tag, + test_rig=test_rig, + kpi_path_list=kpi_path_list, + kpi_fig=kpi_fig) # Feature, Sum up the subtests passed/failed from the kpi files for each run, poke those into the database, and generate a kpi graph for them.