Хотите создать две таблицы данных (таблица-1, таблица-2), у которых в качестве входных данных будет отдельный фрейм данных. Строки в таблице-2 должны быть заполнены на основе строк, выбранных в таблице-1. Не удалось вернуть data2, columns2 для заполнения таблицы-2, как в случае таблицы-1. Однако это работает при возврате всей таблицы данных.
Проблема заключается в дальнейшей обработке таблицы-2, требуются свойства таблицы данных, которые могут быть доступны только в том случае, если функция обратного вызова возвращает данные data2, columns2.
'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''» '' '' '' '' '' '' '' '' '' '' '' '' ''
import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
from datetime import date as dt
from datetime import timedelta
import dash_table
import pandas as pd
import os
os.chdir('C:\\Users\\......................')
from pbts import pbts_f
external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']
app = dash.Dash(__name__, external_stylesheets=external_stylesheets)
today = dt.today()
enddate = today.replace(day=1)
enddate = enddate - timedelta(days=1)
startdate = enddate - timedelta(days = 180)
startdate = startdate.replace(day=1)
enddate = startdate + timedelta(days = 3)
st = startdate
st = st.strftime('%Y%m%d')
ed = enddate
ed = ed.strftime('%Y%m%d')
n = 0.0
m = 0.0
(df1, df2) = pbts_f(st, ed, n, m)
app.layout = html.Div([
html.Div([
html.Div([
html.Label ('COB Date Range:', style = {'text-align' : 'left','padding-left' : 0}),
html.Div([
dcc.DatePickerRange(
id = 'COBdates',
min_date_allowed = dt(2019,1,1),
max_date_allowed = str(today),
start_date = startdate,
end_date = enddate
)
], style = {'padding' : 5, 'display': 'inline-block'}),
html.Div([html.Button('Submit Date Range', id = 'button')]),
], style = {'width': '40%', 'display': 'inline-block'}),
], style = {'padding' : 20}),
dcc.Tabs([
dcc.Tab(label='Tab1', children = [
html.Div([
html.Div([dash_table.DataTable(
id='table1',
columns = [{"name": i, "id": i} for i in df1.columns],
data = df1.to_dict('rows'),
sort_action='native',
filter_action='native',
row_selectable='multi',
)]),
])
]),
dcc.Tab(label='Tab2', children = [
html.Div([
html.Div(id = 'table2_memory', style = {'display' : 'none'}),
# html.Div(id='table3_div'),
html.Div([dash_table.DataTable(
id='table2',
data = [{}],
# data = df2.to_dict('rows'),
columns = [{"name": i, "id": i} for i in df2.columns],
sort_action='native',
filter_action='native',
row_selectable='multi',
)])
])
]),
], style = {'padding': 10}
),
])
@app.callback(
[Output('table1','data'), Output('table1','columns'),Output('table2_memory','children')],
[Input('button','n_clicks')],
[State('COBdates', 'start_date'), State('COBdates', 'end_date')]
)
def update_table1(n_clicks, start_date, end_date):
x = start_date
x = x[0:4] + x[5:7] + x[8:11]
st = x
y = end_date
y = y[0:4] + y[5:7] + y[8:11]
ed = y
(df1, df2) = pbts_f(st, ed, n, m)
columns1 = [{'name': i, 'id': i} for i in df1.columns]
data1 = df1.to_dict('records')
return data1, columns1, df2.to_json(date_format = 'iso', orient = 'split')
@app.callback(
[Output('table2', 'data'), Output('table2', 'columns')],
# [Output('table3_div', 'children')],
[Input('table1', "selected_rows"), Input('table2_memory', "children")],
[State('table1', "data")])
def update_table2(selected_rows, data, rows):
if selected_rows is None:
selected_rows = []
if rows is None:
dff1 = df1
else:
dff1 = pd.DataFrame(rows)
dff1 = dff1.iloc[selected_rows]
portfolioname = dff1['Portfolio_Name'].unique()
dff2 = pd.read_json(data, orient='split')
dff2 = dff2[dff2['Portfolio_Name'].isin (portfolioname)]
columns2 = [{"name": i, "id": i} for i in dff2.columns],
data2 = dff2.to_dict("rows")
return data2, columns2,
# return [html.Div([
# dash_table.DataTable(
# id='table2',
# columns = [{"name": i, "id": i} for i in dff2.columns],
# data = dff2.to_dict('rows'),
# style_cell = {'textAlign': 'left'},
# style_header = {'backgroundColor' : 'White', 'frontWeight' : 'bold'},
# sort_action='native',
# filter_action='native',
# row_selectable='multi',
# )]
# )]
if __name__ == '__main__':
app.run_server()