Abhishek Kulkarni
Abhishek Kulkarni

Reputation: 225

Creating bokeh data_table on pandas dataframe using for loop

The example code I am pasting is taken from the following link.

layout for multiple Data Table as children in each Bokeh Tab

from bokeh.models.widgets import Panel, Tabs, TableColumn,DataTable, Div
import numpy as np
from bokeh.io import output_notebook, show
from bokeh.models import ColumnDataSource
from bokeh.layouts import row, column, layout
from bokeh.layouts import row, column, Spacer 

output_notebook()

columns = [
        TableColumn(field="A", title="A"),
        TableColumn(field="B", title="B"),
        TableColumn(field="C", title="C"),
        TableColumn(field="D", title="D"),]


data1 = {"A":np.random.randint(23, 89, 10), 
        "B": np.random.randint(23, 89, 10), 
        "C": np.random.randint(23, 89, 10), 
        "D": np.random.randint(23, 89, 10)}
source1 = ColumnDataSource(data1)
p1 = DataTable(source=source1, columns=columns, width=300, height=200,editable=True)


data2 = {"A":np.random.randint(23, 89, 10), 
        "B": np.random.randint(23, 89, 10), 
        "C": np.random.randint(23, 89, 10), 
        "D": np.random.randint(23, 89, 10)}
source2 = ColumnDataSource(data2)      
p2 = DataTable(source=source2, columns=columns, width=300, height=200,editable=True)



data3 = {"A":np.random.randint(23, 89, 10), 
        "B": np.random.randint(23, 89, 10), 
        "C": np.random.randint(23, 89, 10), 
        "D": np.random.randint(23, 89, 10)}
source3 = ColumnDataSource(data3)       
p3 = DataTable(source=source3, columns=columns, width=300, height=200,editable=True)


dumbdiv = Div()
l1 = layout([[p1], [p2], [p3]], sizing_mode='fixed')


tab1 = Panel(child=l1, title="Three Tables")
tabs = Tabs(tabs=[tab1],sizing_mode='scale_width')
show(tabs)

It works perfectly fine. My question is, if I have 100(or even more) dataframes then is there an easy way (for loop perhaps) of creating layouts accordingly? In other words, the number of dataframes I have in a list can vary and I would like to know if the bokeh layout can be arranged accordingly. Something like:-

layout_list=[]
for i in range(len(df_list)):
    source = ColumnDataSource(df_list[i])
    p1 = DataTable(source=source1, columns=columns, width=300, height=200,editable=True)
    layout_list.append(p1)
tab1 = Panel(child=layout_list, title="Three Tables")
tabs = Tabs(tabs=[tab1],sizing_mode='scale_width')
show(tabs)

Thanks in advance.

Upvotes: 2

Views: 1401

Answers (1)

Abhishek Kulkarni
Abhishek Kulkarni

Reputation: 225

Thanks to other posts of @bigreddot, I figured it out.

mdf is a list of dataframes.

output_file("layout.html")
plots = []
for i in range(len(mdf)):
    print(i)
    source1 = ColumnDataSource(mdf[i])    
    Columns = [TableColumn(field=Ci, title=Ci) for Ci in mdf[i].columns]
    p1 = DataTable(source=source1,columns=Columns, width=3000, height=200,editable=True)
    plots.append(p1)

show(column(*plots))

Upvotes: 1

Related Questions