Salut tout le monde,
J'ai actuellement du mal avec la visualisation de données. J'ai une immense table contenant des milliers d'événements qui sont capturés incl. heure de début et de fin de différents événements à différents endroits (ceux-ci sont affichés sous forme de texte) dans le format suivant que j'ai converti avec succès pour être reconnu comme heure :
Début : 2022-01-28T22:26:13
Fin : 2022-01-28T23:10:56
Je voudrais maintenant visualiser/compter le nombre d'événements parallèles, c'est-à-dire superposer toutes les périodes résultantes et voir le nombre maximum d'événements parallèles sur les différents emplacements. J'ai aussi la durée disponible comme différence entre l'heure de début et l'heure de fin, donc au cas où cela serait nécessaire...
Peut-être que l'on peut m'aider ?
Acclamations!
JMP16
Salut @ubpk ,
peut-être que si vous nous donnez un petit échantillon dans un tableau, je peux essayer.
Je vous suggère de télécharger le complément de diagramme de Gantt.Il vous fournira un excellent moyen d'afficher vos événements.

txnelson,
Merci pour l'indice, je vais télécharger le complément car il semble tout à fait utilisable. Mais dans mon cas, l'axe y serait trop surchargé en raison du nombre d'emplacements que j'ai.
voici un ensemble de données réduit avec seulement deux jours, mais cela devrait faire l'affaire. Je n'ai pas nécessairement besoin d'une vue graphique, mais pour le débogage, ce serait bien d'avoir une sorte de contrôle pour savoir si le nombre d'événements parallèles est raisonnable.
Merci d'avance!!
Ulf
Si l'idée est d'obtenir uniquement un maximum de chevauchements pour l'emplacement, vous pouvez d'abord calculer tous les chevauchements en ajoutant des heures de début et de fin à une matrice, puis en la triant tout en gardant une trace de ce qui est fin et de ce qui est début. Ensuite, vous pouvez calculer le nombre de valeurs entre chaque paire début-fin.
Peut-être que quelque chose comme ça fonctionnera (peut avoir quelques problèmes avec des valeurs dupliquées):
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))
)
);

Vous devriez pouvoir le faire également de manière presque interactive dans JMP en créant une nouvelle table de données avec trois colonnes : Time, TypeOfTime(start,end) et le numéro de ligne d'origine. Ensuite, triez-le par ordre croissant et écrivez une formule pour vérifier les chevauchements (pourrait peut-être utiliser Lag(), j'ai utilisé Col Min(Row(), :Row) et Col Max(Row(), :Row()) et leur différence) . Enfin, créez une table récapitulative pour obtenir la valeur maximale / rejoignez la table d'origine en fonction des numéros de ligne.

Résumé (n'a pas ajouté max ici):

Il semble y avoir de légères différences entre les deux méthodes, alors peut-être que l'une d'entre elles est fausse. Peut-être causé par des valeurs en double (j'ai également supprimé les valeurs manquantes de la méthode interactive)

Il est beaucoup plus facile de rechercher les problèmes éventuels lorsque vous disposez d'un tableau de données :

De plus, la méthode interactive peut être scriptée très facilement avec le journal amélioré de JMP16.
Modifier : cela a très probablement les problèmes suivants : 1. si une heure commence avant l'heure de début vérifiée et se termine après l'heure de fin vérifiée, elle ne sera pas calculée et 2. si l'heure commence et se termine entre les heures vérifiées, elle sera calculée deux fois. . Le second devrait être assez facile à réparer, mais le premier nécessitera un peu plus.
Exemple de 2. OriginalRowOrder commence et se termine dans OriginalRowOrder 10 et est calculé deux fois :

Exemple de 1. OriginalRowOrder 13 commence et se termine en dehors de 14 :

Edit2 : Je n'ai pas pris la peine de comprendre comment ceux-ci pourraient être pris en charge de manière interactive, j'ai donc écrit assez rapidement deux formules (j'espère qu'elles sont correctes...). Les valeurs manquantes doivent être supprimées / recodées avant de les utiliser. OverlapsOutside peut devenir un peu lent s'il est fait avec une formule sans aucune optimisation supplémentaire.
OverlapsInside (devrait résoudre le problème 2):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside (devrait résoudre le problème 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 peut suffire, selon la façon dont vous souhaitez calculer les chevauchements. Si vous avez besoin des deux, obtenez simplement la somme de ces valeurs.


J'ai remarqué quelques problèmes avec mon approche initiale, j'ai donc repensé et écrit un nouveau script, en espérant qu'il soit maintenant correct. Cela pourrait très probablement être rendu plus rapide en utilisant uniquement des calculs matriciels, mais je n'ai pas pris la peine de le faire maintenant. Cela laisse volontairement quelques tables de données ouvertes, il est donc plus facile de vérifier si les valeurs sont correctes
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>