Automatizza l'apertura di un file hdf5Ciao,
Sto cercando di creare uno script .jsl che importerà i file hdf5 da Tensorflow, identificherà quanti file ci sono (kernel + bias) e li salverà come datatables per poi tradurli in un formato leggibile e utilizzabile come surrogato da JMP. Il modo in cui sto aprendo i datatables finora è molto manuale; Io uso
Open( "filename.h5", {"list_of", "dataset_names"});
per importare tutti i nomi dei set di dati. Tuttavia, per poter lavorare con i datatables, sto quindi utilizzando questo modo manuale (questo è per una ANN a 2 strati di Keras, l'ultimo kernel e lo strato di polarizzazione concatena gli altri insieme):
layer_0_bias = Data Table( "-model_weights-dense-dense-bias-0" ) << Get As Matrix();
layer_0_kernel = Data Table( "-model_weights-dense-dense-kernel-0" ) << Get As Matrix();
layer_1_bias = Data Table( "-model_weights-dense_1-dense_1-bias-0" ) << Get As Matrix();
layer_1_kernel = Data Table( "-model_weights-dense_1-dense_1-kernel-0" ) << Get As Matrix();
layer_2_bias = Data Table( "-model_weights-dense_2-dense_2-bias-0" ) << Get As Matrix();
layer_2_kernel = Data Table( "-model_weights-dense_2-dense_2-kernel-0" ) << Get As Matrix();
Quello che voglio fare è automatizzare il processo di importazione, salvare i datatables e rinominarli e capire quanti livelli ci sono nel modello Keras (numero di datatables / 2). C'è un modo per capire quanti datatable ci sono e anche rinominarli separatamente senza dover eseguire il processo manuale mostrato sopra?
Grazie!
Ri: Automatizzare l'apertura di un file hdf5Mi dispiace Bob, ma non ho alcun codice di esempio di questo tipo o davvero il tempo per svilupparlo in questo momento.
Brian
Ri: Automatizzare l'apertura di un file hdf5Ciao Brian,
Ho trovato solo un modo per generare un file HDF5 da Python che JMP può leggere direttamente in formato tabella ... il che significa che la procedura guidata della GUI non mi chiede quale sottoinsieme della struttura HDF caricare.Non voglio incollare tutto il codice, ma il percorso di base è convertire il dataframe Pandas in un recarray Numpy e scriverlo su HDF5.
MA... è assurdamente lento aprire questo file .H5 in JMP.Per un file di dimensioni moderate (131k righe x 500 colonne), è circa 10 volte più lento degli stessi dati archiviati come CSV.
Puoi fornire un codice Python di esempio che memorizza dati simili a tabelle in un file HDF5 che JMP può interpretare e aprire direttamente, con prestazioni ragionevoli per il volume di dati?Oppure un modulo Python che scrive un file .JMP sarebbe fantastico.
L'interfaccia Python sembra salvare il dataframe Pandas come .csv da aprire in JMP ... si spera che non sia perché .csv è l'intermediario più veloce.
Grazie,
- Bob
Ri: Automatizzare l'apertura di un file hdf5Purtroppo non ho ancora trovato una soluzione a questo. Non è la caratteristica principale della mia applicazione, quindi non mi preoccuperò più. Ma se mi imbatto in qualcosa lo informerò di sicuro!
Ri: Automatizzare l'apertura di un file hdf5Se trovo la soluzione a questo di sicuro lo condividerò. Finora nessuna fortuna però.
Ri: Automatizzare l'apertura di un file hdf5Hai ragione, in quanto JMP presuppone che .h5 sia l'unica estensione per un file HDF5.Questa sembra essere la norma, ma .hdf5 e .hdf sono alternative accettate.Vedremo come ottenere la finestra di dialogo del file e i comandi di apertura JSL per supportare le estensioni .hdf5 e .hdf in JMP 15.2. Sicuramente sarà in 16.0.
Brian Corcoran
Sviluppo JMP
Ri: Automatizzare l'apertura di un file hdf5In realtà un'altra domanda qui: sembra che JMP presuma che un file HDF5 utilizzerà l'estensione "h5". Se i miei file hanno un'estensione diversa, ad esempio "hdf5", posso forzare JMP a utilizzare quel tipo di file con il comando Open()? L'argomento File Type() non sembra funzionare per HDF5.Ri: Automatizzare l'apertura di un file hdf5Grazie per la risposta. Almeno per me, se potessi interrogare la struttura del file HDF5 sarei felice di scrivere io stesso il resto.Ri: Automatizzare l'apertura di un file hdf5Al momento JMP non fornisce un set completo di funzionalità JSL per HDF5.Abbiamo richieste di funzionalità aperte per aggiungere il supporto JSL per interrogare i nomi delle tabelle e per unire come set di dati.Stiamo considerando queste aggiunte per il futuro.Se c'è supporto oltre a questo che ritieni possa essere utile, comunicalo al supporto tecnico e ci aiuterà a stabilire le priorità del lavoro futuro.
Grazie, e mi dispiace che non possiamo essere di maggiore aiuto in questo momento.
Brian Corcoran
Sviluppo JMP
Ri: Automatizzare l'apertura di un file hdf5CIAO,
Sto anche cercando di fare qualcosa di simile con i file hdf5: ottenere il numero e i nomi dei "set di dati" e fare qualcosa di intelligente con esso. Come sicuramente avrai scoperto, la documentazione è piuttosto scarsa in quest'area. Ho inviato un'e-mail al supporto jmp per chiedere informazioni su come farlo, se sento qualcosa in risposta posterò qui. Se finisci per capirlo da solo, potresti per favore condividere le tue soluzioni?
Grazie!Re: Automatizzare l'apertura di un file hdf5Discussione del 2024, argomento simile:
Aiuto per l'apertura dei file hdf5
Re: Automatizzare l'apertura di un file hdf5Fino a JMP 17 salva il data frame pandas come file CSV. JMP 18 con il suo supporto Python integrato può creare una tabella dati in memoria da un data frame pandas. In 18 devi scorrere il data frame e creare una colonna della tabella dati JMP alla volta.
Un migliore supporto per i data frame sarà presente nella prossima versione di JMP 19 EA-5.
Il pacchetto Python per lavorare con i file HDF5 è h5py.
Re: Automatizzare l'apertura di un file hdf5Ho avuto un po' di tempo per armeggiare. Ecco uno script Python che utilizza i pacchetti di importazione jmp e h5py per aprire 'Big Class.jmp', creare un file 'Big Class.h5' e da questo creare una tabella dati dt2 dal file .h5.
# File: h5_example.py
# Author: Paul R. Nelson
# Description: Example showing use of h5py and jmp packages to
# create a .h5 file from a JMP data table, and recreate the JMP
# table from the .h5 file. Note: the HDF5 file doesn't preserve
# column order so the new table comes back in alphabetic order
#
# Layout of my .h5 file - using a generic layout so it can always be easily read
# regardless of name.
# Other attrs could be added as needed.
# /table/ group 'table' has attrs['name'] = table name
# /table/col_name
# /table/...
# /table/nth_col_name
#
# /scripts/script_name
# ...
# /scripts/nth_script_name
#
import jmp
#from jmputils import jpip
#jpip('install', 'h5py')
import numpy as np
import h5py as h5
#callable function to use with h5py file.visit()
def printname(name):
print(name)
# Build a hdf5 file from JMP data table. HDF5 is like NumPy and each dataset
# must be homogeneous, so a JMP like table needs to be multiple datasets.
# To make it easy, a dataset per column.
def h5_from_dt(file_path, dt):
"""Build and save an .h5 file at at file_path/dt_name.h5 from dt"""
try:
f = h5.File( file_path + dt.name + '.h5', 'w')
h_tbl = f.create_group( 'table' ) # table data
h_script = f.create_group('scripts') # table scripts
h_tbl.attrs["name"] = dt.name
for col in dt:
if col.dtype == jmp.DataType.Character:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype=h5.string_dtype())
# I'm cheating - I'm saving the JMP data type so read can determine char type
ds.attrs['jtype'] = 'jmp_Character'
elif col.dtype == jmp.DataType.Numeric:
ds = h_tbl.create_dataset( col.name, shape=len(col), dtype='f8' )
ds.attrs['jtype'] = 'jmp_Numeric'
ds[:] = dt[col.name] # assign dt values to dataset
except Exception as err:
print(f'Error: {err}')
f.close()
return None
return f
def dt_from_h5(file_path):
"""Create a data table from an .h5 file turning datasets to JMP columns"""
f = h5.File(file_path, 'r')
if f and 'table' in f.keys():
print('A dt like h5.')
tbl = f['table']
cols = tbl.keys()
if cols:
print(cols)
col_name = list(cols)[0]
dt = jmp.DataTable('dt2', rows=len( tbl[ col_name ] ) )
for cname in cols:
c = tbl[cname]
print(c)
print(c.dtype)
# My cheat on knowing utf-8 char columns
if c.attrs['jtype'] and c.attrs['jtype'] == 'jmp_Character':
print('char col')
dt.new_column(cname, jmp.DataType.Character)
for x in range( len( c )):
# need to turn byte object back to utf-8 string
dt[cname][x] = c[x].decode('utf-8')
else:
dt.new_column(cname, jmp.DataType.Numeric)
dt[cname] = c
f.close()
return dt
else:
f.close()
return None
f.close()
return None
# open 'Big Class'
dt = jmp.open(jmp.SAMPLE_DATA + 'Big Class.jmp')
try:
# create 'Big Class.h5' file in my home directory
hdf = h5_from_dt(jmp.HOME, dt)
if hdf:
print(list(hdf.keys()))
hdf.visit(printname)
h_tbl = hdf['table']
print( f'Table Name: {h_tbl.attrs['name']}')
print( hdf['table/name'])
print( [x.decode('utf-8') for x in hdf['table/name'] ])
print( hdf[ 'table/weight'])
print( [x.item() for x in hdf['table/weight'] ] )
else:
print('Unable to create .h5 file from data table.')
except Exception as err:
print(f'Error: {err}')
finally:
if hdf:
hdf.close()
dt2 = dt_from_h5( jmp.HOME + 'Big Class.h5')
print(dt2)