Dash-Plotly Update dash_table.DataTable from dcc.Dropdown but per some specific range of values
Question:
I have been reading documentations as well as lots of posts in SO but am more confused than ever.
Below code runs and gets me Tables and Dropdowns but I’m stuck at this time on how to display table per dropdown.
The Table as a Column REM with numbers. The requirement is to display Table per range. For example ‘Expired’ is REM == 0 or less, ‘Expiring 1-5’ is REM == 1 to 5, ‘Expiring 6-10’ is REM from 6 to 10 and so on.
Looking at example; I sort of have idea what the callback function would look like but have no idea what to pass in df_0_days, df_5_days etc.
INPUT CSV file looks like:
import os
import csv
import json
import socket
import logging
import datetime
import subprocess
from dash_extensions.enrich import DashProxy, MultiplexerTransform
from dash import Dash, dash_table, dcc, html, no_update
from dash.dependencies import Input, Output, State
import dash_bootstrap_components as dbc
import plotly.graph_objects as go
import plotly.express as px
import dash_daq as daq
import pandas as pd
os.system("")
current_datetime = datetime.datetime.now()
expired_date = current_datetime.strftime("%Y-%m-%d")
expiry_date_5_days = current_datetime + datetime.timedelta(5)
expiry_date_10_days = current_datetime + datetime.timedelta(10)
expiry_date_15_days = current_datetime + datetime.timedelta(15)
df = pd.read_csv("testing_final_cert.csv")
count_df_total_certs = len(df.index)
print(df.to_string())
df_expired_list = {}
df_expiring_list_in_5_days = {}
df_expiring_list_in_10_days = {}
df_expiring_list_in_15_days = {}
counter = 0
for record in range(0, count_df_total_certs):
df_subject = df.iloc[record]['subject']
df_issuer = df.iloc[record]['issuer']
df_start_date = df.iloc[record]['startDate']
df_expiry_date = df.iloc[record]['endDate']
df_rem_day = int(df.iloc[record]['REM'])
df_owner = df.iloc[record]['OWNER']
if (df_rem_day <= 0):
df_expired_list.update({df_subject: df_rem_day})
print("df_0_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day > 0) and (df_rem_day <= 5)):
df_expiring_list_in_5_days.update({df_subject: df_rem_day})
print("df_5_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day >= 6) and (df_rem_day <= 10)):
df_expiring_list_in_10_days.update({df_subject: df_rem_day})
print("df_10_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day >= 11) and (df_rem_day <= 15)):
df_expiring_list_in_15_days.update({df_subject: df_rem_day})
print("df_15_days:n{0}".format(df.iloc[counter]))
counter = counter + 1
count_0_days = len(df_expired_list)
count_5_days = len(df_expiring_list_in_5_days)
count_10_days = len(df_expiring_list_in_10_days)
count_15_days = len(df_expiring_list_in_15_days)
df_count_of_expiring_list = [["Expired", "5-days", "10-days", "15-days"],
[count_0_days, count_5_days, count_10_days, count_15_days]]
app = DashProxy(prevent_initial_callbacks=True)
app.layout = html.Div([
dbc.Col(html.Div([
html.Label('Date filter'),
dcc.Dropdown(id='date_filter_dropdown2',
className="m-2",
options=[{'label': i, 'value': i} for i in
["All", "Expired", "Expiring 1-5-days", "Expiring 6-10-days", "Expiring 11-15-days"]],
searchable=True,
value='All',
placeholder='Select Expiration Date Filter from dropdown...', )]), width=6
),
dbc.Container([
dash_table.DataTable(
data=df.to_dict('records'),
columns=[{"name": i, "id": i} for i in df.columns],
id='df_table_id',
page_action="native",
page_current=0,
page_size=15,
sort_action="native",
sort_by=[{'column_id': 'REM', 'direction': 'asc'}],
style_as_list_view=False,
fixed_rows={'headers': False},
),
], fluid=True),
])
@app.callback(
Output(component_id='df_table_id', component_property='data'),
Input(component_id='date_filter_dropdown2', component_property='value')
)
def update_(value):
if value == 'All':
dff_merged = df
return dff_merged.to_dict('records')
if value == 'Expired':
dff_merged = df_0_days
return dff_merged.to_dict('records')
if value == 'Expiring 5-days':
dff_merged = df_5_days
return dff_merged.to_dict('records')
if value == 'Expiring 10-days':
dff_merged = df_10_days
return dff_merged.to_dict('records')
if value == 'Expiring 15-days':
dff_merged = df_15_days
return dff_merged.to_dict('records')
if __name__ == '__main__':
app.run_server(debug='True', host='0.0.0.0', port=7777)
Answers:
Solution usage as follows:
df_0_days = df[df.REM <= 0]
df_5_days = df[(df.REM >= 1) & (df.REM <= 5)]
df_10_days = df[(df.REM >= 6) & (df.REM <= 10)]
df_15_days = df[(df.REM >= 11) & (df.REM <= 15)]
I have been reading documentations as well as lots of posts in SO but am more confused than ever.
Below code runs and gets me Tables and Dropdowns but I’m stuck at this time on how to display table per dropdown.
The Table as a Column REM with numbers. The requirement is to display Table per range. For example ‘Expired’ is REM == 0 or less, ‘Expiring 1-5’ is REM == 1 to 5, ‘Expiring 6-10’ is REM from 6 to 10 and so on.
Looking at example; I sort of have idea what the callback function would look like but have no idea what to pass in df_0_days, df_5_days etc.
INPUT CSV file looks like:
import os
import csv
import json
import socket
import logging
import datetime
import subprocess
from dash_extensions.enrich import DashProxy, MultiplexerTransform
from dash import Dash, dash_table, dcc, html, no_update
from dash.dependencies import Input, Output, State
import dash_bootstrap_components as dbc
import plotly.graph_objects as go
import plotly.express as px
import dash_daq as daq
import pandas as pd
os.system("")
current_datetime = datetime.datetime.now()
expired_date = current_datetime.strftime("%Y-%m-%d")
expiry_date_5_days = current_datetime + datetime.timedelta(5)
expiry_date_10_days = current_datetime + datetime.timedelta(10)
expiry_date_15_days = current_datetime + datetime.timedelta(15)
df = pd.read_csv("testing_final_cert.csv")
count_df_total_certs = len(df.index)
print(df.to_string())
df_expired_list = {}
df_expiring_list_in_5_days = {}
df_expiring_list_in_10_days = {}
df_expiring_list_in_15_days = {}
counter = 0
for record in range(0, count_df_total_certs):
df_subject = df.iloc[record]['subject']
df_issuer = df.iloc[record]['issuer']
df_start_date = df.iloc[record]['startDate']
df_expiry_date = df.iloc[record]['endDate']
df_rem_day = int(df.iloc[record]['REM'])
df_owner = df.iloc[record]['OWNER']
if (df_rem_day <= 0):
df_expired_list.update({df_subject: df_rem_day})
print("df_0_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day > 0) and (df_rem_day <= 5)):
df_expiring_list_in_5_days.update({df_subject: df_rem_day})
print("df_5_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day >= 6) and (df_rem_day <= 10)):
df_expiring_list_in_10_days.update({df_subject: df_rem_day})
print("df_10_days:n{0}".format(df.iloc[counter]))
if ((df_rem_day >= 11) and (df_rem_day <= 15)):
df_expiring_list_in_15_days.update({df_subject: df_rem_day})
print("df_15_days:n{0}".format(df.iloc[counter]))
counter = counter + 1
count_0_days = len(df_expired_list)
count_5_days = len(df_expiring_list_in_5_days)
count_10_days = len(df_expiring_list_in_10_days)
count_15_days = len(df_expiring_list_in_15_days)
df_count_of_expiring_list = [["Expired", "5-days", "10-days", "15-days"],
[count_0_days, count_5_days, count_10_days, count_15_days]]
app = DashProxy(prevent_initial_callbacks=True)
app.layout = html.Div([
dbc.Col(html.Div([
html.Label('Date filter'),
dcc.Dropdown(id='date_filter_dropdown2',
className="m-2",
options=[{'label': i, 'value': i} for i in
["All", "Expired", "Expiring 1-5-days", "Expiring 6-10-days", "Expiring 11-15-days"]],
searchable=True,
value='All',
placeholder='Select Expiration Date Filter from dropdown...', )]), width=6
),
dbc.Container([
dash_table.DataTable(
data=df.to_dict('records'),
columns=[{"name": i, "id": i} for i in df.columns],
id='df_table_id',
page_action="native",
page_current=0,
page_size=15,
sort_action="native",
sort_by=[{'column_id': 'REM', 'direction': 'asc'}],
style_as_list_view=False,
fixed_rows={'headers': False},
),
], fluid=True),
])
@app.callback(
Output(component_id='df_table_id', component_property='data'),
Input(component_id='date_filter_dropdown2', component_property='value')
)
def update_(value):
if value == 'All':
dff_merged = df
return dff_merged.to_dict('records')
if value == 'Expired':
dff_merged = df_0_days
return dff_merged.to_dict('records')
if value == 'Expiring 5-days':
dff_merged = df_5_days
return dff_merged.to_dict('records')
if value == 'Expiring 10-days':
dff_merged = df_10_days
return dff_merged.to_dict('records')
if value == 'Expiring 15-days':
dff_merged = df_15_days
return dff_merged.to_dict('records')
if __name__ == '__main__':
app.run_server(debug='True', host='0.0.0.0', port=7777)
Solution usage as follows:
df_0_days = df[df.REM <= 0]
df_5_days = df[(df.REM >= 1) & (df.REM <= 5)]
df_10_days = df[(df.REM >= 6) & (df.REM <= 10)]
df_15_days = df[(df.REM >= 11) & (df.REM <= 15)]