В Python da sh - как заполнить таблицу данных после чтения файла JSON из памяти обратного вызова - PullRequest
0 голосов
/ 05 апреля 2020

Хотите создать две таблицы данных (таблица-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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...