Непоследовательное поведение Python H2OFrame при слиянии, вызванном упорядочением столбцов - PullRequest
0 голосов
/ 13 июня 2019

У меня есть следующие CSV-файлы, которые я импортирую в H2OFrames.

CSV 1 (a):

year,manufacturer,model,salePrice
2010,HONDA,CIVIC,100
2011,TOYOTA,CAMRY,150
2010,HONDA,CIVIC,50
2011,TOYOTA,CAMRY,200
2010,HONDA,CIVIC,150
2011,TOYOTA,CAMRY,250
2012,SUZUKI,SWIFT,500
2012,SUZUKI,SWIFT,600

CSV 1 (b):

manufacturer,model,year,salePrice
HONDA,CIVIC,2010,100
TOYOTA,CAMRY,2011,150
HONDA,CIVIC,2010,50
TOYOTA,CAMRY,2011,200
HONDA,CIVIC,2010,150
TOYOTA,CAMRY,2011,250
SUZUKI,SWIFT,2012,500
SUZUKI,SWIFT,2012,600

CSV 2:

year,manufacturer,model,bodyType
2010,HONDA,CIVIC,SEDAN
2011,TOYOTA,CAMRY,SEDAN
2012,SUZUKI,SWIFT,HATCHBACK

Обратите внимание, что«1a» и «1b» - это абсолютно одинаковые данные, только столбцы упорядочены по-разному.Теперь я импортирую все три из них в H2OFrame следующим образом:

import h2o
h2o.init()
df1a=h2o.import_file('csv1a.csv')
df1b=h2o.import_file('csv1b.csv')
df2=h2o.import_file('csv2.csv')

И затем я пытаюсь выполнить следующие операции слияния:

merge1=df1a.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])
merge2=df1b.merge(df2, by_x=['year','manufacturer','model'], by_y=['year','manufacturer','model'])

Первое слияние работает, как и ожидалось.Но второй сбой с ошибкой «Объединение столбцов должно быть одного типа, столбец salePrice обнаружил типы Enum и Numeric»

Когда я проверил журналы на сервере h2o, я обнаружил, что индексы столбцов by_x отправленына сервере были одинаковыми для обоих слияний (и упорядочены - [0 1 2]), несмотря на разный порядок, в котором столбцы by_x встречаются в df1b.Из журналов сервера ..

parms={ast=(tmp= py_5_sid_abdb (merge h2o_bug_df1b1.hex h2o_bug_df21.hex False False [0 1 2] [0 1 2] 'auto'))

Затем я нашел строки # 1967 и # 3422 в коде модуля h2o.frame: https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L1967 https://github.com/h2oai/h2o-3/blob/jenkins-rel-yates-4/h2o-py/h2o/frame.py#L3422

ДляМое второе слияние, индексы столбцов by_x должны были быть [2 0 1], вместо этого клиент Python отправил [0 1 2] из-за оператора list(set(tmp)) в строке # 3422.

Поэтому мне интересно, не лучше ли быстро потерпеть неудачу и выдать ошибку, если поставляемые имена столбцов by_x или by_y не являются уникальными, вместо того, чтобы собирать их в setчто явно не сохранит порядок?

Также сообщение об ошибке вводило в заблуждение, пока я не проверил код, поскольку сообщение содержало ссылку на столбец salePrice, которого не было ни в моих by_x, ни by_y.

...