Here are the examples of the python api bokeh.models.SaveTool taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
10 Examples
3
View Source File : calendar.py
License : GNU Affero General Public License v3.0
Project Creator : andrewcooke
License : GNU Affero General Public License v3.0
Project Creator : andrewcooke
def _build_tools(df, hover, not_hover, all_hover):
tools = [SaveTool()]
if hover is None:
hover = [col for col in df.columns if all_hover or (not col.startswith(CALENDAR) and not col in not_hover)]
if hover:
# names ensures that background has no hover
tools.append(HoverTool(tooltips=[tooltip(col) for col in hover], names=['with_hover']))
return tools
def set_constant(self, dest, value):
0
View Source File : plotting.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : FeatureLabs
License : BSD 3-Clause "New" or "Revised" License
Project Creator : FeatureLabs
def dendrogram(D, figargs=None):
'''Creates a dendrogram plot.
This plot can show full structure of a given dendrogram.
Args:
D (henchman.selection.Dendrogram): An initialized dendrogram object
Examples:
>>> from henchman.selection import Dendrogram
>>> from henchman.plotting import show
>>> import henchman.plotting as hplot
>>> D = Dendrogram(X)
>>> plot = hplot.dendrogram(D)
>>> show(plot)
'''
if figargs is None:
return lambda figargs: dendrogram(D, figargs=figargs)
G = nx.Graph()
vertices_source = ColumnDataSource(
pd.DataFrame({'index': D.columns.keys(),
'desc': list(D.columns.values())}))
edges_source = ColumnDataSource(
pd.DataFrame(D.edges[0]).rename(
columns={1: 'end', 0: 'start'}))
step_source = ColumnDataSource(
pd.DataFrame({'step': [0],
'thresh': [D.threshlist[0]],
'components': [len(D.graphs[0])]}))
G.add_nodes_from([str(x) for x in vertices_source.data['index']])
G.add_edges_from(zip(
[str(x) for x in edges_source.data['start']],
[str(x) for x in edges_source.data['end']]))
graph_renderer = from_networkx(G, nx.circular_layout,
scale=1, center=(0, 0))
graph_renderer.node_renderer.data_source = vertices_source
graph_renderer.node_renderer.view = CDSView(source=vertices_source)
graph_renderer.edge_renderer.data_source = edges_source
graph_renderer.edge_renderer.view = CDSView(source=edges_source)
plot = Plot(plot_width=400, plot_height=400,
x_range=Range1d(-1.1, 1.1),
y_range=Range1d(-1.1, 1.1))
plot.title.text = "Feature Connectivity"
graph_renderer.node_renderer.glyph = Circle(
size=5, fill_color=Spectral4[0])
graph_renderer.node_renderer.selection_glyph = Circle(
size=15, fill_color=Spectral4[2])
graph_renderer.edge_renderer.data_source = edges_source
graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC",
line_alpha=0.6,
line_width=.5)
graph_renderer.edge_renderer.selection_glyph = MultiLine(
line_color=Spectral4[2],
line_width=3)
graph_renderer.node_renderer.hover_glyph = Circle(
size=5,
fill_color=Spectral4[1])
graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy = NodesAndLinkedEdges()
plot.renderers.append(graph_renderer)
plot.add_tools(
HoverTool(tooltips=[("feature", "@desc"),
("index", "@index"), ]),
TapTool(),
BoxZoomTool(),
SaveTool(),
ResetTool())
plot = _modify_plot(plot, figargs)
if figargs['static']:
return plot
def modify_doc(doc, D, figargs):
data_table = DataTable(source=step_source,
columns=[TableColumn(field='step',
title='Step'),
TableColumn(field='thresh',
title='Thresh'),
TableColumn(field='components',
title='Components')],
height=50, width=400)
def callback(attr, old, new):
try:
edges = D.edges[slider.value]
edges_source.data = ColumnDataSource(
pd.DataFrame(edges).rename(columns={1: 'end',
0: 'start'})).data
step_source.data = ColumnDataSource(
{'step': [slider.value],
'thresh': [D.threshlist[slider.value]],
'components': [len(D.graphs[slider.value])]}).data
except Exception as e:
print(e)
slider = Slider(start=0,
end=(len(D.edges) - 1),
value=0,
step=1,
title="Step")
slider.on_change('value', callback)
doc.add_root(column(slider, data_table, plot))
return lambda doc: modify_doc(doc, D, figargs)
def f1(X, y, model, n_precs=1000, n_splits=1, figargs=None):
0
View Source File : clustree.py
License : MIT License
Project Creator : ivirshup
License : MIT License
Project Creator : ivirshup
def plot_hierarchy(
complist: "ComponentList", coords: pd.DataFrame, *, scatter_kwargs={}
):
"""
Params
------
complist
List of components that will be plotted in this graph.
"""
coords = coords.copy()
scatter_kwargs = scatter_kwargs.copy()
g = complist.to_graph()
assert len(list(nx.components.weakly_connected_components(g))) == 1
for k, v in make_umap_plots(
complist, coords, scatter_kwargs=scatter_kwargs
).items():
g.nodes[k]["img"] = v
pos = json_friendly(
nx.nx_agraph.graphviz_layout(nx.DiGraph(g.edges(data=False)), prog="dot")
)
graph_renderer = from_networkx(g, pos)
graph_renderer.node_renderer.glyph = Circle(size=15)
graph_renderer.edge_renderer.glyph = MultiLine(line_width=1)
node_hover = HoverTool(
tooltips=[
("img", "@img{safe}"),
("component_id", "@index"),
("# solutions:", "@n_solutions"),
("# samples in intersect", "@n_intersect"),
("# samples in union", "@n_union"),
],
attachment="vertical",
)
# Adding labels
label_src = pd.DataFrame.from_dict(
graph_renderer.layout_provider.graph_layout, orient="index", columns=["x", "y"]
)
label_src.index.name = "nodeid"
label_src = ColumnDataSource(label_src)
node_label = LabelSet(
x="x",
y="y",
text="nodeid",
level="annotation",
source=label_src,
text_align="center",
)
# layout = graph_renderer.layout_provider.graph_layout
# label, x, y = zip(*((str(label), x, y) for label, (x, y) in layout.items()))
# node_label = LabelSet(
# x=x, y=y, text=label, level="glyph"
# )
p = Plot(plot_width=1000, plot_height=500, **get_ranges(pos))
p.renderers.append(graph_renderer)
p.add_layout(node_label)
p.add_tools(node_hover, SaveTool())
return p
0
View Source File : wm_reader.py
License : BSD 3-Clause "New" or "Revised" License
Project Creator : NREL
License : BSD 3-Clause "New" or "Revised" License
Project Creator : NREL
def create_plot(self, updateCoordinates):
load_x = []
load_y = []
load_lines_xs = []
load_lines_ys = []
if updateCoordinates:
edges = [list(x) for x in self.nxGraph.edges()]
self.plotdata = {
'Xs': [],
'Ys': [],
}
for edge in edges:
node1, node2 = edge
if 'x' in self.nxGraph.node[node1] and 'x' in self.nxGraph.node[node2]:
x1 = self.nxGraph.node[node1]['x']
y1 = self.nxGraph.node[node1]['y']
x2 = self.nxGraph.node[node2]['x']
y2 = self.nxGraph.node[node2]['y']
if None not in [x1, x2, y1, y2]:
self.plotdata['Xs'].append([x1, x2])
self.plotdata['Ys'].append([y1, y2])
for node in [node1, node2]:
if 'loads' in self.nxGraph.node[node]:
for load_name, load_properties in self.nxGraph.node[node]['loads'].items():
if 'x' in self.nxGraph.node[node] and self.nxGraph.node[node]:
x1 = self.nxGraph.node[node]['x']
y1 = self.nxGraph.node[node]['y']
x2 = load_properties['x']
y2 = load_properties['y']
dist = np.sqrt((x1 - x2)**2 + (y1 - y2)**2)
if 0 not in [x1, x2, y1, y2] and dist < 500:
load_x.append(x2)
load_y.append(y2)
load_lines_xs.append([x1, x2])
load_lines_ys.append([y1, y2])
Linesource = ColumnDataSource(self.plotdata)
plot = figure(title=None, plot_width=900, plot_height=900,
tools=[ResetTool(), BoxSelectTool(), SaveTool(), BoxZoomTool(), WheelZoomTool(),
PanTool()])
# plot edges (lines, fuses, switches, transformers, regulators)
plot.multi_line(xs="Xs", ys="Ys", source=Linesource, line_width=2, legend='Edges', line_color='#00008B') # , line_color=ColorBy
# plot loads
plot.triangle(x=load_x, y=load_y, legend='Loads', color='orange')
# plot substation
Xs, Ys = self.get_class_type_locations('substation')
plot.circle_x(x=Xs, y=Ys, size=14, legend='Substation', fill_color='red', line_color='black')
Xs, Ys = self.get_class_type_locations('regulator')
plot.hex(x=Xs, y=Ys, size=14, legend='Regulators', fill_color='lightgreen', line_color='black')
plot.multi_line(xs=load_lines_xs, ys=load_lines_ys, line_width=2, legend='Drop lines', line_color='black')
plot.legend.location = "top_left"
plot.legend.click_policy = "hide"
curdoc().add_root(plot)
show(plot)
return
def get_graph_metrics(self):
0
View Source File : visualize_utils.py
License : MIT License
Project Creator : ratsgo
License : MIT License
Project Creator : ratsgo
def visualize_self_attention_scores(tokens, scores, filename="/notebooks/embedding/self-attention.png",
use_notebook=False):
mean_prob = np.mean(scores)
weighted_edges = []
for idx_1, token_prob_dist_1 in enumerate(scores):
for idx_2, el in enumerate(token_prob_dist_1):
if idx_1 == idx_2 or el < mean_prob:
weighted_edges.append((tokens[idx_1], tokens[idx_2], 0))
else:
weighted_edges.append((tokens[idx_1], tokens[idx_2], el))
max_prob = np.max([el[2] for el in weighted_edges])
weighted_edges = [(el[0], el[1], (el[2] - mean_prob) / (max_prob - mean_prob)) for el in weighted_edges]
G = nx.Graph()
G.add_nodes_from([el for el in tokens])
G.add_weighted_edges_from(weighted_edges)
plot = Plot(plot_width=500, plot_height=500,
x_range=Range1d(-1.1, 1.1), y_range=Range1d(-1.1, 1.1))
plot.add_tools(HoverTool(tooltips=None), TapTool(), BoxSelectTool())
graph_renderer = from_networkx(G, nx.circular_layout, scale=1, center=(0, 0))
graph_renderer.node_renderer.data_source.data['colors'] = Spectral8[:len(tokens)]
graph_renderer.node_renderer.glyph = Circle(size=15, line_color=None, fill_color="colors")
graph_renderer.node_renderer.selection_glyph = Circle(size=15, fill_color="colors")
graph_renderer.node_renderer.hover_glyph = Circle(size=15, fill_color="grey")
graph_renderer.edge_renderer.data_source.data["line_width"] = [G.get_edge_data(a, b)['weight'] * 3 for a, b in
G.edges()]
graph_renderer.edge_renderer.glyph = MultiLine(line_color="#CCCCCC", line_width={'field': 'line_width'})
graph_renderer.edge_renderer.selection_glyph = MultiLine(line_color="grey", line_width=5)
graph_renderer.edge_renderer.hover_glyph = MultiLine(line_color="grey", line_width=5)
graph_renderer.selection_policy = NodesAndLinkedEdges()
graph_renderer.inspection_policy = EdgesAndLinkedNodes()
plot.renderers.append(graph_renderer)
x, y = zip(*graph_renderer.layout_provider.graph_layout.values())
data = {'x': list(x), 'y': list(y), 'connectionNames': tokens}
source = ColumnDataSource(data)
labels = LabelSet(x='x', y='y', text='connectionNames', source=source, text_align='center')
plot.renderers.append(labels)
plot.add_tools(SaveTool())
if use_notebook:
output_notebook()
show(plot)
else:
export_png(plot, filename)
print("save @ " + filename)
def visualize_words(words, vecs, palette="Viridis256", filename="/notebooks/embedding/words.png",
0
View Source File : test_query.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def large_plot():
source = ColumnDataSource(data=dict(x=[0, 1], y=[0, 1]))
xdr = Range1d(start=0, end=1)
xdr.tags.append("foo")
xdr.tags.append("bar")
ydr = Range1d(start=10, end=20)
ydr.tags.append("foo")
ydr.tags.append(11)
plot = Plot(x_range=xdr, y_range=ydr)
ydr2 = Range1d(start=0, end=100)
plot.extra_y_ranges = {"liny": ydr2}
circle = Circle(x="x", y="y", fill_color="red", size=5, line_color="black")
plot.add_glyph(source, circle, name="mycircle")
line = Line(x="x", y="y")
plot.add_glyph(source, line, name="myline")
rect = Rect(x="x", y="y", width=1, height=1, fill_color="green")
plot.add_glyph(source, rect, name="myrect")
plot.add_layout(DatetimeAxis(), 'below')
plot.add_layout(LogAxis(), 'left')
plot.add_layout(LinearAxis(y_range_name="liny"), 'left')
plot.add_layout(Grid(dimension=0), 'left')
plot.add_layout(Grid(dimension=1), 'left')
plot.add_tools(
BoxZoomTool(), PanTool(), SaveTool(), ResetTool(), WheelZoomTool(),
)
return plot
plot = large_plot()
0
View Source File : test_objects.py
License : MIT License
Project Creator : rthorst
License : MIT License
Project Creator : rthorst
def large_plot(n):
from bokeh.models import (
Plot, LinearAxis, Grid, GlyphRenderer,
ColumnDataSource, DataRange1d, PanTool, ZoomInTool, ZoomOutTool, WheelZoomTool, BoxZoomTool,
BoxSelectTool, SaveTool, ResetTool
)
from bokeh.models.layouts import Column
from bokeh.models.glyphs import Line
col = Column()
objects = set([col])
for i in xrange(n):
source = ColumnDataSource(data=dict(x=[0, i + 1], y=[0, i + 1]))
xdr = DataRange1d()
ydr = DataRange1d()
plot = Plot(x_range=xdr, y_range=ydr)
xaxis = LinearAxis()
plot.add_layout(xaxis, "below")
yaxis = LinearAxis()
plot.add_layout(yaxis, "left")
xgrid = Grid(dimension=0)
plot.add_layout(xgrid, "center")
ygrid = Grid(dimension=1)
plot.add_layout(ygrid, "center")
tickers = [xaxis.ticker, xaxis.formatter, yaxis.ticker, yaxis.formatter]
glyph = Line(x='x', y='y')
renderer = GlyphRenderer(data_source=source, glyph=glyph)
plot.renderers.append(renderer)
pan = PanTool()
zoom_in = ZoomInTool()
zoom_out = ZoomOutTool()
wheel_zoom = WheelZoomTool()
box_zoom = BoxZoomTool()
box_select = BoxSelectTool()
save = SaveTool()
reset = ResetTool()
tools = [pan, zoom_in, zoom_out, wheel_zoom, box_zoom, box_select, save, reset]
plot.add_tools(*tools)
col.children.append(plot)
objects |= set([
xdr, ydr,
xaxis, yaxis,
xgrid, ygrid,
renderer, renderer.view, glyph,
source, source.selected, source.selection_policy,
plot, plot.x_scale, plot.y_scale, plot.toolbar, plot.title,
box_zoom.overlay, box_select.overlay,
] + tickers + tools)
return col, objects
class TestMetaModel(object):
0
View Source File : rca.py
License : MIT License
Project Creator : smartyal
License : MIT License
Project Creator : smartyal
def rca(functionNode):
logger = functionNode.get_logger()
logger.info("==>>>> in rca (root cause analysis " + functionNode.get_browse_path())
progressNode = functionNode.get_child("control").get_child("progress")
progressNode.set_value(0.1)
variables = functionNode.get_child("selectedVariables").get_leaves()
tag = functionNode.get_child("selectedTags").get_value() #only one tag
annotations = functionNode.get_child("annotations").get_leaves()
feature = functionNode.get_child("selectedFeatures").get_value()
algo = functionNode.get_child("selectedAlgorithms").get_value()
target = functionNode.get_child("selectedTarget").get_target()
p=Progress(progressNode)
p.set_divisor(len(annotations)/0.5)
p.set_offset(0.1)
#now create the data as x-y
results = {"x":[],"y":[]}
var = variables[0]
#now iterate over all annotations of the matching type and create feature
for idx,anno in enumerate(annotations):
p.set_progress(idx)
if (anno.get_child("type").get_value() == "time") and (tag in anno.get_child("tags").get_value()):
startTime =anno.get_child("startTime").get_value()
endTime = anno.get_child("endTime").get_value()
data = var.get_time_series(startTime,endTime)
#now create the feature
feat = calc_feature(data["values"],feature)
targetValue = get_target(target,(date2secs(startTime)+date2secs(endTime))/2)
if feat and targetValue and numpy.isfinite(feat) and numpy.isfinite(targetValue):
results["x"].append(feat)
results["y"].append(targetValue)
else:
logger.warning(f"no result for {var.get_name} @ {startTime}, anno:{tag}, feat:{feat}, target: {target}")
#now we have all the x-y
progressNode.set_value(0.7)
fig = figure(title = "x-y Correlation Plot "+var.get_name(),
tools=[PanTool(), WheelZoomTool(),ResetTool(),SaveTool()],
plot_height=300,
x_axis_label=feature+"("+var.get_name()+") @ "+tag,
y_axis_label=target.get_name())
fig.toolbar.logo = None
curdoc().theme = Theme(json=themes.darkTheme)
fig.xaxis.major_label_text_color = themes.darkTickColor
fig.yaxis.major_label_text_color = themes.darkTickColor
fig.scatter(x=results["x"], y=results["y"], size=5, fill_color="#d9b100", marker="o")
fileName = functionNode.get_child("outputFileName").get_value()
filePath = os.path.join(myDir,'./../web/customui/'+fileName)
progressNode.set_value(0.8)
output_file(filePath,mode="inline")#inline: put the bokeh .js into this html, otherwise the default cdn will be taken, might cause CORS problems)
save(fig)
#print(results)
return True
#
def data_cleaning(annotations,order=None,logger=None):
0
View Source File : rca.py
License : MIT License
Project Creator : smartyal
License : MIT License
Project Creator : smartyal
def rca2(functionNode):
logger = functionNode.get_logger()
logger.info("==>>>> in rca2 (root cause analysis " + functionNode.get_browse_path())
progressNode = functionNode.get_child("control").get_child("progress")
progressNode.set_value(0.1)
m=functionNode.get_model()
report = ' < i>REPORT < /i> < br> < div style="font-size:85%">'
annotations = functionNode.get_child("annotations").get_leaves()
#order = ["Step"+str(no) for no in range(1,19)]
#order = ["Phase"+str(no) for no in range(3,28)]
order = functionNode.get_child("annotationsOrder").get_value()
logger.debug("filtering by order")
annotations = data_cleaning( annotations ,order = order,logger=logger) #Step1,Step2,...Step18 lsit of lists
report+=(f"found {len(annotations)} valid processes < br>")
#for now, flatten them out
annotations = [subprocess for process in annotations for subprocess in process]
algo = functionNode.get_child("selectedAlgorithm").get_value()
target = functionNode.get_child("selectedTarget").get_target()
progressNode.set_value(0.3)
#now we are building up the table by iterating all the children in "selection"
entries = functionNode.get_child("selection").get_children()
table = {"target":[]}
firstVariable = True
for entry in entries:
logger.debug(f"entry {entry.get_name()}")
#each entry is a combination of variable, tags and feature
vars = entry.get_child("selectedVariables").get_targets()
tags = entry.get_child("selectedTags").get_value()
features = entry.get_child("selectedFeatures").get_value()
#for iterate over variables
for var in vars:
logger.debug(f"processing variable: {var.get_name()} with tags {tags} and features {features}")
#columnName = var.get_name()+str(tags)+m.getRandomId()
for tag in tags:
row = 0
#table[columnName]=[]# make a column
for idx,anno in enumerate(annotations):
if anno.get_child("type").get_value() != "time":
continue
if tag in anno.get_child("tags").get_value():
startTime =anno.get_child("startTime").get_value()
endTime = anno.get_child("endTime").get_value()
data = var.get_time_series(startTime,endTime)["values"]
#we take only the values "inside" the annotation
if len(data)>2:
data =data[1:-1]
#now create the features
for feature in features:
feat = calc_feature(data,feature)
columnName = var.get_name()+"_"+tag+"_"+feature
if not columnName in table:
table[columnName]=[]
table[columnName].append(feat)
targetValue = get_target(target,(date2secs(startTime)+date2secs(endTime))/2)
if targetValue:
if firstVariable:
#for the first variable we also write the target
table["target"].append(targetValue)
else:
#for all others we make sure we have the same target value for that case (sanity check)
if table["target"][row] != targetValue:
logger.warning(f'problem target {table["target"][row]} !=> {targetValue}')
row=row+1
else:
logger.warning(f"no corrrect target value for {startTime} - {endTime}")
firstVariable = False
#now we have the table, plot it
import json
#print(json.dumps(table,indent=2))
progressNode.set_value(0.5)
#try a model
algo = functionNode.get_child("selectedAlgorithm").get_value()
if algo=="lasso":
reg = linear_model.LassoCV()
report +=" using lasso Regression with auto-hyperparams < br>"
else:
#default
report +=" using linear Regression < br>"
reg = linear_model.LinearRegression() #try rigde, lasso
columnNames = []
dataTable = []
saveDict = {}
for k,v in table.items():
saveDict[k]=numpy.asarray(v,dtype=numpy.float64)
if k=="target":
continue
dataTable.append(v)
columnNames.append(k)
fileName = functionNode.get_child("outputFileName").get_value()
filePath = os.path.join(myDir,'./../web/customui/'+fileName.split(".")[0])
numpy.savez(filePath, **saveDict)
#for loading:
# get = numpy.load(name+".npz")
# for name in get.files:
# data = get[name]
dataTable = numpy.asarray(dataTable)
x=dataTable.T
scaler = StandardScaler()
scaler.fit(x)
x=scaler.transform(x)
y=table["target"]
x_train, x_test, y_train, y_test = train_test_split(x, y)
reg.fit(x_train,y_train)
#print(reg.coef_)
y_hat= reg.predict(x_test)
y_repeat = reg.predict(x_train)
#print(f"predict: {y_hat} vs real: {y_test}")
#check over/underfitting
r_train = r2_score(y_train, y_repeat)
r_test = r2_score(y_test,y_hat)
report+="R < sup>2 < /sup> train= %.4g, R < sup>2 < /sup> test = %.4g < br>"%(r_train,r_test)
pearsons = []
for col in x.T:
pearsons.append(pearsonr(col, y)[0])
#and finally the correlations between y and yhat
y_pearson_train = pearsonr(y_train, y_repeat)[0]
y_pearson_test = pearsonr(y_test,y_hat)[0]
report+="pearsonCorr y/y_hat train:%.4g , test:%.4g < br>"%(y_pearson_train,y_pearson_test)
report +="regression coefficients, pearsons correlations: < br>"
for col,coef,pear in zip(columnNames,reg.coef_,pearsons):
report+=" %s:%.4g, %.4g < br>"%(col,coef,pear)
#write report
progressNode.set_value(0.8)
report+=" < div>"#close the style div
functionNode.get_child("report").set_value(report)
#make a plot
hover1= HoverTool(tooltips=[ ( 'x,y','$x,$y')],mode='mouse')
hover1.point_policy='snap_to_data'
hover1.line_policy = "nearest"
tools = [PanTool(), WheelZoomTool(),BoxZoomTool(),ResetTool(),SaveTool(),hover1]
title = "prediction results on "+functionNode.get_child("selectedAlgorithm").get_value()
fig = figure(title = title,tools=tools,plot_height=300,plot_width=400)
fig.toolbar.logo = None
curdoc().theme = Theme(json=themes.darkTheme)
fig.xaxis.major_label_text_color = themes.darkTickColor
fig.yaxis.major_label_text_color = themes.darkTickColor
fig.xaxis.axis_label= target.get_name()
fig.xaxis.axis_label_text_color = "white"
fig.yaxis.axis_label="predicted Values for "+target.get_name()
fig.yaxis.axis_label_text_color="white"
fig.circle(y_train,y_repeat,size=4,line_color="white",fill_color="white",name="train",legend_label="train")
fig.circle(y_test,y_hat,line_color="#d9b100",fill_color="#d9b100",size=4,name="test",legend_label="test")
mini = min([min(y_train),min(y_repeat),min(y_test),min(y_hat)])
maxi = max([max(y_train),max(y_repeat),max(y_test),max(y_hat)])
fig.line([mini,maxi],[mini,maxi],line_color="grey",line_dash="dashed")
fileName = functionNode.get_child("outputFileName").get_value()
filePath = os.path.join(myDir,'./../web/customui/'+fileName)
fig.legend.location = "top_left"
output_file(filePath,mode="inline")
save(fig)
return True
def prepare_annos_filter(functionNode):
0
View Source File : varstatistics.py
License : MIT License
Project Creator : smartyal
License : MIT License
Project Creator : smartyal
def varstatistics(functionNode):
logger = functionNode.get_logger()
logger.info("==>>>> statistics " + functionNode.get_browse_path())
progressNode = functionNode.get_child("control").get_child("progress")
progressNode.set_value(0)
#functionNode.get_child("control.signal").set_value(None)
vars = functionNode.get_child("variable").get_targets()
widget = functionNode.get_child("widget").get_target()
bins = functionNode.get_child("bins").get_value()
tags = functionNode.get_child("annotations").get_value()
startTime = date2secs(widget.get_child("startTime").get_value())
endTime = date2secs(widget.get_child("endTime").get_value())
vars = {var.get_id():{"node":var} for var in vars}
#first 30% progress:
prog = Progress(progressNode)
progressNode.set_value(0.1)
prog.set_offset(0.1)
#prog.set_divisor()
if tags:
allAnnoNodes = widget.get_child("hasAnnotation.annotations").get_leaves()
allAnnos=[]
prog.set_divisor(len(allAnnoNodes)/0.2)
for index,node in enumerate(allAnnoNodes):
prog.set_progress(index)
if node.get_child("type").get_value()=="time":
thisTags = node.get_child("tags").get_value()
if any(tag in tags for tag in thisTags):
anno = {}
for child in node.get_children():
anno[child.get_name()]=child.get_value()
if date2secs(anno["startTime"])>=startTime and date2secs(anno["endTime"]) < =endTime and (anno["startTime"] < anno["endTime"]): #take this anno only if it is inside the current start/end time
allAnnos.append(anno)
if allAnnos == []:
give_up(functionNode,"no matching annotations in selected time")
return False
else:
allAnnos=[]
progressNode.set_value(0.3)
logger.debug(f"statistics annotations to look at: {len(allAnnos)}")
prog.set_offset(0.3)
totalAnnos = max(len(allAnnos),1)
totalCount = len(vars)*totalAnnos
prog.set_divisor(totalCount/0.3)
totalValids = 0
for varIndex,var in enumerate(vars):
info = vars[var]
if tags:
#iterate over all start and end times
values = numpy.asarray([],dtype=numpy.float64)
for annoIndex,anno in enumerate(allAnnos):
thisValues = info["node"].get_time_series(anno["startTime"],anno["endTime"])["values"]
values = numpy.append(values,thisValues)
myCount = varIndex*totalAnnos+annoIndex
prog.set_progress(myCount)
else:
values = info["node"].get_time_series(startTime,endTime)["values"]
valids = numpy.count_nonzero(numpy.isfinite(values))
totalValids+=valids
hist, edges = numpy.histogram(values, bins=bins)
hist=hist/len(values) #normalize
info["hist"]=hist
info["edges"]=edges
#make a plot
if totalValids == 0:
give_up(functionNode,"all Variables are have no data in the time and annotations selected")
return False
progressNode.set_value(0.6)
hover1= HoverTool(tooltips=[ ( 'x,y','$x,$y')],mode='mouse')
hover1.point_policy='snap_to_data'
hover1.line_policy = "nearest"
tools = [PanTool(), WheelZoomTool(),BoxZoomTool(),ResetTool(),SaveTool(),hover1]
title = "Statistics of "+str([info["node"].get_name() for var,info in vars.items()])
if tags:
title = title + " in annotation: "+ str(tags )
fig = figure(title = title,tools=tools,plot_height=300)
fig.toolbar.logo = None
curdoc().theme = Theme(json=themes.darkTheme)
fig.xaxis.major_label_text_color = themes.darkTickColor
fig.yaxis.major_label_text_color = themes.darkTickColor
for index,var in enumerate(vars):
info = vars[var]
col = themes.darkLineColors[index]
hist = info["hist"]
edges = info["edges"]
fig.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:],
fill_color=col, line_color=col, alpha=0.8,legend_label=info["node"].get_name())
fig.legend.location = "top_left"
fileName = functionNode.get_child("fileName").get_value()
filePath = os.path.join(myDir,'./../web/customui/'+fileName)
# now make the trend box plot, but only for tags
# for each variable we create statistics for the annotations and prepare the data
# {"node":Node(), "boxLower":[], "boxUpper", "mean", "limitUpper", "limitLower"}
#
startTime = date2secs(widget.get_child("startTime").get_value()) #we only take tags that are inside the current zoom of the widgets
endTime = date2secs(widget.get_child("endTime").get_value())
boxPlots = []
allTimes = []
if tags:
for index,var in enumerate(vars):
info={"node":vars[var]["node"],"boxLower":[],"boxUpper":[],"median":[],"time":[],"limitUpper":[],"limitLower":[],"mean":[]}
for anno in allAnnos:
data = info["node"].get_time_series(anno["startTime"],anno["endTime"])
if len(data["values"]):
data["values"] = data["values"][numpy.isfinite(data["values"])]
#remove the nan
if len(data["values"]):
#make the statistics
info["time"].append(numpy.median(data["__time"])*1000)
allTimes.append(numpy.median(data["__time"])*1000)
info["limitLower"].append(numpy.quantile(data["values"],0.01))
info["limitUpper"].append(numpy.quantile(data["values"],0.99))
info["boxLower"].append(numpy.quantile(data["values"],0.25))
info["boxUpper"].append(numpy.quantile(data["values"],0.75))
info["median"].append(numpy.median(data["values"]))
info["mean"].append(numpy.mean(data["values"]))
boxPlots.append(info)
format = "%Y-%m-%d-T%H:%M:%S"
custom = """var local = moment(value).tz('UTC'); return local.format();"""#%self.server.get_settings()["timeZone"]
hover = HoverTool(
tooltips=[ ( 'date','@x{%F}')],
formatters={ '@x' : CustomJSHover(code=custom)
},
mode='mouse'
)
hover.point_policy='snap_to_data'
hover.line_policy = "nearest"
tools = [PanTool(), BoxZoomTool(),WheelZoomTool(),ResetTool(),hover,SaveTool()]
fig2 = figure(title = "trends",tools=tools,plot_height=300,x_axis_type='datetime')
fig2.xaxis.major_label_text_color = themes.darkTickColor
fig2.yaxis.major_label_text_color = themes.darkTickColor
progressNode.set_value(0.7)
fig2.xaxis.formatter=DatetimeTickFormatter(years=format,days=format,months=format,hours=format,hourmin=format,minutes=format,minsec=format,seconds=format)
fig2.toolbar.logo = None
#fig2.line([1,2,3],[1,2,3])
#calc with of vbars
if len(allAnnos)>1:
xTimesStart = min(allTimes)
xTimesEnd = max(allTimes)
width = (xTimesEnd-xTimesStart)/2/len(allAnnos)
else:
width = 1000000
for index,info in enumerate(boxPlots):
#each info is for one variable
col = themes.darkLineColors[index]
fig2.segment(info["time"],info["limitUpper"],info["time"],info["boxUpper"],line_color=col)
fig2.segment(info["time"],info["limitLower"],info["time"],info["boxLower"],line_color=col)
width =20
#fig2.vbar(info["time"],width=width,bottom=info["median"],top=info["boxUpper"],fill_color=col,line_color="black",width_units='screen')
#fig2.vbar(info["time"],width=width,bottom=info["boxLower"],top=info["median"],fill_color=col,line_color="black",width_units='screen')
#upper box
sizUpper = numpy.asarray(info["boxUpper"])-numpy.asarray(info["median"])
medUpper = numpy.asarray(info["median"])+sizUpper/2
fig2.rect(x=info["time"],y=medUpper,width_units='screen',width=20,height=sizUpper,fill_color=col,line_color="black")
#lower box
sizLower = numpy.asarray(info["median"])-numpy.asarray(info["boxLower"])
medLower = numpy.asarray(info["median"])-sizLower/2
fig2.rect(x=info["time"],y=medLower,width_units='screen',width=20,height=sizLower,fill_color=col,line_color="black")
#sort data for line
x = numpy.asarray(info["time"])
y = numpy.asarray(info["mean"])
order = numpy.argsort(x)
x=x[order]
y=y[order]
fig2.line(x,y,line_color=col)
progressNode.set_value(0.8)
else:
#no fig2
pass
output_file(filePath,mode="inline")#inline: put the bokeh .js into this html, otherwise the default cdn will be taken, might cause CORS problems
if tags:
save(layout([[fig],[fig2]]))
else:
save(fig)
return True