Su base regolare sento dagli utenti di JMP che vogliono aggiornare la tabella dei dati con i nuovi dati piuttosto che creare una tabella dei dati completamente nuova. Ciò può avere una serie di ragioni: potresti aver già eseguito alcune operazioni di pulizia o ricodifica dei dati, desideri mantenere il tuo lavoro e l'analisi precedente salvata nella tabella dei dati o semplicemente devi aggiungere nuovi dati alla tabella dei dati esistente.
In Parte 1 di questa serie di due articoli ho parlato del primo scenario: dati strutturati verticali in un foglio di calcolo. Questo non è troppo complicato, importa i nuovi dati e concatenali a quello originale (considerando le righe già importate).
Oggi voglio parlare di un secondo scenario, che è un po' più complicato. Vedo questo caso abbastanza spesso quando guardo i dati dei clienti provenienti, ad esempio, dai laboratori. La tabella orizzontale dei dati strutturati:

Questa è la prima riga/prima colonna è il nome del parametro, nelle seguenti colonne sono i dati. Nella seconda riga ci sono le unità, nella terza riga il numero di lotto. Quindi una riga vuota e dopo ancora la stessa cosa per un altro parametro. Questo è più facile da leggere in un foglio di calcolo ma alla fine non molto facile da analizzare. Vedo spesso questo tipo di dati, anche se sarebbe molto meglio addestrare le persone a inserire i dati in modo verticale piuttosto che cercare di aggirare la struttura orizzontale.
Come puoi importare e aggiornare una tabella come questa in JMP? Cosa c'è di così difficile con quei dati?
Dobbiamo capire le sfide.
- Innanzitutto, i dati sono disposti in righe, ma più una sfida è che ci sono più righe che mostrano informazioni simili. Parametri (P1, P2, P3), Unità e stesso numero di lotto ripetuto per ciascun parametro
- In secondo luogo, abbiamo righe vuote per dividere i dati per facilitare l'interpretazione di cosa appartiene a cosa
Per un'analisi dei dati questo tipo di struttura non è nulla che una macchina possa amare, dovresti dire in modo specifico dove si trovano i dati ed eseguire l'analisi appropriata. Se vengono aggiunti nuovi dati a destra, è necessario regolare gli intervalli di dati dell'analisi in modo appropriato.
A causa di queste sfide, dobbiamo elaborare i dati prima di arrivare dove vogliamo essere.
Iniziamo a creare la tabella modello che vogliamo aggiornare
1. Accedi ai dati correnti dal foglio di calcolo così com'è:

