Hi an alle,
Ich kämpfe derzeit mit einigen Datenvisualisierungen. Ich habe eine riesige Tabelle mit Tausenden von Ereignissen, die inkl. erfasst werden. Start- und Endzeit verschiedener Ereignisse an verschiedenen Orten (diese werden als Text angezeigt) im folgenden Format, das ich erfolgreich konvertiert habe, um als Zeit erkannt zu werden:
Beginn: 2022-01-28T22:26:13
Ende: 2022-01-28T23:10:56
Ich möchte nun die Anzahl der parallelen Ereignisse visualisieren / zählen, dh alle resultierenden Zeiträume überlagern und die maximale Anzahl paralleler Ereignisse über die verschiedenen Orte sehen. Ich habe auch die Dauer als Differenz zwischen Start- und Endzeit zur Verfügung, falls dies benötigt wird....
Vielleicht kann mir einer helfen?
Beifall!
JMP16
Ich schlage vor, dass Sie das Gantt-Diagramm-Add-In herunterladen.Es bietet Ihnen eine großartige Möglichkeit, Ihre Veranstaltungen anzuzeigen.

txnelson,
Danke für den Hinweis, werde das Add-in herunterladen, da es recht brauchbar aussieht. Aber in meinem Fall wäre die y-Achse aufgrund der vielen Standorte, die ich habe, zu überladen.
Hier ist ein reduzierter Datensatz mit nur zwei Tagen, aber er sollte funktionieren. Ich brauche nicht unbedingt eine grafische Ansicht, aber zum Debuggen wäre es toll, eine Art Kontrolle darüber zu haben, ob die Anzahl der parallelen Ereignisse angemessen ist.
Danke im Voraus!!
Ulf
Wenn die Idee darin besteht, nur die maximale Anzahl von Überschneidungen für den Standort zu erhalten, können Sie zuerst alle Überschneidungen berechnen, indem Sie Start- und Endzeiten zu einer Matrix hinzufügen und diese dann sortieren, während Sie verfolgen, was Ende und was Start ist. Dann können Sie berechnen, wie viele Werte zwischen jedes Start-End-Paar passen.
Vielleicht funktioniert so etwas (könnte Probleme mit doppelten Werten haben):
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))
)
);

Sie sollten dies auch fast interaktiv in JMP tun können, indem Sie eine neue Datentabelle mit drei Spalten erstellen: Zeit, Zeittyp (Start, Ende) und ursprüngliche Zeilennummer. Sortieren Sie es dann aufsteigend und schreiben Sie eine Formel, um auf Überschneidungen zu prüfen (könnte vielleicht Lag() verwenden, ich habe Col Min (Row(), :Row) und Col Max (Row(), :Row()) und ihre Differenz verwendet) . Erstellen Sie abschließend eine Übersichtstabelle, um den maximalen Wert zu erhalten, / verbinden Sie sich basierend auf den Zeilennummern wieder mit der ursprünglichen Tabelle.

Zusammenfassung (max hier nicht hinzugefügt):

Es scheint leichte Unterschiede zwischen den beiden Methoden zu geben, also ist vielleicht eine von ihnen falsch. Möglicherweise durch doppelte Werte verursacht (ich habe auch fehlende Werte aus der interaktiven Methode gelöscht)

Es ist viel einfacher, nach möglichen Problemen zu suchen, wenn Sie eine Datentabelle dafür haben:

Auch die interaktive Methode kann mit dem erweiterten Protokoll von JMP16 sehr einfach per Skript erstellt werden.
Bearbeiten: Dies hat höchstwahrscheinlich folgende Probleme: 1. Wenn eine Zeit vor der überprüften Startzeit beginnt und nach der überprüften Endzeit endet, wird sie nicht berechnet, und 2. wenn die Zeit zwischen den überprüften Zeiten beginnt und endet, wird sie zweimal berechnet . Der zweite sollte ziemlich einfach zu beheben sein, aber der erste erfordert etwas mehr.
Beispiel zu 2. OriginalRowOrder beginnt und endet innerhalb von OriginalRowOrder 10 und wird zweimal berechnet:

Beispiel zu 1. OriginalRowOrder 13 beginnt und endet außerhalb von 14:

Edit2: Ich habe mir nicht die Mühe gemacht, herauszufinden, wie diese interaktiv erledigt werden können, also habe ich ziemlich schnell zwei Formeln geschrieben (hoffentlich sind sie richtig ...). Fehlende Werte müssen vor der Verwendung entfernt / umkodiert werden. OverlapsOutside kann etwas langsam werden, wenn es mit der Formel ohne zusätzliche Optimierungen ausgeführt wird.
OverlapsInside (sollte Problem2 lösen):
N Items(Associative Array(:OriginalRowOrder[Index(:MinRowForRow, :MaxRowForRow)])) - 1
OverlapsOutside (sollte Problem 1 lösen):
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 kann ausreichen, je nachdem, wie Sie Überlappungen berechnen möchten. Wenn Sie beides benötigen, erhalten Sie einfach die Summe dieser Werte.


Ich habe einige Probleme mit meinem anfänglichen Ansatz bemerkt, also habe ich noch einmal nachgedacht und ein neues Skript geschrieben, in der Hoffnung, dass es jetzt richtig ist. Dies könnte höchstwahrscheinlich schneller gemacht werden, indem nur Matrizenberechnungen verwendet werden, aber ich habe mich jetzt nicht darum gekümmert. Es lässt einige Datentabellen absichtlich offen, sodass es einfacher ist, zu überprüfen, ob die Werte korrekt sind
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>