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:

enter image description here

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)

Asked By: AliasSyed

||

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)]
Answered By: AliasSyed