web-dev-qa-db-ja.com

Python Dash:loading pandas dataframes into data table

私は最近 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)
3
Coolio2654

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。

8
Coolio2654

これは少し長いショットであり、テストされていませんが、 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=[{}])
2

ここに私のために働いた別の解決策があります:

     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
Jamie

ツイート関数がデータフレームを返すと仮定すると、テーブルの列を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
1
haydard