Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.
Ciao a tutti,
Sto lavorando con due tabelle dati che ho unito utilizzando chiavi primarie ed esterne e che contengono migliaia di dati. Il mio obiettivo è visualizzare i valori di queste tabelle in menu a discesa (attualmente utilizzo ComboBox) e, in base alle selezioni, generare dinamicamente sottoinsiemi o tabelle trasposte.
Currently, I’m using ComboBox to populate unique values from the data tables, but performance is quite slow and especially with larger datasets. I’ve found that JMP’s built-in Data Filter is powerful but not very customizable for UI integration.
Esiste un modo per sfruttare il motore di filtro dati in background e collegarlo a menu a discesa personalizzati dell'interfaccia utente? Oppure esiste un approccio più efficiente per ottenere un filtro dinamico e reattivo tramite menu a discesa in JSL?
Ogni suggerimento o esempio sarà molto apprezzato!
Grazie in anticipo.
Automazione e scriptingAnalisi e modellazione dei dati di baseRe: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Date un'occhiata alle nuove viste filtro in JMP19.
Forse puoi usare la tabella dati stessa e la vista filtro sul lato destro della tabella:

quando sei soddisfatto della visualizzazione, aprila semplicemente come nuova tabella.
ulteriori dettagli possono essere trovati in questa discussione: Tutorial per sviluppatori: miglioramenti delle tabelle dati di @Mandy_Chambers .
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Stiamo passando dalla versione precedente di JMP a JMP 19. Quindi questa soluzione non funzionerà nella versione precedente. Avete qualche idea su come visualizzare più velocemente molti dati nel menu a discesa? I filtri dati sono più veloci, ma la loro interfaccia utente non è molto personalizzabile.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Quale parte è lenta per te? Creare la casella combinata? Cercare i valori? Creare il sottoinsieme?
Puoi condividere uno script di esempio, in quanto potrebbero esserci delle ottimizzazioni che potresti apportare.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.
COSA STO FACENDO:
1. Caricamento di due grandi tabelle di dati (una con più di 100.000 righe)
2. Unendoli tramite chiavi corrispondenti
3. Estrazione di valori univoci da tutte le colonne del filtro e memorizzazione in una tabella cache separata
4. Creazione di un'interfaccia utente personalizzata con più menu a discesa ComboBox (13 filtri in totale)
5. Caricamento dei valori ComboBox dalla tabella della cache
6. L'utente seleziona i valori dai menu a discesa e fa clic sul pulsante per creare un sottoinsieme filtrato
// This is simplified version:
Clear Log();
// Step 1-2: Load and join two tables
LoadAndJoinData = Function({},
dt_results = Data Table("Table1");
dt_tracker = Data Table("Table2");
// Join tables by matching key
dt_joined = dt_results << Join(
With(dt_tracker),
By Matching Columns(:key1 = :key2),
Drop multiples(0, 0),
Output Table("Joined_Data")
);
Return(dt_joined);
);
// Step 3: Create cache table with unique values - THIS IS SLOW
CreateFilterCache = Function({dt_source},
Print("Creating filter cache table...");
// Create cache table to store unique values
dt_cache = New Table("Filter_Cache",
New Column("Filter_Name", Character),
New Column("Filter_Value", Character)
);
column_list = {"Column1", "Column2", "Column3", "Column4", "Column5"};
current_row = 0;
For(i = 1, i <= N Items(column_list), i++,
col_name = column_list[i];
Print(" Processing: " || col_name);
// Extract unique values
col = Column(dt_source, col_name);
col_values = col << Get Values;
aa = Associative Array();
For(j = 1, j <= N Items(col_values), j++,
val = col_values[j];
If(!Is Missing(val) & val != "",
aa[val] = 1;
);
);
unique_list = aa << Get Keys;
unique_list = Sort Ascending(unique_list);
// Store in cache table
For(k = 1, k <= N Items(unique_list), k++,
current_row++;
dt_cache << Add Rows(1);
dt_cache:Filter_Name[current_row] = col_name;
dt_cache:Filter_Value[current_row] = unique_list[k];
);
);
Print("Cache table created with " || Char(N Rows(dt_cache)) || " entries");
Return(dt_cache);
);
// Step 5: Load unique values from cache table
GetValuesFromCache = Function({dt_cache, column_name},
value_list = {};
For(i = 1, i <= N Rows(dt_cache), i++,
If(dt_cache:Filter_Name[i] == column_name,
Insert Into(value_list, dt_cache:Filter_Value[i]);
);
);
Insert Into(value_list, "", 1);
Return(value_list);
);
// Step 4-5: Create filter window and load from cache
CreateFilterWindow = Function({dt_final, dt_cache},
Print("Loading dropdowns from cache...");
// Load from cache - STILL SLOW for large lists
unique_col1 = GetValuesFromCache(dt_cache, "Column1");
unique_col2 = GetValuesFromCache(dt_cache, "Column2");
unique_col3 = GetValuesFromCache(dt_cache, "Column3");
unique_col4 = GetValuesFromCache(dt_cache, "Column4");
unique_col5 = GetValuesFromCache(dt_cache, "Column5");
Print("Creating window...");
win = New Window("Custom Filter",
V List Box(
Panel Box("Select Filters",
V List Box(
H List Box(
Text Box("Filter 1:"),
cb_1 = Combo Box(unique_col1, "", <
<SET width="">
0, dt_subset = dt << Subset( Output Table Name("Filtered_" || Format(Today(), "yyyy-mm-dd")), Rows(rowList) ); Print("Subset created: " || Char(N Rows(dt_subset)) || " rows"); ); ) ) ); ); // Main execution dt_joined = LoadAndJoinData(); dt_cache = CreateFilterCache(dt_joined); // Create cache once CreateFilterWindow(dt_joined, dt_cache); // Use cached values
</SET>
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.L'utilizzo della tabella di riepilogo è un buon modo per ottenere valori univoci
Names Default To Here(1);
col_of_interest = "age";
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:age),
Freq("None"),
Weight("None"),
output table name("uniques"),
private
);
unique_ages = dt_summary[0, 1];
Close(dt_summary, no save);
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Grazie per il suggerimento. Ha sicuramente migliorato un po' le prestazioni, ma i menu a discesa sono ancora lenti perché contengono ancora molti dati univoci. Forse dovrei trovare un modo per usare un filtro dati e poi aggiungere dei pulsanti, perché potrebbe essere la soluzione migliore se non trovo una buona soluzione per i menu a discesa personalizzati.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Che ne dici di tabulare con un filtro dati?
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Tabulate(
Show Control Panel( 0 ),
Add Table( Row Table( Grouping Columns( :sex ) ), Row Table( Grouping Columns( :name ) ) ),
Local Data Filter( Mode( Show( 0 ) ), Add Filter( columns( :sex ), Where( :sex == "F" ) ) )
);
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.È possibile manipolare in qualche modo i filtri dei dati, ma ci si imbatterà rapidamente in limitazioni. A meno che il problema di velocità non risieda nelle caselle combinate (che le visualizzano), ci sono ancora molti elementi che possono essere ottimizzati. Se si riesce a fornire uno script per creare una tabella di esempio (o una tabella di esempio) da utilizzare per testare la velocità, sarà molto più facile dimostrare queste possibili ottimizzazioni.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Forse questo script potrebbe essere utile, dato che anche questa tabella contiene migliaia di righe.
Puoi rimuovere questa parte e sarai in grado di vedere il problema con le caselle combinate.
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// ========================================
// TEST SCRIPT - Single Column Filter (Table Air Traffic)
// Column - Flight ID
// ========================================
Clear Log();
// Todo: The associative array is not an appropriate method for large datasets with many unique values.
// Perhaps use the summary table or something else. Or find unique column values using hashing and storing in a temp table.
// Open the Air Traffic sample data table
dt = Open( "$SAMPLE_DATA/Air Traffic.jmp" );
// Safety check
If( Is Empty( dt ),
Throw( "No data table is open. Please open a data table first." );
);
Print( "Current Data Table: " || (dt << Get Name) );
Print( "Rows: " || Char( N Rows( dt ) ) );
Print( "Columns: " || Char( N Cols( dt ) ) || "\n" );
// METHOD 1: Use Summary table (most efficient for large datasets)
dt_summary = dt << Summary(
Group( :Flight ID ),
Freq( "None" ),
Weight( "None" ),
output table name( "Temp Summary" ),
private
);
unique_flights = dt_summary:Flight ID << Get Values;
Close( dt_summary, No Save );
// Truncate for testing purposes (Truncated it 50 rows this needs to be removed)
unique_flights = unique_flights[1 :: 50];
Show( N Items( unique_flights ) );
// // Sort unique values for faster lookup
// unique_flights = Sort List( unique_flights );
// Store reference to data table
::testDataTable = dt;
// Create filter window
::testFilterWindow = New Window( "Test Filter",
V List Box(
Text Box( "Select Flight ID:" ),
cb_flight = Combo Box( unique_flights, "" ),
H List Box(
Button Box( "Create Filtered Table",
sel_flight = cb_flight << Get Selected;
Print( "\n" || Repeat( "=", 60 ) );
Print( "Button clicked!" );
Print( "Selected Flight ID: " || Char( sel_flight ) );
// Use Where to filter (faster than For Each Row)
If( sel_flight != "",
rowList = ::testDataTable << Get Rows Where( :Flight ID == sel_flight );
Print( "Total rows matching filter: " || Char( N Items( rowList ) ) );
If( N Items( rowList ) > 0,
dt_subset = ::testDataTable << Subset(
Output Table Name( "Test Filtered - " || Format( Today(), "yyyy-mm-dd h:m:s" ) ),
Rows( rowList )
);
Print( "\nSUCCESS: Filtered table created!" );
Print( "Table: " || (dt_subset << Get Name) );
Print( "Rows: " || Char( N Rows( dt_subset ) ) );
Print( Repeat( "=", 60 ) || "\n" );
dt_subset << Bring Window To Front;
Close( ::testFilterWindow );
,
Print( "ERROR: No rows match the selected filter" );
Print( Repeat( "=", 60 ) || "\n" );
);
);
),
Button Box( "Cancel",
Close( ::testFilterWindow );
)
)
)
);
Ho riscontrato un problema simile e purtroppo ho dovuto passare al filtro dati.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Penso che scorrere 20.000 voci in una casella combinata sarebbe un'esperienza piuttosto negativa per l'utente, anche se funzionasse correttamente. In alternativa, ad esempio, si potrebbe utilizzare una casella di riepilogo con una ricerca aggiuntiva, che potrebbe migliorare l'esperienza utente. È possibile crearne una con JSL utilizzando una casella di modifica testo + casella di riepilogo, oppure utilizzare un filtro dati o un selettore di filtro, ad esempio.
Re: Qual è il modo migliore per visualizzare i dati come menu a discesa? Non il filtro dati.Grazie per aver condiviso questo script. In effetti, descrive accuratamente il problema che sto affrontando.