Ciao a tutti,
Attualmente ho difficoltà con la visualizzazione dei dati. Ho una tabella enorme contenente migliaia di eventi che vengono catturati incl. ora di inizio e fine di diversi eventi in luoghi diversi (questi vengono visualizzati come testo) nel seguente formato che ho convertito con successo per essere riconosciuto come ora:
Inizio: 2022-01-28T22:26:13
Fine: 28-01-2022 T23:10:56
Ora vorrei visualizzare/contare il numero di eventi paralleli, cioè sovrapporre tutti i periodi risultanti e vedere il numero massimo di eventi paralleli nelle diverse posizioni. Ho anche la durata disponibile come differenza tra l'ora di inizio e quella di fine, quindi nel caso fosse necessario....
Forse uno può aiutarmi?
Saluti!
JMP16
Ciao @ubpk ,
forse se ci dai un piccolo campione in una tabella posso provarlo.
Ti suggerisco di scaricare il Gantt Chart Addin.Ti fornirà un ottimo modo per mostrare i tuoi eventi.

txnelson,
Grazie per il suggerimento, scaricherò il componente aggiuntivo poiché sembra abbastanza utilizzabile. Ma nel mio caso, l'asse y sarebbe troppo sovraccarico a causa della quantità di posizioni che ho.
ecco un set di dati ridotto con solo due giorni, ma dovrebbe fare il lavoro. Non ho necessariamente bisogno di una vista grafica, ma per il debug sarebbe fantastico avere un qualche tipo di controllo sul fatto che il numero di eventi paralleli sia ragionevole.
Grazie in anticipo!!
Ulf
Se l'idea è di ottenere solo la quantità massima di sovrapposizioni per la posizione, puoi prima calcolare tutte le sovrapposizioni aggiungendo i tempi di inizio e fine a una matrice e quindi ordinandola tenendo traccia di cosa è fine e cosa è inizio. Quindi puoi calcolare quanti valori si adattano a ciascuna coppia inizio-fine.
Forse qualcosa del genere funzionerà (potrebbe avere dei problemi con i valori duplicati):
Names Default To Here(1);
dt = Current Data Table();
dt << New Column("Overlap", Numeric, Continuous);
dt << Sort(By(:"Start time (UTC)"n), Replace Table, Order(Ascending));
starts = dt[0, 1];
ends = dt[0, 2];
m = Sort Ascending(starts |/ ends);
For Each Row(dt,
start = :"Start time (UTC)"n;
end = :"End time (UTC)"n;
:Overlap = Loc(m, end)[1] - Loc(m, start)[1] - 1;
);
/*
dt << New Column("MaxOverlap", Numeric, Continuous, << Set Each Value(
Col Max(:Overlap, :Location)
));
*/
tab = dt << Tabulate(
Show Control Panel(0),
Add Table(
Column Table(Statistics(Min, Mean, Max), Analysis Columns(:Overlap)),
Row Table(Grouping Columns(:Location))
)
);

Dovresti essere in grado di farlo anche in modo quasi interattivo in JMP creando un nuovo datatable con tre colonne: Time, TypeOfTime(inizio, fine) e numero di riga originale. Quindi ordinalo in ordine crescente e scrivi una formula per verificare le sovrapposizioni (potrebbe forse usare Lag(), ho usato Col Min(Row(), :Row) e Col Max(Row(), :Row()) e la loro differenza) . Infine, crea una tabella di riepilogo per ottenere il valore massimo / unisciti alla tabella originale in base ai numeri di riga.

Riepilogo (non ha aggiunto il massimo qui):

Sembra che ci siano lievi differenze tra i due metodi, quindi forse uno di loro è sbagliato. Forse causato da valori duplicati (ho anche eliminato i valori mancanti dal metodo interattivo)

Molto più facile cercare possibili problemi quando hai una tabella di dati per questo:

Anche il metodo interattivo può essere creato facilmente tramite script con il log avanzato di JMP16.
Modifica: molto probabilmente presenta i seguenti problemi: 1. se un tempo inizia prima dell'ora di inizio verificata e termina dopo l'ora di fine verificata, non verrà calcolato e 2. se il tempo inizia e finisce tra gli orari verificati, verrà calcolato due volte . Il secondo dovrebbe essere abbastanza facile da risolvere, ma il primo richiederà un po' di più.
Esempio di 2. OriginalRowOrder inizia e termina all'interno di OriginalRowOrder 10 e viene calcolato due volte:

Esempio di 1. OriginalRowOrder 13 inizia e finisce fuori 14:

Modifica 2: non mi sono preoccupato di capire come gestirli in modo interattivo, quindi ho scritto abbastanza rapidamente due formule (si spera che siano corrette...). I valori mancanti devono essere rimossi/ricodificati prima di utilizzarli. OverlapsOutside potrebbe diventare un po' lento se fatto con la formula senza ulteriori ottimizzazioni.
OverlapsInside (dovrebbe risolvere il problema2):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside (dovrebbe risolvere il problema1):
If(Row() == 1,
m = :OriginalRowOrder << Get As Matrix
);
Try(
starts = Associative Array(m[Index(1, :MinRowForRow - 1)]);
ends = Associative Array(m[Index(:MaxRowForRow + 1, N Rows())]);
starts << Intersect(ends);
N Items(starts);
,
.
);
OverlapsInside potrebbe essere sufficiente, a seconda di come vuoi calcolare le sovrapposizioni. Se hai bisogno di entrambi, ottieni semplicemente la somma di quei valori.


Ho notato alcuni problemi con il mio approccio iniziale, quindi ho ripensato e scritto una nuova sceneggiatura, sperando che ora fosse corretta. Molto probabilmente questo potrebbe essere reso più veloce utilizzando solo calcoli di matrice, ma non mi sono preoccupato di farlo ora. Lascia alcune tabelle di dati aperte di proposito, quindi è più facile verificare se i valori sono corretti
Names Default To Here(1);
dt = Current Data Table();
dt << Clear Select;
dt << Sort(By(:"Start time (UTC)"n), Replace Table, Order(Ascending));
dt << New Column("Overlap", Numeric, Continuous);
dt << New Column("OriginalRowOrder", Numeric, Continuous, <<SET each="" value=""> :MaxRowForRow);
inside + outside; // if you need only inside, then don't calculate outside overlaps and just return inside
)
);
dt_overlaps << Update(
With(dt),
Match Columns(:OriginalRowOrder = :OriginalRowOrder),
Add Columns from Update Table(
:"Start time (UTC)"n, :"End time (UTC)"n, :Location
)
);
dt_statistics = dt_overlaps << Summary(
Group(:Location),
Min(:Overlaps),
Max(:Overlaps),
Range(:Overlaps),
Mean(:Overlaps),
Median(:Overlaps),
Freq("None"),
Weight("None"),
statistics column name format("stat"),
Link to original data table(0),
output table name("Overlap statistics by location")
);
f = Function({a},
selected_rows = dt_overlaps << Get Selected Rows;
dt_stack << Select Where(Contains(dt_overlaps[selected_rows, "OriginalRowOrder"], :OriginalRowOrder))
);
rs = dt_overlaps << make row state handler(f);</SET>