Automatiser l'ouverture d'un fichier hdf5Bonjour,
J'essaie de créer un script .jsl qui importera les fichiers hdf5 de Tensorflow, identifiera le nombre de fichiers (noyaux + biais) et les enregistrera sous forme de tables de données pour ensuite le traduire sous une forme lisible et utilisable comme substitut par JMP. La façon dont j'ouvre les tables de données jusqu'à présent est très manuelle; j'utilise
Open( "filename.h5", {"list_of", "dataset_names"});
pour importer tous les noms de jeux de données. Cependant, afin de pouvoir travailler avec les tables de données, j'utilise alors cette méthode manuelle (c'est pour un ANN Keras à 2 couches, le dernier noyau et la couche de biais concatènent les autres) :
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();
Ce que je veux faire, c'est automatiser le processus d'importation, de sauvegarde des tables de données, de les renommer et de comprendre le nombre de couches dans le modèle Keras (nombre de tables de données / 2). Existe-t-il un moyen de comprendre le nombre de tables de données et de les renommer séparément sans avoir à suivre le processus manuel indiqué ci-dessus ?
Merci!
Re : Automatiser l'ouverture d'un fichier hdf5Je suis désolé Bob, mais je n'ai pas un tel exemple de code ou vraiment le temps de le développer en ce moment.
Brian
Re : Automatiser l'ouverture d'un fichier hdf5Salut Brian,
Je n'ai trouvé qu'un seul moyen de générer un fichier HDF5 à partir de Python que JMP peut lire directement au format tableau... ce qui signifie que l'assistant GUI ne me demande pas quel(s) sous-ensemble(s) de la structure HDF charger.Je ne veux pas coller tout le code, mais le chemin de base consiste à convertir la trame de données Pandas en un recarray Numpy et à l'écrire sur HDF5.
MAIS... il est absurdement lent d'ouvrir ce fichier .H5 dans JMP.Pour un fichier de taille moyenne (131 000 lignes x 500 colonnes), il est environ 10 fois plus lent que les mêmes données stockées au format CSV.
Pouvez-vous fournir un exemple de code Python qui stocke des données de type table dans un fichier HDF5 que JMP peut interpréter et ouvrir directement, avec des performances raisonnables pour le volume de données ?Ou un module Python qui écrit un fichier .JMP serait formidable.
L'interface Python semble enregistrer la trame de données Pandas en tant que .csv à ouvrir dans JMP... j'espère que ce n'est pas parce que .csv est l'intermédiaire le plus rapide.
Merci,
-Bob
Re : Automatiser l'ouverture d'un fichier hdf5Malheureusement, je n'ai toujours pas trouvé de solution à ce problème. Ce n'est pas la caractéristique principale de mon application donc je ne m'en soucierai plus. Mais si je tombe sur quelque chose, j'informerai à coup sûr!
Re : Automatiser l'ouverture d'un fichier hdf5Si je trouve la solution à ce problème, je la partagerai certainement. Jusqu'à présent, pas de chance cependant.
Re : Automatiser l'ouverture d'un fichier hdf5Vous avez raison, dans la mesure où JMP suppose que .h5 est la seule extension d'un fichier HDF5.Cela semble être la norme, mais .hdf5 et .hdf sont des alternatives acceptées.Nous verrons comment obtenir la boîte de dialogue de fichier et les commandes d'ouverture JSL pour prendre en charge les extensions .hdf5 et .hdf dans JMP 15.2. Ce sera certainement en 16.0.
Brian Corcoran
Développement JMP
Re : Automatiser l'ouverture d'un fichier hdf5En fait, une autre question ici - il semble que JMP suppose qu'un fichier HDF5 utilisera l'extension 'h5'. Si mes fichiers ont une extension différente, par exemple "hdf5", puis-je forcer JMP à utiliser ce type de fichier avec la commande Open() ? L'argument File Type() ne semble pas fonctionner pour HDF5.Re : Automatiser l'ouverture d'un fichier hdf5Merci pour la réponse. Au moins pour moi, si je pouvais interroger la structure du fichier HDF5, je serais heureux de scripter le reste moi-même.Re : Automatiser l'ouverture d'un fichier hdf5JMP ne fournit pas vraiment un ensemble de fonctionnalités JSL riche pour HDF5 pour le moment.Nous avons des demandes de fonctionnalités ouvertes pour ajouter la prise en charge de JSL pour interroger les noms de table et pour fusionner des ensembles de données similaires.Nous envisageons ces ajouts pour l'avenir.S'il y a un soutien au-delà de cela qui, selon vous, serait utile, veuillez le transmettre au support technique et cela nous aidera à prioriser les travaux futurs.
Merci, et je suis désolé que nous ne puissions pas être d'une plus grande aide pour le moment.
Brian Corcoran
Développement JMP
Re : Automatiser l'ouverture d'un fichier hdf5Salut,
Je cherche également à faire quelque chose de similaire avec les fichiers hdf5 - obtenir le nombre et les noms des "jeux de données" et en faire quelque chose d'intelligent. Comme je suis sûr que vous l'avez découvert, la documentation est assez rare dans ce domaine. J'ai envoyé un e-mail au support jmp pour demander à ce sujet, si j'entends quelque chose en retour, je posterai ici. Si vous finissez par comprendre cela vous-même, pourriez-vous s'il vous plaît partager votre ou vos solutions ?
Merci!Re: Automatiser l'ouverture d'un fichier hdf5Discussion 2024, sujet similaire :
Aide à l'ouverture des fichiers hdf5
Re: Automatiser l'ouverture d'un fichier hdf5Jusqu'à JMP 17, la trame de données pandas est enregistrée sous forme de fichier CSV. JMP 18, avec sa prise en charge Python intégrée, peut créer une table de données en mémoire à partir d'une trame de données pandas. Dans 18, vous devez parcourir la trame de données et créer une colonne de table de données JMP à la fois.
Une meilleure prise en charge des trames de données est présente dans la prochaine version de JMP 19 EA-5.
Le package Python permettant de travailler avec les fichiers HDF5 est h5py.
Re: Automatiser l'ouverture d'un fichier hdf5J'ai eu un peu de temps pour bricoler. Voici un script Python utilisant les packages d'importation jmp et h5py pour ouvrir 'Big Class.jmp', créer un fichier 'Big Class.h5' puis à partir de cela créer une table de données dt2 à partir du fichier .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)