2. Questa non è in realtà la tabella che vogliamo avere, quindi la rinominiamo in "help" e dobbiamo rimuovere le righe vuote, come preparazione per la trasposizione dei dati, nella codifica questo può apparire così:
dt_h1 << Set Name( name_worksheet || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
- Nota: ho utilizzato l'utilissimo comando LOC per individuare le righe vuote da eliminare
3. La prima colonna ha i nomi effettivi delle colonne che vogliamo avere nei dati finali. Vogliamo salvarli per un uso successivo. Quindi possiamo trasporre la tabella, fornirle il nome della tabella finale (come foglio di lavoro - poiché farò riferimento al nome della tabella per trovare automaticamente il foglio di lavoro corrispondente nel foglio di calcolo):
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( name_worksheet || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( name_worksheet )
);

4. Ora dobbiamo apportare alcune modifiche alla tabella dei dati:
- Rimuovi la prima colonna
- Rimuovi la prima riga
- Cambia i nomi delle colonne
- E infine imposta i dati e i tipi di modellazione corretti (a causa della prima riga tutto è stato impostato su carattere) e salva il file
- Per questo esempio rimuovi anche le ultime due righe in modo da poter testare lo script di aggiornamento senza aggiungere colonne al foglio di calcolo
- Nota: in base alle impostazioni di localizzazione del sistema e alla lingua di Office, potrebbe essere necessario occuparsi prima delle impostazioni delle preferenze in JMP o dei decimali/virgole (ad esempio con la ricodifica) prima di modificare i dati e il tipo di modellazione
Il tavolo finale dovrebbe assomigliare a questo:

Ora occupiamoci dello script di aggiornamento
La maggior parte di ciò di cui hai bisogno è già stata eseguita e salvata automaticamente negli script:
- Lo script sorgente di importazione
- Lo script sorgente di trasposizione
- Alcune delle manipolazioni sopra menzionate con esempi di script
Diamo un'occhiata allo script di aggiornamento finale che inseriremo in questa tabella modello come script:
1. Importa foglio di lavoro con il nome della tabella dati corrente
// Read in Sheet2 of the Excel workbook
excelFile = "TransposedExcelWorksheet.xlsx";
// Get the name of the data table and number of existing rows
cdt = Current Data Table();
cdtName = cdt << get name();
n_Rows = N Rows();
// Import the data invisible
dt_h1 = Open(
excelFile,
Worksheets( cdtName ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 0 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 1 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
),Invisible
);
2. Apportare le modifiche come descritto sopra per la tabella modello, trasporre e ripulire la tabella dati
dt_h1 << Set Name( cdtName || "help" );
// Remove rows with only missing values (break lines between measurements)
n = Loc( Column( 1 ) << Get Values, "" );
dt_h1 << Select Rows( n );
dt_h1 << Delete Rows;
// Get names used for column names after transposing the data table
NewNames = dt_h1:Column 1 << Get Values;
// Transpose Column
dt_final = Data Table( cdtName || "help" ) << Transpose(
columns( 1 :: N Cols( dt_h1 ) ),
Label column name( "ColName" ),
Output Table( cdtName )
);
// Clean up data table - delete first row of column names and first column (labels)
dt_final << Select Rows( 1 );
dt_final << Delete Rows();
Column( dt_final, "ColName" ) << Set Selected;
dt_final << Delete Columns();
// Set the Column Names appropriately based on deleted first row in this table
For( i = 1, i <= N Cols( dt_final ), i++,
col = Column( i );
col << Set Name( NewNames[i] );
);
3. Rimuovi le righe già importate e aggiungi resto alla tabella dati originale con concatena:
// remove rows already imported
dt_final << Select Rows( 1 :: n_Rows );
dt_final << Delete Rows();
// Append new data to original data table
cdt << Concatenate( dt_final, Append to first table );
// Close help data table
Close( dt_final );
Close( dt_h1 );<BR />
// this last bracket is to close the whole script!
);
- Nota: non è necessario occuparsi dei dati e del tipo di modellazione, poiché JMP sa già come trattare i dati grazie alle proprietà della colonna esistenti.
L'aggiunta di questo script alla tabella dei dati del modello ti consentirà di premere semplicemente un pulsante per ottenere i nuovi dati da un dato strutturato orizzontale in un foglio di calcolo.
Conclusione
Ciò ha comportato una serie di passaggi, alcuni facili da eseguire, altri più avanzati. La cosa bella è che puoi farlo in JMP. Tuttavia, ricorda sempre:
La preparazione dei dati è ciò che richiede più tempo per estrarre informazioni dai tuoi dati!
Se vuoi lavorare con i dati, usa una struttura su misura per l'analisi dei dati.
Questo è il più delle volte un approccio verticale, in cui ogni colonna rappresenta un parametro. Ma anche un approccio basato sulle righe può essere fatto, ma allora per favore in uno corretto.
Per fornire due esempi che faciliterebbero l'analisi:


- Nota: l'aggiunta di una nuova colonna per il nome del parametro elimina l'onere di riorganizzare i dati importati. E hai una variabile di raggruppamento che potresti usare come sovrapposizione o per gruppo nelle piattaforme di analisi. Questo evita di eseguire la stessa analisi per ogni colonna, ma lo fa in una sola volta.
Ovviamente puoi usarlo ed estenderlo aggiungendo analisi ai dati, come aggiornare un grafico di controllo o altre analisi di tendenza. Utilizzando l'Utilità di pianificazione di Windows potresti voler aggiornare il rapporto e inviarlo al nostro nuovo prodotto JMP in diretta , in modo che altre persone (non necessariamente utenti JMP con licenza) possano accedere ai report in un browser Web con l'interattività di JMP come filtro dati, commutatore di colonna e così via.
Sentiti libero di aggiungere i tuoi casi d'uso e / o approcci per fare qualcosa di simile. Sono felice di dare un'occhiata.
Ti auguro il meglio,
Martino
PS: Tre commenti ai file:
- In Sheet2.jmp troverai uno script per l'aggiornamento della tabella dati con il file Excel allegato. Entrambi i file devono essere salvati nella stessa cartella (questo era per semplicità, puoi facilmente cambiare il nome del file codificato con ad esempio Pick File(), ed anche estrarre il nome.
- Il secondo script è "Rimuovi ultime due righe" che consente di rimuovere righe nella tabella dati da aggiornare nuovamente dal foglio Excel, senza dover eliminare manualmente le righe. Quindi tutto per tua comodità
- ScriptUpdateHorizontal.jsl creerà la tabella di origine iniziale con lo script di aggiornamento e rimuoverà gli script delle ultime 2 righe aggiunti alla tabella di dati. Questo script si riferisce anche alla prima parte del blog, quindi puoi seguirlo.