Автоматическая установка c dtypes при чтении файла ROOT в рамку daskframe с использованием uproot - PullRequest
1 голос
/ 01 апреля 2020

Я пытаюсь распараллелить (несколько) простой скрипт, используя 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.

...