2017-07-13 1 views
1

J'essaye de spécifier les types de colonne entrant dans mon H2o.Frame. J'ai essayé cela de plusieurs façons et dans tous les cas. Les tests unitaires sont ci-dessous. Ils échouent tous sauf les deux derniers, mais ces deux derniers ne fonctionnent que parce que j'ai changé de 99,0 à 99,9. Pourquoi ne puis-je pas dire que 99.0 est toujours un flotteur et non un int?Pourquoi H2oFrame ignore-t-il mes types de colonnes d'entrée?

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() 

Répondre

2

Le problème est que int n'est pas une option que vous pouvez passer au paramètre h2o col_types, vous devez passer numeric.

Si vous transmettez numeric pour vos valeurs réelles et int, cela devrait résoudre votre problème - bien que les nombres entiers soient convertis en nombres flottants. Pour entiers de H2O sont utilisés afin qu'ils puissent être mis en correspondance catégorique (en utilisant .asfactor())

Dans H2O les types suivants sont autorisés

« inconnu » - cela forcera la colonne à analyser comme tous les NA

« UUID » - les valeurs de la colonne doit être vraie ou UUID sera analysé comme NA

« string » - forcer la colonne à analyser comme une chaîne

« numérique » - forcez la colonne à être analysée comme numérique. H2O gérera la compression des données numériques de manière optimale. "Enum" - force l'analyse de la colonne en tant que colonne catégorielle. "Time" - force la colonne à être analysée comme une colonne de temps. H2O tentera d'analyser la liste suivante des formats d'horodatage: (date) "aaaa-MM-jj", "aaaa MM jj", "jj-MMM-aa", "jj MMM aa", (heure) "HH: mm: ss "," HH: mm: ss: SSS "," HH: mm: ss: SSSnnnnnn "," HH.mm.ss "" HH.mm.ss.SSS "," HH.mm.ss.SSSnnnnnn ". Les heures peuvent également contenir "AM" ou "PM".

vous pouvez voir plus de détails dans la documentation: http://docs.h2o.ai/h2o/latest-stable/h2o-py/docs/h2o.html?highlight=import_file#h2o.import_file

+0

Passing dans "numérique" au lieu de "réel" ne réglera pas le problème. Si vous passez "numeric" dans une colonne qui peut être convertie en entiers comme [9,3,99.0], alors "frame.types" montrera toujours "int" comme type. –

1

Dans H2O, le stockage de données est optimisé par H2O, donc si vous avez une colonne qui peut être stocké avec moins d'octets (comme un « int »), alors H2O va le stocker de cette façon, même si vous essayez de le forcer à utiliser le type "réel" (ou flottant). Pour spécifier les types de colonne, H2O a son propre vocabulaire pour décrire les types (détaillé dans response de Lauren), mais vous verrez que lorsque vous spécifiez «numérique» pour cette troisième colonne, il se terminera par un int.

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

Résultats dans:

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'}