@@ -140,3 +140,45 @@ def delete(self, featureset_id):
140140 def put (self , featureset_id ):
141141 f = Featureset .get_if_owned_by (featureset_id , self .current_user )
142142 self .error ("Functionality for this endpoint is not yet implemented." )
143+
144+
145+ class PrecomputedFeaturesHandler (BaseHandler ):
146+ @auth_or_token
147+ def post (self ):
148+ data = self .get_json ()
149+ if data ['datasetID' ] not in [None , 'None' ]:
150+ dataset = Dataset .query .filter (Dataset .id == data ['datasetID' ]).one ()
151+ else :
152+ dataset = None
153+ current_project = Project .get_if_owned_by (data ['projectID' ],
154+ self .current_user )
155+ feature_data = StringIO (data ['dataFile' ]['body' ])
156+ fset = pd .read_csv (feature_data , index_col = 0 , header = [0 , 1 ])
157+ if 'labels' in fset :
158+ labels = fset .pop ('labels' ).values .ravel ()
159+ if labels .dtype == 'O' :
160+ labels = [str (label ) for label in labels ]
161+ else :
162+ labels = [None ]
163+ fset_path = pjoin (
164+ self .cfg ['paths:features_folder' ],
165+ '{}_{}.npz' .format (uuid .uuid4 (), data ['dataFile' ]['name' ]))
166+
167+ featurize .save_featureset (fset , fset_path , labels = labels )
168+
169+ # Meta-features will have channel values of an empty string or a string
170+ # beginning with 'Unnamed:'
171+ features_list = [el [0 ] for el in fset .columns .tolist () if
172+ (el [1 ] != '' and not el [1 ].startswith ('Unnamed:' ))]
173+
174+ featureset = Featureset (name = data ['featuresetName' ],
175+ file_uri = fset_path ,
176+ project = current_project ,
177+ dataset = dataset ,
178+ features_list = features_list ,
179+ finished = datetime .datetime .now (),
180+ custom_features_script = None )
181+ DBSession ().add (featureset )
182+ DBSession ().commit ()
183+
184+ self .success (featureset , 'cesium/FETCH_FEATURESETS' )
0 commit comments