Bir Dash DataTable'dan Second Dash DataTable'a besleme girişi

Aug 19 2020

Dash ile acemi olarak hızlı bir sorum var. Kullanıcı girişini kabul etmek, onu okumak, sonunda üzerinde bir işlem yapmak ve ardından ilkinin altında bir sonuç tablosu döndürmek için bir tablo kullanıyorum. Aşağıdaki kodum:

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import dash_table
import os
from dash.dependencies import Input, Output
import numpy as np

names = ['Player','Pos','Games','Rush Mkt Shr','Yds/Rush','Rush TD Rate','Tgt Mkt Shr','Yds/Rec','Rec TD Rate','Catch Rate','Int Rate','QB Snaps']
team_entries = pd.DataFrame(np.zeros((11,len(names))),columns = names)
team_entries['Pos']=['QB','RB','RB','RB','WR','WR','WR','WR','TE','TE','TEAM']
team_entries['Games'] = 16

app.layout = html.Div([
    html.Div(id='div1', children=[dash_table.DataTable(
        id='table-editing-simple',
        columns=([{'id': p, 'name': p} for p in team_entries.columns]),
        data=team_entries.to_dict('records'),
        editable=True
    )]),
    html.Div(id = 'div2', children=[dash_table.DataTable(id='table-editing-simple-output')])
])


@app.callback(
    Output('table-editing-simple-output', 'data'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return df.to_dict('records')


if __name__ == '__main__':
    app.run_server(debug=True)

Ne yazık ki 'table-edit-simple-output' kimliğine sahip ikinci tablo yazdırılmıyor ve bunun neden böyle olduğundan tam olarak emin değilim. İkinci olarak, çıktı tablosu için farklı sütun adlarına sahip olmak istersem, bunu nasıl yapabilirim?

Yanıtlar

1 JensD Aug 19 2020 at 18:45

Bunu bir deneyin: Geri arama işlevinizde, verileri döndürmek yerine, çıktınızı şu şekilde değiştirmeyi Output('div2', 'children')ve tamamen yeni bir tire verisi döndürmeyi deneyin :

@app.callback(
    Output('div2', 'children'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return dash_table.DataTable(
        id='table-output',
        columns=columns,
        data=rows,
    )

Bu şekilde, sütun adlarını da özgürce değiştirebilirsiniz! Çalışma kodu aşağıdaki gibidir:

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import dash_table
import os
from dash.dependencies import Input, Output
import numpy as np

names = ['Player','Pos','Games','Rush Mkt Shr','Yds/Rush','Rush TD Rate','Tgt Mkt Shr','Yds/Rec','Rec TD Rate','Catch Rate','Int Rate','QB Snaps']
team_entries = pd.DataFrame(np.zeros((11,len(names))),columns = names)
team_entries['Pos']=['QB','RB','RB','RB','WR','WR','WR','WR','TE','TE','TEAM']
team_entries['Games'] = 16
app = dash.Dash(__name__)
app.layout = html.Div([
    html.Div(id='div1', children=[dash_table.DataTable(
        id='table-editing-simple',
        columns=([{'id': p, 'name': p} for p in team_entries.columns]),
        data=team_entries.to_dict('records'),
        editable=True
    )]),
    html.Div(id = 'div2', children=[dash_table.DataTable(id='table-editing-simple-output')])
])


@app.callback(
    Output('div2', 'children'),
    [Input('table-editing-simple', 'data'),
     Input('table-editing-simple', 'columns')])
def display_output(rows, columns):
    df = pd.DataFrame(rows, columns=[c['name'] for c in columns])
    df['Games'] = df['Games']*2
    return dash_table.DataTable(
        id='table-output',
        columns=columns,
        data=rows,
    )


if __name__ == '__main__':
    app.run_server(debug=True)