ImputerPreprocessor implements Preprocessor<K, V>, DeployableObject { @Override public LabeledVector apply(K k, V v) { LabeledVector res = basePreprocessor.apply(k, v); assert res.size() == imputingValues.size(); for (int i = 0; i < res.size(); i++) { if (Double.valueOf(res.get(i)).equals(Double.NaN)) res.set(i, imputingValues.get(i)); } return res; } ImputerPreprocessor(Vector imputingValues,
                               Preprocessor<K, V> basePreprocessor); @Override LabeledVector apply(K k, V v); @Override List<Object> getDependencies();  }
@Test public void testApply() { double[][] data = new double[][]{ {Double.NaN, 20, 3}, {2, Double.NaN, 8}, {Double.NaN, Double.NaN, Double.NaN}, }; Vectorizer<Integer, double[], Integer, Double> vectorizer = new DoubleArrayVectorizer<>(0, 1, 2); ImputerPreprocessor<Integer, double[]> preprocessor = new ImputerPreprocessor<>( VectorUtils.of(1.1, 10.1, 100.1), vectorizer ); double[][] postProcessedData = new double[][]{ {1.1, 20, 3}, {2, 10.1, 8}, {1.1, 10.1, 100.1}, }; for (int i = 0; i < data.length; i++) assertArrayEquals(postProcessedData[i], preprocessor.apply(i, data[i]).features().asArray(), 1e-8); }