I’m trying to use DateRangePicker
and Dropdown
to callback a dash_table
. Actually I tried to call dropdown option first and then call dash_table
after calling options, but it didn’t work.
I don’t know how to add a second call back that is based on dropdown options.
Below is my code:
JavaScript
x
85
85
1
import pandas as pd
2
import numpy as np
3
from datetime import datetime
4
import plotly.express as px
5
import dash_html_components as html
6
import dash_core_components as dcc
7
from dash.dependencies import Input, Output
8
import dash_table
9
import dash_bootstrap_components as dbc
10
from datetime import datetime as dt
11
12
lst_str_cols = ['BR_CD']
13
dict_dtypes = {x : 'str' for x in lst_str_cols}
14
df = pd.read_excel('https://github.com/hoatranobita/test_datepicker/blob/main/MD6200(20150101_20201231)_2%20(1).xlsx?raw=true')
15
df['ISSUE_DATE_2'] = df['ISSUE_DATE']
16
df['ISSUE_DATE'] = pd.to_datetime(df['ISSUE_DATE'],infer_datetime_format=True,errors='coerce')
17
df.set_index('ISSUE_DATE',inplace=True)
18
19
app = dash.Dash(__name__,external_stylesheets=[dbc.themes.LUX])
20
21
branches = df['BR_CD'].unique().tolist()
22
23
app.layout = html.Div([
24
dbc.Row([
25
dbc.Col([html.H5('Drop Down',className='text-center'),
26
dcc.DatePickerRange(
27
id='my-date-picker-range', # ID to be used for callback
28
calendar_orientation='horizontal', # vertical or horizontal
29
day_size=39, # size of calendar image. Default is 39
30
end_date_placeholder_text="Return", # text that appears when no end date chosen
31
with_portal=False, # if True calendar will open in a full screen overlay portal
32
first_day_of_week=0, # Display of calendar when open (0 = Sunday)
33
reopen_calendar_on_clear=True,
34
is_RTL=False, # True or False for direction of calendar
35
clearable=True, # whether or not the user can clear the dropdown
36
number_of_months_shown=1, # number of months shown when calendar is open
37
min_date_allowed=dt(2015, 1, 1), # minimum date allowed on the DatePickerRange component
38
max_date_allowed=dt.today(), # maximum date allowed on the DatePickerRange component
39
initial_visible_month=dt.today(), # the month initially presented when the user opens the calendar
40
#end_date_placeholder_text='DD-MM-YYYY',
41
start_date=dt(2015, 1, 1).date(),
42
end_date=dt.today().date(),
43
display_format='DDMMYYYY', # how selected dates are displayed in the DatePickerRange component.
44
month_format='MMMM, YYYY', # how calendar headers are displayed when the calendar is opened.
45
minimum_nights=0, # minimum number of days between start and end date
46
persistence=True,
47
persisted_props=['start_date'],
48
persistence_type='session', # session, local, or memory. Default is 'local'
49
updatemode='singledate' # singledate or bothdates. Determines when callback is triggered
50
)],width={'size':4,"offset":0,'order':1}),
51
52
dbc.Col([html.H5('Drop Down',className='text-center'),
53
dcc.Dropdown(
54
id='filter_dropdown',placeholder="Please select branch code",
55
options=[{'label':br, 'value':br} for br in branches],
56
value = [],
57
multi=True,
58
disabled=False,
59
clearable=True,
60
searchable=True)],width={'size':2,"offset":0,'order':1}),
61
62
]),
63
64
dbc.Row([
65
dbc.Col([html.H5('Disbursement List',className='text-center'),
66
dash_table.DataTable(id='table-container',data=[],
67
columns=[{"name":i,"id":i,'type':'numeric'} for i in df.columns],
68
style_table={'overflow':'scroll','height':500},
69
style_cell={'textAlign':'center'})
70
],width={'size':12,"offset":0,'order':1})
71
])
72
])
73
74
@app.callback(Output('table-container', 'data'),
75
[Input('my-date-picker-range', 'start_date'),
76
Input('my-date-picker-range', 'end_date')])
77
78
def update_data(start_date, end_date):
79
data = df.loc[start_date: end_date]
80
return data.to_dict('rows')
81
82
83
if __name__ == '__main__':
84
app.run_server(debug=False, dev_tools_ui=False,port=8051)
85
Advertisement
Answer
You can include both filters in your callback as follows:
JavaScript
1
15
15
1
@app.callback(Output('table-container', 'data'),
2
[Input('my-date-picker-range', 'start_date'),
3
Input('my-date-picker-range', 'end_date'),
4
Input('filter_dropdown', 'value')])
5
def update_data(selected_start_date, selected_end_date, selected_branches):
6
7
# filter the data frame based on the DatePickerRange selection
8
data = df[(df.index >= selected_start_date) & (df.index <= selected_end_date)]
9
10
# filter the data frame based on the Dropdown selection
11
if selected_branches != []:
12
data = data[data['BR_CD'].isin(selected_branches)]
13
14
return data.to_dict(orient='records')
15