私は最近 Dash でアプリを構築しようとしていますが、多くのガイドを調べても、pandas dataframeをDashのデータにインポートする方法を理解できませんテーブル(これは本質的にpandasデータフレームです。Webでホストされ、リアクティブなものを除きます)。
ほとんどの例は、 here のように、例内ですでにハードコードされているデータフレームから取得した特定の列/行を手動で選択する方法を示しています。ただし、私の状況では、データフレームはコード内に構築されます(そしてpandasがこれを行う最も簡単な方法です)。そのため、pd.Dataframe()
をdash_table.DataTable()
に変換します。
どうすればこれを機能させることができますか?参照を使用して、次のコードを試してデータフレームのディクテーションをdash_table.DataTable()
に送信しましたが、何も表示されません。
私のコード:
## Imports
import dash
import dash_core_components as dcc
import dash_html_components as html
import dash_table
from dash.dependencies import Input, Output, State
import datetime as dt
import pandas as pd
import numpy as np
## Custom functions that creates the pandas dataframe
from Twitter_functions import old_tweets
app = dash.Dash(dev_tools_hot_reload=True)
app.scripts.config.serve_locally = True
app.config['suppress_callback_exceptions'] = True
app.layout = html.Div(children=[
html.H3('Twitter App'),
dcc.Input('ScreenName_Input', type='text'),
html.Button(id='screenNames_submit_button', children='Submit'),
dash_table.DataTable(id='Tweet_table')
])
@app.callback(
Output(component_id='Tweet_table', component_property='data'),
[Input(component_id='screenNames_submit_button', component_property='n_clicks_timestamp')],
[State(component_id='ScreenName_Input', component_property='value')]
)
def display_tweets(submit_button, screen_names):
tweets = old_tweets(screen_names)
return tweets.to_dict(orient='records')
if __name__ == '__main__':
app.run_server(debug=True)
someone も(ありがたいことに)不機嫌なフォーラムで私に返信した後、最終的な答えは、pandas dataframeの列でデータテーブルを事前設定することですそれはこのように、いつかそれに入るでしょう、
dash_table.DataTable(
id='table',
columns=[
{'name': 'Column 1', 'id': 'column1'},
{'name': 'Column 2', 'id': 'column2'},
{'name': 'Column 3', 'id': 'column3'},
{'name': 'Column 4', 'id': 'column4'},
{'name': 'Column 5', 'id': 'column5'}]
)
、次にpandas dataframe。
これは少し長いショットであり、テストされていませんが、 https://community.plot.ly/t/dash-datatable-using-callbacks/6756 に基づくと、Dash DataTablesには暗黙的にコールバックを介して変更する場合の初期値。
この行を変更してみてください:
dash_table.DataTable(id='Tweet_table')
これに:
dash_table.DataTable(id='Tweet_table', rows=[{}])
ここに私のために働いた別の解決策があります:
dt_col_param = []
for col in output_df.columns:
dt_col_param.append({"name": str(col), "id": str(col)})
dash_table.DataTable(
columns=dt_col_param,
data=output_df.to_dict('records')
)
私の最大の問題は、アプリがdash_table.DataTable(...)の 'columns'引数に渡そうとしたものに対して例外をスローし続けたことでした。
うまくいけば、これは何もハードコーディングする必要がないのに役立ちます。
ツイート関数がデータフレームを返すと仮定すると、テーブルの列を2番目の出力としてコールバックに追加すると機能するはずです。
@app.callback(
[Output(component_id='Tweet_table', component_property='data'),
Output(component_id='Tweet_table', component_property='columns')
[Input(component_id='screenNames_submit_button', component_property='n_clicks_timestamp')],
[State(component_id='ScreenName_Input', component_property='value')]
)
def display_tweets(submit_button, screen_names):
tweets = old_tweets(screen_names)
columns = [{'name': col, 'id': col} for col in tweets.columns]
data = tweets.to_dict(orient='records')
return data, columns