Les salutations,
J'ai besoin d'aide pour scripter un processus en plusieurs étapes car je suis incapable d'abstraire une solution viable pour réaliser certains travaux de préparation des données.
J'ai des données de séries chronologiques qui se présentent sous la forme de plusieurs feuilles de calcul, contenant plusieurs onglets, et chaque onglet contient des données avec des noms de colonnes qui contiennent des métadonnées contextualisant les données.
Dans l'exemple ci-dessous, les colonnes avec "Descriptor" (colonnes 1,3 et 5) devraient en réalité être nommées "Date", mais contenir à la place des Descripteurs nécessaires à l'analyse.De plus, les colonnes Unit (2,4 et 6) devraient vraiment être nommées données mais contenir l'unité de mesure.
| Grand:Petit:Mouillé | mg | Mauvais : Bien : Moche | Hz | Port:Tribord:Vitesse | 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 | dix |
| 18/12/2021 | 3 | 18/12/2021 | sept | 18/12/2021 | 11 |
Idéalement, le tableau de données fini aurait la structure suivante.
| Date | DescripteurType1 | DescripteurType2 | DescripteurType3 | Unité | Données |
| 15/12/2021 | Grand | Petit | Mouiller | mg | 0 |
| 16/12/2021 | Grand | Petit | Mouiller | mg | 1 |
| 17/12/2021 | Grand | Petit | Mouiller | mg | 2 |
| 18/12/2021 | Grand | Petit | Mouiller | mg | 3 |
| 15/12/2021 | Mal | Bon | Moche | Hz | 4 |
| 16/12/2021 | Mal | Bon | Moche | Hz | 5 |
| 17/12/2021 | Mal | Bon | Moche | Hz | 6 |
| 18/12/2021 | Mal | Bon | Moche | Hz | sept |
| 15/12/2021 | Port | Tribord | Vitesse | ml | 8 |
| 16/12/2021 | Port | Tribord | Vitesse | ml | 9 |
Mes tentatives pour extraire les en-têtes de colonne dans un tableau séparé et les rejoindre avec des boucles for imbriquées n'ont pas réussi.Voici le code qui extrait et prépare les données de nom de colonne pour les exemples de données inclus.
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));La boucle for imbriquée (qui ne cherche qu'à remettre la description complète dans la table d'origine) est non seulement relativement lente (elle est nécessaire pour parcourir > 1 million d'entrées), mais elle n'écrit que les données manquantes dans les colonnes.
//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]))))
)
)
);Je suis prêt à abandonner l'approche consistant à extraire les données du nom de la colonne dans une table séparée.J'ai vraiment l'impression qu'il y a une approche plus simple qui me manque.
De manière interactive, c'est facile à faire avec un Pile de séries multiples .
Utilisez Tables->Stack et ajoutez toutes les colonnes au Pile de colonnes liste. Cliquez ensuite sur la case à cocher pour Pile de séries multiples . Ensemble Nombre de séries à 2 et ne vérifie pas Contigu .

Vous obtiendrez un tableau comme celui-ci :

Renommer le Données colonne à Date et le Étiquette 2 colonne à Unités .

Ensuite, vous pouvez utiliser Cols->Utilitaires-> Texte aux Cols... pour diviser la colonne Label en trois colonnes en utilisant deux points (":") comme délimiteur.

Vous obtiendrez ceci :

Si vous avez besoin de scripter cela, parce que c'est quelque chose que vous devez automatiser ou que vous le faites souvent, vous pouvez obtenir le script pour le script Stack from Source :
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 )
);
Vous devrez utiliser le < message pour changer les noms des colonnes.
stacked_dt:"Data" << Set Name( "Date" );
stacked_dt:"Label 2" << Set Name( "Units" );
Enfin, Text to Columns est également scriptable.
stacked_dt << Text To Columns(
delimiter( ":" ),
columns( :Label )
);
C'était exactement ce que j'espérais.Quelque chose de simple et que j'ai oublié.J'ai pu mettre cela en place assez rapidement.