Grüße,
Ich benötige Hilfe beim Skripting eines mehrstufigen Prozesses, da ich keine praktikable Lösung abstrahieren kann, um einige Datenvorbereitungsarbeiten durchzuführen.
Ich habe Zeitreihendaten, die als mehrere Tabellenkalkulationen vorliegen, die mehrere Registerkarten enthalten, und jede Registerkarte enthält Daten mit Spaltennamen, die Metadaten enthalten, die die Daten kontextualisieren.
Im folgenden Beispiel sollten die Spalten mit "Deskriptor" (Spalten 1,3 und 5) eigentlich "Datum" heißen, aber stattdessen Deskriptoren enthalten, die für die Analyse benötigt werden.Außerdem sollten die Einheitenspalten (2, 4 und 6) eigentlich Daten heißen, aber die Maßeinheit enthalten.
| Groß:Klein:Nass | mg | Schlecht:Gut:Hässlich | Hz | Backbord:Steuerbord:Geschwindigkeit | ml |
| 15.12.2021 | 0 | 15.12.2021 | 4 | 15.12.2021 | 8 |
| 16.12.2021 | 1 | 16.12.2021 | 5 | 16.12.2021 | 9 |
| 17.12.2021 | 2 | 17.12.2021 | 6 | 17.12.2021 | 10 |
| 18.12.2021 | 3 | 18.12.2021 | 7 | 18.12.2021 | 11 |
Idealerweise hätte die fertige Datentabelle die folgende Struktur.
| Datum | DescriptorType1 | DeskriptorTyp2 | Deskriptortyp3 | Einheit | Daten |
| 15.12.2021 | Groß | Klein | Nass | mg | 0 |
| 16.12.2021 | Groß | Klein | Nass | mg | 1 |
| 17.12.2021 | Groß | Klein | Nass | mg | 2 |
| 18.12.2021 | Groß | Klein | Nass | mg | 3 |
| 15.12.2021 | Schlecht | Gut | Hässlich | Hz | 4 |
| 16.12.2021 | Schlecht | Gut | Hässlich | Hz | 5 |
| 17.12.2021 | Schlecht | Gut | Hässlich | Hz | 6 |
| 18.12.2021 | Schlecht | Gut | Hässlich | Hz | 7 |
| 15.12.2021 | Hafen | Steuerbord | Geschwindigkeit | ml | 8 |
| 16.12.2021 | Hafen | Steuerbord | Geschwindigkeit | ml | 9 |
Meine Versuche, die Spaltenüberschriften in eine separate Tabelle zu ziehen und mit verschachtelten for-Schleifen wieder zusammenzuführen, haben sich nicht als erfolgreich erwiesen.Hier ist Code, der die Spaltennamendaten für die enthaltenen Beispieldaten abruft und vorbereitet.
Names Default to Here(1);
//Get MainDT column Names
colNames = Data Table("Data") << Get Column Names;
//Create Empty Table
dtCols = New Table("DTCols");
//Put in Columns into the table
dtCols << New Column( "Columns", Character, Values(colNames));
//Label every other row for splitting
dtCols << New Column( "Data", formula( sequence(1,2,1)));
//Remove formula from Data column
dtCols:Data << Delete Formula;
<BR />//New column from which to split from
dtCols << New Column( "Type", formula(
If(
contains(:Columns, "Desc"), "Meta",
"Unit_Raw"
);
);
);
//Deleting formula for handling
dtCols:Type << Delete formula;
//Splitting the row based on the labelling
splitdtCols = dtCols << Split(
Split By( :Type ),
Split( :Columns ),
Sort by Column Property,
Output Table( "SplitDTCols" )
);
//Text to Columns by ":"
splitdtCols << text to columns(delimiter(":"), columns(:Meta));Die verschachtelte for-Schleife (die nur versucht, die vollständige Beschreibung wieder in die ursprüngliche Tabelle einzufügen) ist nicht nur relativ langsam (dies wird benötigt, um >1 Million Einträge zu durchlaufen), sondern schreibt nur fehlende Daten in die Spalten.
//Meta column back into Data
For(i = 1, i <= N Items(colNames), i++,
For(j = 1, j <= N Rows(splitdtCols), j++,
//show(splitdtCols:Meta[j]);
If( eval(char(colNames[i])) == eval(char(splitdtCols:Meta[j])),
Data Table("Data") << New Column("Descriptor", set Values(eval(char(splitdtCols:Meta[j]))))
)
)
);Ich bin bereit, den Ansatz aufzugeben, die Spaltennamendaten in eine separate Tabelle zu ziehen.Es fühlt sich wirklich so an, als ob es einen einfacheren Ansatz gibt, der mir fehlt.
Interaktiv geht das ganz einfach mit a Stapel mehrerer Serien .
Verwenden Sie Tabellen-> Stapel und fügen Sie alle Spalten zu den Spalten stapeln aufführen. Klicken Sie dann auf das Kontrollkästchen für Stapel mehrerer Serien . Satz Anzahl der Serien zu 2 und nicht checken Angrenzend .

Sie erhalten eine Tabelle wie diese:

Benennen Sie die um Daten Spalte zu Datum und das Etikett 2 Spalte zu Einheiten .

Dann können Sie Cols->Utilities-> . verwenden Text an Spalten... um die Label-Spalte in drei Spalten aufzuteilen, indem Sie einen Doppelpunkt (":") als Trennzeichen verwenden.

Sie erhalten dies:

Wenn Sie dies skripten müssen, weil dies etwas ist, das Sie automatisieren müssen oder dies häufig tun, können Sie das Skript für das Skript Stack from Source abrufen:
stacked_dt = Data Table( "445470" ) << Stack(
columns(
:"Big:Small:Wet"n, :mg, :"Bad:Good:Ugly"n, :Hz, :"Port:Starboard:Speed"n,
:mL
),
Source Label Column( "Label" ),
Stacked Data Column( "Data" ),
Number of Series( 2 )
);
Sie müssen die verwenden < Nachricht, um die Namen der Spalten zu ändern.
stacked_dt:"Data" << Set Name( "Date" );
stacked_dt:"Label 2" << Set Name( "Units" );
Schließlich ist Text to Columns auch skriptfähig.
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);
Das war genau das, was ich erhofft hatte.Etwas Einfaches, das ich übersehen habe.Das konnte ich relativ schnell umsetzen.