# -*- coding: utf-8 -*- from parameters import * from pandasdmx import Request from collections import OrderedDict import pandas as pd import math from subprocess import call from bokeh.io import curdoc, show from bokeh.layouts import row, column, layout, widgetbox, Spacer from bokeh.models import ColumnDataSource, DataRange1d, Select, DatetimeTickFormatter, NumeralTickFormatter, Plot, LinearAxis, Grid, LabelSet, Label, HoverTool, Div, CDSView, GroupFilter, Line, Legend, Title, FactorRange, CustomJS from bokeh.palettes import Blues4, Spectral6, Category10, Spectral10 from bokeh.plotting import figure from bokeh.models.glyphs import HBar, VBar from bokeh.models.widgets import RadioButtonGroup, PreText,DataTable, DateFormatter, TableColumn, RadioGroup, Panel, Tabs, Toggle, Button from pyjstat import pyjstat import requests from collections import OrderedDict from sortedcontainers import SortedDict import pickle def ReadMK(estattabela): pickle_out = "H:\\SDG\\pickle\\mk_" + estattabela + ".pickle" #za doma pickle_off = open(pickle_out,"rb") dfmk = pickle.load(pickle_off) return dfmk def ReadEstat(estattabela, titles, sourcemk, estatparam, dfmk): pickle_out = "H:\\SDG\\pickle\\" + estattabela + ".pickle" #za doma pickle_off = open(pickle_out,"rb") data = pickle.load(pickle_off) # Explore the data set. First, show dimension names s = data.columns.names # and corresponding dimension values s1 = data.columns.levels # Show aggregate unemployment rates across ages and sexes as # percentage of active population #s2 = data.loc[:, ('LI_R_MD60', 'PC', 'TOTAL', 'T')] s2 = data.loc[:, estatparam.get(estattabela)] # Create Column Data Source that will be used by the plot df = s2.set_index(s2.index.get_level_values(0)) s2.columns = s2.columns.droplevel() s2.columns = list(df.columns.levels[0]) s3 = s2.to_timestamp(freq='D', how='s', copy=True) if sourcemk.get(estattabela) == '1': s3.drop(columns=['MK'], inplace=True) s3 = pd.merge(left=s3, right=dfmk, how='left', left_on=s3.index, right_on=dfmk.index) s3.rename(columns={'value': 'MK', 'key_0': 'TIME_PERIOD'}, inplace=True) s3.set_index(['TIME_PERIOD'], inplace=True) s4 = s3.loc[:, ('MK', 'EU28')] #find last year with available data for q in range(1, 10): q1 = q*(-1) q2 = s3['MK'][q1] if math.isnan(q2): pass else: break s5 = s3.loc[(s3.index[q1]), :] s5.sort_values(axis=0, ascending=False, inplace=True) s5 = s5.to_frame() s5['new'] = s5.iloc[:,0] s5.drop(s5.columns[0], axis=1, inplace=True) s5['color'] = '#3288bd' s5.loc['MK','color'] = '#d53e4f' s5.drop('EU', inplace=True) s5.drop('EU27', inplace=True) s5.drop('EA19', inplace=True) s5.drop('EA18', inplace=True) year = s3.loc[(s3.index[q1]), :].name.year xx=s5.index.tolist() yy=s5['new'].tolist() boja = s5['color'].tolist() source = ColumnDataSource(data=s4) sourcebar = ColumnDataSource(dict(x=xx,top=yy, color=boja)) #print(source.data) #print(sourcebar.data) return s3, s4, s5, source, sourcebar, year def make_plotLine(source, title, subtitle, yunits): p2 = figure(x_axis_type="datetime", title=title, plot_width=800, plot_height=500) #p21 = p2.line(x='TIME_PERIOD', y='EU28', source=source, line_width=4, color="blue", alpha=0.5) p22 = p2.line(x='TIME_PERIOD', y='MK', source=source, line_width=4, color="red", alpha=0.5) p2.xaxis.axis_label = None p2.yaxis.axis_label = yunits p2.x_range = DataRange1d(range_padding=0.1) p2.grid.grid_line_alpha = 0.3 p2.xaxis.formatter=DatetimeTickFormatter( years=["%Y"] ) p2.min_border_bottom = 0 p2.yaxis.minor_tick_line_color = None p2.add_layout(Title(text=subtitle, text_font_style="italic"), 'above') legend = Legend(items=[ (s4.columns[0] , [p22]) ], location=(200, -10)) p2.add_layout(legend, 'below') p2.lod_timeout p2.legend.click_policy="hide" p2.legend.orientation = "horizontal" p2.title.text_font_size = '16pt' return p2 def make_plotBar(sourcebar, title, subtitle, yunits): sortedc = sorted(list(sourcebar.data['x']), key=lambda x: list(sourcebar.data['top'])[list(sourcebar.data['x']).index(x)], reverse=True) print('Od makePlot ', sortedc) p = figure(x_range=sortedc, plot_width=800, plot_height=500, title=title, toolbar_location=None) p.vbar(x='x', top='top', width=0.8, source=sourcebar, line_color='white', fill_color='color') p.xgrid.grid_line_color = None p.y_range.start = 0 p.xaxis.major_label_text_font_size = "7pt" p.yaxis.axis_label = yunits p.add_layout(Title(text=subtitle, text_font_style="italic"), 'above') p.title.text_font_size = '16pt' return p def update_plot(attrname, old, new): print("TUKA SUM VO UPDATE PLOT") print("INDIKATOR = : ", indikator) estattabela = '1' if sourcemk.get(estattabela) == '1': dfmk = ReadMK(estattabela) else: dfmk = pd.DataFrame({'A' : []}) #empty dataframe s3, s4, s5, source1, sourcebar1, year = ReadEstat(estattabela, titles, sourcemk, estatparam, dfmk) title = titles.get(estattabela)[0][0] titlebar = title + ', ' + str(year) subtitle = titles.get(estattabela)[0][1] yunits = titles.get(estattabela)[0][2] source.data.update(source1.data) sourcebar.data.update(sourcebar1.data) sortedc = sorted(list(sourcebar.data['x']), key=lambda x: list(sourcebar.data['top'])[list(sourcebar.data['x']).index(x)], reverse=True) plot_bar.x_range.factors = sortedc plot_line.title.text = title plot_bar.title.text = titlebar plot_line.update plot_bar.update estattabela = list(SortedDict(indicators.get('1')).keys())[0] title = titles.get(estattabela)[0][0] subtitle = titles.get(estattabela)[0][1] yunits = titles.get(estattabela)[0][2] if sourcemk.get(estattabela) == '1': dfmk = ReadMK(estattabela) else: dfmk = pd.DataFrame({'A' : []}) #empty dataframe s3, s4, s5, source, sourcebar, year = ReadEstat(estattabela, titles, sourcemk, estatparam, dfmk) # Create Input controls button1 = Button(label="", button_type="success", width=77, css_classes=['button_G1']) button2 = Button(label="", button_type="success", width=77, css_classes=['button_G2']) button3 = Button(label="", button_type="success", width=77, css_classes=['button_G3']) button4 = Button(label="", button_type="success", width=77, css_classes=['button_G4']) button5 = Button(label="", button_type="success", width=77, css_classes=['button_G5']) button6 = Button(label="", button_type="success", width=77, css_classes=['button_G6']) button7 = Button(label="", button_type="success", width=77, css_classes=['button_G7']) button8 = Button(label="", button_type="success", width=77, css_classes=['button_G8']) button9 = Button(label="", button_type="success", width=77, css_classes=['button_G9']) button10 = Button(label="", button_type="success", width=77, css_classes=['button_G10']) button11 = Button(label="", button_type="success", width=77, css_classes=['button_G11']) button12 = Button(label="", button_type="success", width=77, css_classes=['button_G12']) button13 = Button(label="", button_type="success", width=77, css_classes=['button_G13']) button14 = Button(label="", button_type="success", width=77, css_classes=['button_G14']) button15 = Button(label="", button_type="success", width=77, css_classes=['button_G15']) button16 = Button(label="G", button_type="success", width=77, css_classes=['button_G16']) button17 = Button(label="", button_type="success", width=77, css_classes=['button_G17']) indi = list(SortedDict(indicators.get('1')).keys()) brbut = len(indi) cmd22 = 'row(' for ii in range(1,brbut + 1): cmd11 = """pl%s = figure(name = '%s', plot_width = 40, plot_height = 40, x_range = (0, 10), y_range = (0, 10), tools = '', toolbar_location = None)""" % (ii, indi[ii-1]) exec(cmd11) cmd12 = """pl%s.image_url(url = ['/sdg/static/01_10.png'], x = [0], y = [10], w = [10], h = [10])""" % (ii) exec(cmd12) cmd13 = """pl%s.background_fill_color = '#ffd700'""" % (ii) exec(cmd13) cmd14 = """pl%s.xgrid.visible = False""" % (ii) exec(cmd14) cmd15 = """pl%s.ygrid.visible = False""" % (ii) exec(cmd15) cmd16 = """pl%s.xaxis.visible = False""" % (ii) exec(cmd16) cmd17 = """pl%s.yaxis.visible = False""" % (ii) exec(cmd17) cmd18 = """pl%s.css_classes = ['Ind']""" % (ii) exec(cmd18) if ii < brbut: cmd22 += 'pl%s, ' % (ii) elif ii == brbut: cmd22 += 'pl%s' % (ii) ''' radioButtonSdg = RadioButtonGroup( labels=list(SortedDict(indicators.get('1')).keys()), active=0, width=700,css_classes=['custom_button_G1']) radioButtonSdg.on_change('active', update_plot) ''' titlebar = title + ', ' + str(year) plot_line = make_plotLine(source, title, subtitle, yunits) plot_bar = make_plotBar(sourcebar, titlebar, subtitle, yunits) tab2 = Panel(child=plot_line, title="Time serie") tab1 = Panel(child=plot_bar, title="Comparison") tabs = Tabs(tabs=[tab2, tab1 ]) rb1 = row(button1, button2, button3, button4, button5, button6) rb2 = row(button7, button8, button9, button10, button11, button12) rb3 = row(button13, button14, button15, button16, button17) cmd21 = "r = column(rb1, rb2, rb3, tabs, " + cmd22 + '), name="Glavno")' exec(cmd21) #pl1.on_click('tap', update_plot) #pl1.on_event('tap', update_plot) #I tried something .....Doesn't work kod = """ var estattabela = cb_obj.get(value); var sursmk = sourcemk.get(estattabela) if (sursmk == '1'){ var dfmk = ReadMK(estattabela); } else{ var dfmk = pd.DataFrame({'A' : []}); } s3, s4, s5, source1, sourcebar1, year = ReadEstat(estattabela, titles, sourcemk, estatparam, dfmk) var title = titles.get(estattabela)[0][0] var titlebar = title + ', ' + str(year) var subtitle = titles.get(estattabela)[0][1] var yunits = titles.get(estattabela)[0][2] source.data.update(source1.data) sourcebar.data.update(sourcebar1.data) sortedc = sorted(list(sourcebar.data['x']), key=lambda x: list(sourcebar.data['top'])[list(sourcebar.data['x']).index(x)], reverse=True) plot_bar.x_range.factors = sortedc plot_line.title.text = title plot_bar.title.text = titlebar plot_line.update plot_bar.update """ #Doesn't work for ii in range(1,brbut+1): cmd31 = """callback%s = CustomJS(args = {'p': pl%s.name}, code=kod)""" % (ii, ii) exec(cmd31) cmd32 = """pl%s.js_on_event('tap', callback%s)""" % (ii, ii) exec(cmd32) curdoc().add_root(r) curdoc().title = "Main"