Alimente la entrada de una tabla de datos de tablero a una segunda tabla de datos de tablero
Tengo una pregunta rápida como principiante con Dash. Estoy usando una tabla para aceptar la entrada del usuario, leerla, eventualmente realizar una acción en ella y luego devolver una tabla de resultados debajo de la primera. El siguiente es mi código:
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)
Desafortunadamente, la segunda tabla con el id 'table-edit-simple-output' no se imprime y no estoy muy seguro de por qué ese es el caso. En segundo lugar, si quisiera tener diferentes nombres de columna para la tabla de salida, ¿cómo podría hacerlo?
Respuestas
Pruébelo: en su función de devolución de llamada, en lugar de devolver datos, intente reemplazar su salida Output('div2', 'children')
y devolver una tabla de datos de tablero completamente nueva como esta:
@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,
)
De esta manera, también puede cambiar libremente los nombres de las columnas. El código de trabajo es el siguiente:
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)