Plotly Dash Отображение динамического числа графиков на основе SQL-запросов - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь заставить приложение отображать несколько графиков в сеточном формате всякий раз, когда пользователь изменяет ввод даты.Это то, что я имею до сих пор.Хотя, когда я запускаю приложение прямо сейчас, оно отображает только один, а не ВСЕ, графиков.Я не уверен, как кодировать это так, чтобы число отображаемых графиков было динамичным и чтобы они занимали достаточно места на экране того, кто запускает приложение.

import dash
from dash.dependencies import Input, Output
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import pyodbc
from datetime import datetime as dt

app = dash.Dash()

app.layout = html.Div(children=[
    html.Div(children='''
        Enter Date:
    '''),
    dcc.DatePickerSingle(id='date_picker_single', date=dt(2017, 12, 18)),
    html.Div(id='output-graphs'),
    ])


def connect_sql_server(driver, server, db):
    conn_sql_server = pyodbc.connect(
        r'DRIVER={' + driver + '};'
        r'SERVER=' + server + ';'
        r'DATABASE=' + db + ';'
        r'Trusted_Connection=yes;',
        autocommit=True
    )
    return conn_sql_server


@app.callback(
    Output(component_id='output-graphs', component_property='children'),
    [Input(component_id='date_picker_single', component_property='date')]
    )
def update_graphs(input_date):
    sql_conn = connect_sql_server('ODBC Driver 13 for SQL Server', 'Server', 'Database')
    cursor = sql_conn.cursor()
    cursor.execute(
        """ 
        exec QCMonotonicityGraphs ?
        """, [input_date])
    rows = cursor.fetchall()

    sql_data = []
    for row in rows:
        sql_data.append(list(row))
    labels = ['strike', 'last', 'call_put', 'title']
    df = pd.DataFrame.from_records(sql_data, columns=labels)

    unique_titles = df.title.unique()

    graphs = []

    for unique_title in unique_titles:
        title = unique_title
        call_strike = []
        call_last = []
        for row in rows:
            if row[2] == 'C' and row[3] == unique_title:
                call_strike.append(row[0])
                call_last.append(row[1])

        put_strike = []
        put_last = []
        for row in rows:
            if row[2] == 'P' and row[3] == unique_title:
                put_strike.append(row[0])
                put_last.append(row[1])

        graphs.append(dcc.Graph(
            id='example-graph',
            figure={
                'data': [
                    {
                        'x': call_strike,
                        'y': call_last,
                        'mode': 'lines+markers',
                        'name': 'call'
                    },
                    {
                        'x': put_strike,
                        'y': put_last,
                        'mode': 'lines+markers',
                        'name': 'put'
                    }
                ],
                'layout': {
                    'title': title
                }
            }
        ))

    return graphs


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

Пример

...