Я пытаюсь распараллелить (несколько) простой скрипт, используя dask
. Первоначально я прочитал свой ROOT файл, используя uproot
в pandas.DataFrame
таким образом:
import uproot
file_name = "ntuple.root"
tree_name = "Events"
branches = ["Trigger", "nTracks", "mass"]
df = uproot.open(file_name)[tree_name].pandas.df(branches)
df.dtypes.to_dict()
# {'Trigger': dtype('bool'),
# 'nTracks': dtype('uint64'),
# 'mass': dtype('float64')}
Когда я делаю это, все работает нормально, типы различных ветви правильно распознаны. В частности, в приведенном выше примере ветвь "Trigger"
является логическим значением, ветвь "nTracks"
представляет собой целое число, а ветвь "mass"
представляет собой число с плавающей точкой.
Однако, когда я читаю тот же файл, используя uproot.daskframe
Вместо этого я получаю обратно daskframe, для которого назначены все три ветви float64
, например:
df = uproot.daskframe(file_name, tree_name, branches)
df.dtypes.to_dict()
# {'Trigger': dtype('float64'),
# 'nTracks': dtype('float64'),
# 'mass': dtype('float64')}
Это приводит к разрыву сценария позже, потому что мне нужно специально интерпретировать триггерную ветвь как простой логический , чтобы вырезать его.
В идеале я бы хотел, чтобы он автоматически распознавал правильный тип d для каждого столбца.
В качестве альтернативы, установка их вручную также была бы полезной для меня. Я мог бы найти правильные dtypes, прочитав одно событие по-старому и используя это. Согласно документации я должен быть в состоянии передать словарь, который возвращает uproot.interp.interp.Interpretation
, но мне неясно, как именно это работает.
Является ли весь этот беспорядок ограничением использования dask
или uproot
?
Для справки, я использую root 3.11.3 и у меня установлена dask версия 2.6.0.