Hi everyone, I’ll try to explain briefly what I’m trying to achieve:
Basically I’m building a streamlit web app where the user has to upload a CSV file, then he will have the ability to choose if the entire CSV file or only the rows which come from the warning section should be displayed.
If he chooses to see the filtered data_editor he could edit some values so they should be reflected in the original data_editor which uploaded before.
with tab1: ## HOME
df = st.file_uploader("Carica il file csv", type=['csv'], label_visibility="visible")
if df is not None:
file_name = df.name
df = pd.read_csv(df)
st.toast("File caricato con successo o già caricato", icon="✅")
else:
time.sleep(100000)
st.error("ERRORE: Carica il file CSV")
if 'toCheck' not in df.columns:
df['toCheck'] = ''
toggle_csv = st.toggle("Visualizza il CSV caricato",value=True)
toggle_csv_errori = st.toggle("Visualizza solamente le righe relative agli eventuali warning nel CSV",value=False)
if not toggle_csv_errori and not toggle_csv:
st.info("Seleziona una modalità di visualizzazione del CSV caricato")
time.sleep(100000)
if toggle_csv:
edited_df = st.data_editor(df,key="dataframe_iniziale", num_rows='dynamic',hide_index=False,column_order=('Stato materiale','Materiale','Descrizione materiale','Lead time Stock (MTS) WD','Lead Time Spedizione/Commerciale (MTO/ATO) WD','Lead time proposta','SS actual','Raggruppamento temporale SAP actual codice','Lotto minimo actual','Classe Forecast','Canale comm.Tab.Gest.Fibonacci','Tipo materiale','Div. actual','MRP actual','GS actual','Contr. Disponibilità','Gerarchia prodotti','Descr. Gerarchia','Nuova Gerarchia Prodotti','Descr. Nuova Gerarchia','Somma di Qta ordinato 03/2023','Somma di Qta ordinato 04/2023','Somma di Qta ordinato 05/2023','Somma di Qta ordinato 06/2023','Somma di Qta ordinato 07/2023','Somma di Qta ordinato 08/2023','Somma di Qta ordinato 09/2023','Somma di Qta ordinato 10/2023','Somma di Qta ordinato 11/2023','Somma di Qta ordinato 12/2023','Somma di Qta ordinato 01/2024','Somma di Qta ordinato 02/2024','Tipo approvvigionamento','Approvv. Speciale','Giacenza 0103/2023','Giacenza 0104/2023','Giacenza 0105/2023','Giacenza 0106/2023','Giacenza 0107/2023','Giacenza 0108/2023','Giacenza 0109/2023','Giacenza 0110/2023','Giacenza 0111/2023','Giacenza 0112/2023','Giacenza 0101/2024','Giacenza 0102/2024','Costo std unit.','E: Lead time produzione TPI','F: Lead time di acquisto TCP','SAC','SC','SCT','PAL','Val.arrot.','Data creazione','Marchiatura','T ciclo (sec)'), column_config={"Classe Forecast" : st.column_config.SelectboxColumn(width="medium", options=[
"A - Materiali Generici",
"B - Materiali Personalizzati",
"C - Mat. non Gestiti a Stock"
]), "Canale comm.Tab.Gest.Fibonacci" : st.column_config.SelectboxColumn(width="medium", options=["EST Fil. Generico","EST No Fil. Generico","EST No Fil. Generico LT<20","EST No Fil. Pers Contr Baxi","EST No Fil. Personalizzato","ITA Listino generico","ITA Pers Contr Storm/Energy","ITA Pers Contr Storm/Energy"])})
#### WARNING SECTION ####
try:
edited_df['Stato materiale'] = edited_df['Stato materiale'].fillna('')
stato_materiale_list = edited_df['Stato materiale'].to_list()
indexes_stato_materiale = []
if 'ZX' in stato_materiale_list:
for idx, val in enumerate(stato_materiale_list):
if val == 'ZX':
indexes_stato_materiale.append(idx)
edited_df.loc[idx, 'toCheck'] = 'TRUE'
if indexes_stato_materiale:
st.warning(f"WARNING: Stato materiale contiene stati 'ZX': {indexes_stato_materiale}")
else:
pass
else:
pass
except Exception as e:
print(e)
# Coerenza Classe forecast e classe commerciale
try:
edited_df['Classe Forecast'] = edited_df['Classe Forecast'].fillna('')
edited_df['Canale comm.Tab.Gest.Fibonacci'] = edited_df['Canale comm.Tab.Gest.Fibonacci'].fillna('')
indexes_classe = []
for idx, (i, j) in enumerate(zip(edited_df['Classe Forecast'], edited_df['Canale comm.Tab.Gest.Fibonacci'])):
if 'Generici' in i and ('generico' in j or 'Generico' in j):
pass
elif ('Personalizzati' in i or 'Mat. non Gestiti a Stock' in i) and ('Personalizzato' in j or 'Pers' in j):
pass
else:
indexes_classe.append(idx)
edited_df.loc[idx, 'toCheck'] = 'TRUE'
if indexes_classe:
st.warning(f"WARNING: Classe Forecast e Canale comm.Tab.Gest.Fibonacci non coerenti: {indexes_classe}")
except Exception as e:
print(e)
if toggle_csv_errori:
filtered_dataframe = edited_df[edited_df['toCheck'] == 'TRUE']
st.data_editor(filtered_dataframe,key="filtered_df", num_rows='dynamic',hide_index=False,column_order=('Stato materiale','Materiale','Descrizione materiale','Lead time Stock (MTS) WD','Lead Time Spedizione/Commerciale (MTO/ATO) WD','Lead time proposta','SS actual','Raggruppamento temporale SAP actual codice','Lotto minimo actual','Classe Forecast','Canale comm.Tab.Gest.Fibonacci','Tipo materiale','Div. actual','MRP actual','GS actual','Contr. Disponibilità','Gerarchia prodotti','Descr. Gerarchia','Nuova Gerarchia Prodotti','Descr. Nuova Gerarchia','Somma di Qta ordinato 03/2023','Somma di Qta ordinato 04/2023','Somma di Qta ordinato 05/2023','Somma di Qta ordinato 06/2023','Somma di Qta ordinato 07/2023','Somma di Qta ordinato 08/2023','Somma di Qta ordinato 09/2023','Somma di Qta ordinato 10/2023','Somma di Qta ordinato 11/2023','Somma di Qta ordinato 12/2023','Somma di Qta ordinato 01/2024','Somma di Qta ordinato 02/2024','Tipo approvvigionamento','Approvv. Speciale','Giacenza 0103/2023','Giacenza 0104/2023','Giacenza 0105/2023','Giacenza 0106/2023','Giacenza 0107/2023','Giacenza 0108/2023','Giacenza 0109/2023','Giacenza 0110/2023','Giacenza 0111/2023','Giacenza 0112/2023','Giacenza 0101/2024','Giacenza 0102/2024','Costo std unit.','E: Lead time produzione TPI','F: Lead time di acquisto TCP','SAC','SC','SCT','PAL','Val.arrot.','Data creazione','Marchiatura','T ciclo (sec)'), column_config={"Classe Forecast" : st.column_config.SelectboxColumn(width="medium", options=[
"A - Materiali Generici",
"B - Materiali Personalizzati",
"C - Mat. non Gestiti a Stock"
]), "Canale comm.Tab.Gest.Fibonacci" : st.column_config.SelectboxColumn(width="medium", options=["EST Fil. Generico","EST No Fil. Generico","EST No Fil. Generico LT<20","EST No Fil. Pers Contr Baxi","EST No Fil. Personalizzato","ITA Listino generico","ITA Pers Contr Storm/Energy","ITA Pers Contr Storm/Energy"])})