Python Da sh - Обновление выпадающих списков - PullRequest
0 голосов
/ 04 августа 2020

Я делаю приборную панель в Python, используя Da sh. У меня есть пара вопросов о моем коде и о том, как его улучшить.

Контекст:

У меня много данных (например, более 12 миллионов строк и ~ 30 столбцов), которые я помещаю в SQLite база данных. База данных SQLite все еще довольно большая (например, 2 ГБ). Мне не нужны все эти данные, и у меня есть запрос, который выполняет там преобразования (суммируя столбцы, сгруппированные по полю даты), который я затем использую для своей панели инструментов для диаграмм и т. Д. c.

Я хочу дать пользователю панели инструментов некоторую гибкость в выборе некоторых фильтров, чтобы дать другой тип представления. Например, выбор только клиентов с «Продуктом А» или выбор только клиентов-мужчин и т. Д. c. Итак, у меня есть несколько раскрывающихся списков для выбора этих параметров, которые затем должны обновить диаграммы. Это означает, что запрос SQL будет повторно запущен с использованием этих новых фильтров.

Вопросы

  1. Есть ли более быстрый способ сделать это? Что странно, когда я запускаю запрос на своем локальном компьютере, его выполнение занимает менее 1 минуты. Но когда я запускаю панель управления, когда я обновляю раскрывающиеся списки, это занимает около 5-6 минут, что будет невозможно использовать.

  2. Кажется, когда я быстро меняю два или другие варианты в раскрывающемся списке, обновление займет еще больше времени. Я догадываюсь, потому что он обновляет каждое отдельно? Значит, запрос будет выполняться несколько раз? Есть ли способ включить кнопку, которая будет запускать обратный вызов только тогда, когда я нажму на нее с новыми входами?

Код для справки:

import os
import dash
import dash_table
import dash_core_components as dcc
import dash_html_components as html
import plotly.graph_objects as go
import pandas as pd
import sqlite3

app = dash.Dash()

app.layout = html.Div(children=[

    html.H1(children='Dashboard'),

    html.Div(children='''
        Dashboard)
    '''),

    dcc.Dropdown(
        id='filter1',
        options=[
            {'label': 'Filter1Option1', 'value': 1},
            {'label': 'Filter1Option2', 'value': 0}
        ],
        value=[0,1],
        multi=True
    ),

    dcc.Dropdown(
        id='filter2',
        options=[
            {'label': 'Filter2Option1', 'value': 1},
            {'label': 'Filter2Option2', 'value': 0}
        ],
        value=[0,1],
        multi=True
    ),
        
    dcc.Graph(
        id='myGraph'
    )
            
])

@app.callback(
    dash.dependencies.Output('myGraph', 'figure'),
    [dash.dependencies.Input('filter1', 'value'),
     dash.dependencies.Input('filter2', 'value')])
def update_everything(filter1, filter2):
    conn = sqlite3.connect('dashboard_data.sqlite')

    query = (
    """
    QUERY BASED ON FILTERS. INVOLVES SOME CALCULATIONS AND GROUPING BY A DATE FIELD
    """
    )

    df = pd.read_sql(query, conn)

    conn.close()


    fig = go.Figure(data=go.Scatter(x=df['DATE'], y=df['METRIC']))
    fig.update_layout(
        yaxis_tickformat='%',
        title='My Graph'
    )
                                                 
    return fig

if __name__ == '__main__':
    app.run_server(debug=True, host='0.0.0.0', port=8050)
...