Da JSON a tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?Ciao a tutti,
Sto usando JMP 15 e ho JSL che recupera un payload JSON tramite Http Request (), lo esegue tramite Char su Blob () e quindi lo apre () in una tabella di dati. Il contenuto del payload JSON è dinamico, ma è sempre mappabile in un formato tabulare (righe e colonne).
Il problema: se alcune chiavi nel JSON hanno tutti valori NULL, non sono incluse nella tabella dati (ovvero, non vengono create colonne per queste chiavi). Questo è problematico, perché voglio che tutte le chiavi nel JSON vengano visualizzate come colonne nella tabella dei dati, indipendentemente dal fatto che tutti i valori siano NULL o meno.
Se salvo il payload in un file locale e lo apro direttamente utilizzando Open(), ottengo il risultato desiderato: una tabella di dati in cui tutte le chiavi vengono convertite in colonne e tutti i valori NULL vengono visualizzati come NULL. Tuttavia, questo non funzionerà per il mio caso d'uso.
Ecco JSL di base che replica il problema. Invece di Http Request(), recupero i dati con Load Text File(), che dà gli stessi risultati. Il file "data.json" è allegato.
dt1 = Open("/Users/abc/data.json", JSON ); // works as desired
raw = Load Text File("/Users/abc/data.json");
jsonblob = Char To Blob( raw );
dt2 = open(jsonblob, "JSON", Guess("wide")); // does not work as desired -- drops all-NULL columnsQualcuno può suggerire un metodo per convertire JSON in una variabile in una tabella di dati che conserva le chiavi all-NULL?
Grazie!
Andy
Condivisione e comunicazione dei risultatiRi: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?Gli array JSON che non hanno elementi sono problematici per JMP.Un'opzione è sostituire gli array vuoti con array che hanno almeno un figlio.Puoi rendere quel figlio nullo o utilizzare il carattere del valore mancante - [.].Penso che questo significhi che non avrai più JSON valido ma JMP 16 lo leggerà comunque e in questo momento non c'è alcun piano per interrompere quel comportamento.L'utilizzo di null creerà una colonna di caratteri e l'utilizzo del valore mancante creerà una colonna numerica.Se sai che non ci sono dati di stringa nel tuo JSON che contengono [], puoi semplicemente apportare questa modifica
raw = Load Text File("$downloads/data.json");
jsonblob = Char To Blob( substitute(raw,"[]",".") );
dt2 = open(jsonblob, "JSON", Guess("wide"));
Se vuoi proteggerti dalla sostituzione di [] nelle stringhe JSON, ci vorranno alcune righe in più di jsl per saltare le stringhe, ma non dovrebbe comunque essere troppo difficile.
Ri: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?Grazie per la nota, @Craige_Hales .Ho segnalato la carenza rilevata nel punto 1 al team di sviluppo affinché venga presa in considerazione in una futura versione di JMP.
Per quello che vale, sembra che questi non eliminino le colonne null in JMP 14.3.
raw = Load Text File( "$DOWNLOADS/data.json" );
jsonblob = Char To Blob( raw );
dt2 = Open( jsonblob, "JSON", Guess( "wide" ) );
JSON To Data Table( raw, Guess( "wide" ) );
Ri: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?E se hai il controllo sulla fonte del json e puoi ottenerlo come un vero formato panda,
orient='table' (in python code)
potrebbe essere una buona scelta. L'importazione di JMP può utilizzare alcuni di questi metadati. JMP è in grado di leggere anche gli altri orientamenti.
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html
Ri: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?- OK, penso che l'opzione ampia sia l'opzione corretta da utilizzare ed è un bug che tutte le colonne mancanti vengano rimosse dall'importazione.@Wendy_Murphrey Certamente rende le cose complicate.
- Se conosci tutte le colonne possibili e solo un sottoinsieme sarà nel JSON, puoi elencarle tutte nelle Impostazioni JSON. Fai prima un piccolo test, verifica se funziona nel modo desiderato (non sono sicuro che otterrai l'intero set di colonne o solo il sottoinsieme che appare nel JSON).
- È ancora possibile accedere a una versione precedente del codice di importazione JSON; specificare JSON (senza il parametro JSON SETTINGS o Guess) può fare quello che vuoi.
blob=loadtextfile("$DESKTOP/data.json",blob);
Open(blob,JSON)- Il JSON non assomiglia esattamente a nessuno dei formati panda. Ma l'opzione pandas sembra recuperare i nomi delle colonne che desideri; se nient'altro funziona, potrebbe essere un punto di partenza per creare al volo le impostazioni JSON per una seconda importazione per ottenere davvero i dati.
- Non esiste un documento specifico sulle impostazioni JSON di cui sono a conoscenza; è pensato per essere scritto dal mago e ancora leggibile dall'uomo. Corrisponde ai valori della finestra di dialogo della procedura guidata e contiene alcuni documenti.
- Sono abbastanza sicuro che ImportSettings sia utilizzato dall'importazione CSV e forse qualcos'altro. Non vengono utilizzati dalla procedura guidata JSON.
(aggiornamento: un paio di piccole modifiche)
Ri: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?Grazie per i suggerimenti, Craig. Li ho provati e ho alcune domande di follow-up:
1. la modifica di Guess da "wide" a "pandas" include correttamente le colonne NULL nella tabella dei dati -- purtroppo introduce un nuovo problema: l'ultima "riga" di dati JSON viene ripetuta per ogni riga della tabella dei dati ( vedi "pandas.png", allegato -- Il numero di lotto 21055 è ripetuto due volte e il numero di lotto 21054 non è incluso. Ho replicato questo stesso comportamento con un set di dati più grande).
C'è qualche altro parametro o configurazione Open() che potrebbe correggere questo problema?
2. Sono stato in grado di importare correttamente il file data.json, comprese le colonne NULL, utilizzando la procedura guidata, tuttavia lo script che ha prodotto è specifico per il payload in data.json (vedere "script_view.png", allegato). Il mio caso d'uso è più generale: i payload ricevuti dal mio JSL variano in base al numero di colonne e alle etichette delle colonne. C'è un modo per utilizzare l'output della procedura guidata per creare un'opzione di configurazione più generica? O la mia unica opzione è scorrere manualmente il payload e costruire la tabella di dati colonna per colonna?
2b. In relazione a questo: puoi indicarmi qualsiasi documentazione per l'utilizzo del parametro "Impostazioni JSON" con Open ()? Non sono riuscito a trovare nulla nel riferimento alla sintassi o all'indice di scripting (e quando cerco su Google "JMP JSL" impostazioni JSON "', il risultato migliore è la mia domanda precedente su questo forum).
3. C'è un modo per forzare Open() a importare colonne vuote come numeriche? Ho provato "Tratta colonne vuote come numeriche (1)" nelle impostazioni di importazione e ha causato il trattamento del file data.json come una singola riga/record (vedi "pandas_numeric.png, allegato), quindi presumo che lo sto facendo qualcosa di sbagliato.
Grazie!
Andy
Ri: Da JSON alla tabella dati: come evitare che le colonne NULL vengano eliminate automaticamente?Ho scritto una risposta di seguito che potrebbe essere d'aiuto, poi ho capito che c'è una risposta semplice che dovresti provare prima. I dati sembrano essere uno dei formati dei panda, quindi cambia "wide" in "pandas".
Se risulta sbagliato, prova...
Utilizzare la procedura guidata per selezionare in modo esplicito le colonne, quindi utilizzare quello script.
You'll probably want the stack option too.You'll probably want the stack option too.Probabilmente vorrai anche l'opzione dello stack.
Ho anche cambiato il generatore di righe da root a items, perché è un po' più corretto. Probabilmente non farà una vera differenza.
L'elemento selezionato per Riga fa sì che una nuova riga venga scritta nella tabella dati ogni volta che si verifica tale elemento. Attiva le statistiche e puoi vedere gli elementi che si ripetono 2 volte.