Я делаю приборную панель в Python, используя Da sh. У меня есть пара вопросов о моем коде и о том, как его улучшить.
Контекст:
У меня много данных (например, более 12 миллионов строк и ~ 30 столбцов), которые я помещаю в SQLite база данных. База данных SQLite все еще довольно большая (например, 2 ГБ). Мне не нужны все эти данные, и у меня есть запрос, который выполняет там преобразования (суммируя столбцы, сгруппированные по полю даты), который я затем использую для своей панели инструментов для диаграмм и т. Д. c.
Я хочу дать пользователю панели инструментов некоторую гибкость в выборе некоторых фильтров, чтобы дать другой тип представления. Например, выбор только клиентов с «Продуктом А» или выбор только клиентов-мужчин и т. Д. c. Итак, у меня есть несколько раскрывающихся списков для выбора этих параметров, которые затем должны обновить диаграммы. Это означает, что запрос SQL будет повторно запущен с использованием этих новых фильтров.
Вопросы
Есть ли более быстрый способ сделать это? Что странно, когда я запускаю запрос на своем локальном компьютере, его выполнение занимает менее 1 минуты. Но когда я запускаю панель управления, когда я обновляю раскрывающиеся списки, это занимает около 5-6 минут, что будет невозможно использовать.
Кажется, когда я быстро меняю два или другие варианты в раскрывающемся списке, обновление займет еще больше времени. Я догадываюсь, потому что он обновляет каждое отдельно? Значит, запрос будет выполняться несколько раз? Есть ли способ включить кнопку, которая будет запускать обратный вызов только тогда, когда я нажму на нее с новыми входами?
Код для справки:
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)