Как избавиться от NaturalNameWarning? - PullRequest
0 голосов
/ 16 октября 2019

Мой скрипт выполняет следующие действия:

  1. читает временные ряды из двоичного файла trc (измерение УВЧ)
  2. обрезает определенные области (импульсы) и сохраняет каждую из них вpd.DataFrame
  3. сохранить все DataFrames в один hdf5 файл

Это прекрасно работает, но модуль tables, похоже, выдает NaturalNameWarning для каждого DataFrame.

Здесь DataFrames сохраняются в hdf5:

num = 0
for idx, row in df_oszi.iloc[peaks].iterrows():
    start_peak = idx - 1*1e-3
    end_peak = idx + 10*1e-3  #tges=11us
    df_pos = df_oszi[start_peak:end_peak]
    df_pos.to_hdf('pos.h5', key=str(num))
    num += 1

Вывод:

Warning (from warnings module):
  File "C:\Users\Artur\AppData\Local\Programs\Python\Python37\lib\site-packages\tables\path.py", line 157
    check_attribute_name(name)
NaturalNameWarning: object name is not a valid Python identifier: '185'; it does not match the pattern ``^[a-zA-Z_][a-zA-Z0-9_]*$``; you will not be able to use natural naming to access this object; using ``getattr()`` will still work, though

1 Ответ

1 голос
/ 17 октября 2019

Это предупреждение. Это означает, что вы не можете использовать соглашение об именах PyTables для доступа к набору данных с именем 185. Это не проблема, если вы не планируете использовать PyTables. Если вы хотите использовать PyTables, вы должны использовать File.get_node(where) для доступа к имени этой группы.
Сравнение 2 методов (где h5f - мой объект файла HDF5):
h5f.get_node('/185') # works
tb1nn = h5f.root.185 # gives Python invalid syntax error

Измените имя группы на t185, и вы сможете использовать естественное именование. Посмотрите пример кода PyTables ниже, чтобы показать разницу:

import tables as tb
import numpy as np

arr = np.arange(10.)
ds_dt = ds_dt= ( [ ('f1', float) ] ) 
rec_arr = np.rec.array(arr,dtype=ds_dt)

with tb.File('natname.h5','w') as h5f:
    tb1 = h5f.create_table('/','t185',obj=rec_arr)
    tb1nn = h5f.root.t185
    print (tb1nn.nrows)

    tb2 = h5f.create_table('/','185',obj=rec_arr)
#    tb2nn = h5f.root.185 # will give Python syntax error
    tb2un = h5f.get_node('/185')
    print (tb2un.nrows)
...