Sovrapposizione/Conteggio di periodi nello stesso momentoCiao 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: 28-01-2022 T22:26:13
Fine: 28/01/2022 T23:10:56
Vorrei ora visualizzare/contare il numero di eventi paralleli, ovvero sovrapporre tutti i periodi risultanti e vedere il numero massimo di eventi paralleli nelle diverse posizioni. Ho anche a disposizione la durata come differenza tra l'ora di inizio e quella di fine, quindi nel caso fosse necessario....
Forse qualcuno può aiutarmi?
Saluti!
JMP16
Esplorazione e visualizzazione dei datiPersonalizzazione di massafinestreRe: Sovrapposizione/Conteggio di periodi nello stesso momentoCi sono solo alcuni problemi con questo metodo (che ho notato in seguito), ma fortunatamente, poiché è un metodo interattivo, puoi vederli abbastanza facilmente dai dati (ho aggiunto alcune immagini di esempio). Anche questi potrebbero non essere un problema, a seconda di cosa viene calcolato.
1. Se una volta inizia prima dell'ora di inizio selezionata e termina dopo l'ora di fine selezionata, non verrà calcolata
2. Se il tempo inizia e finisce tra gli orari verificati, verrà calcolato due volte
Re: Sovrapposizione/Conteggio di periodi nello stesso momentoCIAO,
molte grazie per il tuo codice. L'ho controllato e potrebbe essere utile per altri scopi. MA: una tua idea
" Dovresti essere in grado di farlo anche in modo quasi interattivo in JMP creando un nuovo datatable con tre colonne: Time, TypeOfTime(start,end) e numero di riga originale. Quindi ordinalo in ordine crescente e scrivi una formula per verificare le sovrapposizioni (potresti 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/riunisci alla tabella originale in base ai numeri di riga."
era semplice e fantastico! Ho semplicemente impilato, ordinato per timestamp e implementato un canale formula che restituisce semplicemente +1/-1 in base al fatto che sia inizio o fine e quindi li ho riassunti in un altro canale. Funziona come un fascino!
Re: Sovrapposizione/Conteggio di periodi nello stesso momentoCiao Jthi,
prima di tutto molte grazie per il tuo impegno! Controllerò la soluzione il prima possibile e ti darò un feedback!!
Saluti
Ulf
Re: Sovrapposizione/Conteggio di periodi nello stesso momentoHo notato alcuni problemi con il mio approccio iniziale, quindi ho ripensato e scritto una nuova sceneggiatura, sperando che ora sia corretta. Molto probabilmente questo potrebbe essere reso più veloce utilizzando solo calcoli con matrici, ma non mi sono preoccupato di farlo ora. Lascia di proposito aperte alcune tabelle di dati, quindi è più semplice 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>Re: Sovrapposizione/Conteggio di periodi nello stesso momentoSe l'idea è quella di ottenere solo il numero massimo di sovrapposizioni per posizione, potresti prima calcolare tutte le sovrapposizioni aggiungendo gli orari di inizio e fine a una matrice e quindi ordinandola tenendo traccia di quale è la fine e quale è l'inizio. Quindi puoi calcolare quanti valori si adattano a ciascuna coppia inizio-fine.
Forse qualcosa del genere funzionerà (potrebbe avere qualche problema con 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(start,end) e numero di riga originale. Quindi ordinalo in ordine crescente e scrivi una formula per verificare le sovrapposizioni (potresti 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/riunirsi alla tabella originale in base ai numeri di riga.

Riepilogo (non ho aggiunto il massimo qui):

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

Molto più facile cercare possibili problemi quando si dispone di una tabella dati:

Anche il metodo interattivo può essere creato con script molto facilmente grazie al registro avanzato di JMP16.
Modifica: molto probabilmente questo presenta i seguenti problemi: 1. se una volta inizia prima dell'ora di inizio controllata e termina dopo l'ora di fine controllata, non verrà calcolata e 2. se l'ora inizia e finisce tra gli orari controllati, verrà calcolata 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 termina all'esterno di 14:

Modifica2: non mi sono preoccupato di capire come gestirli in modo interattivo, quindi ho scritto abbastanza rapidamente due formule (speriamo che siano corrette...). I valori mancanti devono essere rimossi/ricodificati prima di utilizzarli. OverlapsOutside potrebbe risultare un po' lento se eseguito con la formula senza ulteriori ottimizzazioni.
OverlapsInside (dovrebbe risolvere il problema 2):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside (dovrebbe risolvere il problema 1):
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 si desidera calcolare le sovrapposizioni. Se hai bisogno di entrambi, ottieni semplicemente la somma di questi valori.


Re: Sovrapposizione/Conteggio di periodi nello stesso momentoecco un set di dati ridotto con soli due giorni, ma dovrebbe fare il lavoro. Non ho necessariamente bisogno di una vista grafica, ma per il debug sarebbe bello avere un qualche tipo di controllo sul numero ragionevole di eventi paralleli.
Grazie in anticipo!!
Ulf
Re: Sovrapposizione/Conteggio di periodi nello stesso momento 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 di cui dispongo.
Re: Sovrapposizione/Conteggio di periodi nello stesso momentoTi suggerisco di scaricare il componente aggiuntivo del diagramma di Gantt.Ti fornirà un ottimo modo per visualizzare i tuoi eventi.

Re: Sovrapposizione/Conteggio di periodi nello stesso momentoCIAO @ubpk ,
forse se ci dai un piccolo campione in una tabella posso provarlo.
in caso contrario, dai un'occhiata alla tabella e all'immagine allegate e facci sapere se è la direzione giusta per iniziare. se esegui lo script nella tabella dati ottieni il grafico.
Ti auguro il meglio,
Ron
