2017-07-13 14 views
1

私はH2o.Frameに入る列の型を指定しようとしています。私はこれをいくつかの異なる方法で試みました。ユニットテストは以下の通りです。私は99.0を99.9に変更したので、最後の2つを除いてすべて失敗しますが、最後の2つはうまくいきます。なぜ99.0はまだ浮動小数点でintではないと言えますか?H2oFrameが入力列の種類を無視するのはなぜですか?

import unittest 
from unittest import TestCase 
import h2o 

class TestInputtingTypes(TestCase): 
    def setUp(self): 
     h2o.init() 

    def test_h2o_1(self): 
     data =[(1,'one', 9),(9,'two',3), (8,'three', 99.0)] 
     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     frame = h2o.H2OFrame(data, column_types=given_types) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_2(self): 
     data =[(1,'one', 9),(9,'two',3), (8,'three', 99.0)] 
     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data, column_types=given_types, column_names=names) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_3(self): 
     data =[{'C1': 1, 'C2': 'one', 'C3': 9}, 
       {'C1': 9, 'C2': 'two', 'C3': 3}, 
       {'C1': 8, 'C2': 'three', 'C3': 99.0}] 

     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data, column_types=given_types, column_names=names) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_4(self): 
     data =[{'C1': 1, 'C2': 'one', 'C3': 9}, 
       {'C1': 9, 'C2': 'two', 'C3': 3}, 
       {'C1': 8, 'C2': 'three', 'C3': 99.0}] 

     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     given_types_input = {'C1': 'numeric', 'C2': 'string', 'C3': 'float'} 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data, column_types=given_types_input, column_names=names) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_5(self): 
     data =[(1,'one', 9),(9,'two',3), (8,'three', 99.0)] 
     given_types = ['int', 'string', 'real'] 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data, column_types=given_types, column_names=names) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_6_this_one_passes_because_has_nonzero_decimals(self): 
     data =[(1,'one', 9),(9,'two',3), (8,'three', 99.9)] 
     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     given_types_input = ['int', 'string', 'real'] 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data, column_types=given_types_input, column_names=names) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

    def test_h2o_7_this_one_passes_because_has_nonzero_decimals(self): 
     data =[(1,'one', 9),(9,'two',3), (8,'three', 99.9)] 
     given_types = {'C1': 'int', 'C2': 'string', 'C3': 'real'} 
     names = ['C1', 'C2', 'C3'] 
     frame = h2o.H2OFrame(data) 
     actual_types = frame.types 

     self.assertDictEqual(given_types, actual_types) 

if __name__ == "__main__" : 
    unittest.main() 

答えて

2

問題がintはあなたがH2O col_typesパラメータに渡すことができるオプションではないということです、あなたはnumericを渡す必要があります。

実際の値とint値にnumericを渡すと、問題は解決するはずですが、整数は浮動小数点数に変換されます。彼らは、カテゴリにマッピングすることができるよう H2Oの整数がH2Oで

.asfactor()を使用して)使用されているために、次の種類が

「不明」許可されている - これは、すべてのNA

として解析されるように列を強制します

は、「UUID」 - 列の値は真のUUIDでなければならないか、NA

「文字列」として解析されます - 「数値」の文字列

として解析されるように列を強制します - 列を数値として解析するように強制します。 H2Oは数値データの圧縮を最適な方法で処理します。

"enum" - 列をカテゴリの列として解析するように強制します。

"time" - 列を時間列として解析するように強制します。 (日付) "yyyy-MM-dd"、 "yyyy MM dd"、 "dd-MMM-yy"、 "dd MMM yy"、(時間)のHH: 「HH:mm:ss」、「HH:mm:ss」、「HH:mm:ss:SSSnnnnnn」、「HH.mm.ss」、「HH:mm:ss:SSS」、「HH:mm.ssSnnnnnn "時間には「AM」または「PM」を含めることもできます。

を使用すると、ドキュメント内の詳細を見ることができます:http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/h2o.html?highlight=import_file#h2o.import_file H2Oで

+0

は問題は修正されません。 [9,3,99.0]のような整数に変換できるカラムに "数値"を渡すと、 'frame.types'は型として" int "を表示します。 –

1

、データストレージをH 2 Oにより最適化されるので、あなたが(例えば、「INT」という)より少ないバイトで格納することができるカラムを持っている場合、 H2Oは、たとえ "実際の"(または浮動小数点)型を使用しようとしても、それをそのまま格納します。

カラムタイプを指定するために、H2Oにはタイプを記述するための独自の語彙がありますが(Laurenのresponseで詳しく説明しています)、その3番目のカラムに "numeric"を指定するとintになります。中

​​

結果:ではなく "本物" の "数字" に渡す

In [39]: actual_types 
Out[39]: {u'C1': u'int', u'C2': u'string', u'C3': u'int'} 

In [40]: given_types 
Out[40]: {'C1': 'int', 'C2': 'string', 'C3': 'numeric'} 
関連する問題