我正在用 scikit learn 建立一个机器学习项目。输入数据是平面 ROOT NTuples。
过去我一直在使用 root_numpy 将 NTuples 转换为保存在 h5 文件中的 pandas.DataFrame。
我想知道是否可以使用 uproot 来
a) 完全跳过 h5 转换?
b) 使用的内存不如从 h5 加载的 DataFrame 中使用的内存多?
我天真的第一次尝试看起来像这样:
'''
Runs preselection, keeps only desired variables in DataFrame
'''
def dropAndKeep(df, dropVariables=None, keepVariables=None, presel=None, inplace=True):
if ((presel is not None) and (not callable(presel))):
print("Please either provide a function to 'presel' or leave blank")
raise ValueError
if callable(presel):
if not(inplace):
df = df.drop(df[~presel(df)].index, inplace=False)
else:
df.drop(df[~presel(df)].index, inplace=True)
if keepVariables is not None:
dropThese = list( set(df.columns) - set(keepVariables) )
return df.drop(columns=dropThese, inplace=inplace)
if dropVariables is not None:
return df.drop(columns=dropVariables, inplace=inplace)
'''
Loads a TTree from ROOT file into a DataFrame
'''
def load_root(inFile, key, dropVariables=None, keepVariables=None, presel=None):
df = uproot.open(inFile)[key].pandas.df()
dropAndKeep(df, dropVariables, keepVariables, presel=presel, inplace=True)
return df
inFile = "path/to/file.root"
key = "ntuple"
df = load_root(inFile, key)
这需要很长时间。有没有更好的方法来做到这一点?