From 3575f54c93390d220a1b4e7c9ae3c7cb17bc75f4 Mon Sep 17 00:00:00 2001 From: AlbertoEAF Date: Thu, 15 Dec 2022 11:49:03 +0000 Subject: [PATCH 01/27] lightgbm: Add SoftLabelParamParserUtil --- .../lightgbm/parameters/SchemaFieldsUtil.java | 72 +++++++++++++++++++ .../parameters/SoftLabelParamParserUtil.java | 64 +++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java create mode 100644 openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java new file mode 100644 index 00000000..aa3c85a6 --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java @@ -0,0 +1,72 @@ +package com.feedzai.openml.provider.lightgbm.parameters; + +import com.feedzai.openml.data.schema.DatasetSchema; +import com.feedzai.openml.data.schema.FieldSchema; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Optional; + +/** + * Utilities to compute fields/column indices. + * + * @author alberto.ferreira + */ +public class SchemaFieldsUtil { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(SchemaFieldsUtil.class); + + /** + * Placeholder to use when an integer argument is not provided. + * E.g., when running standard unconstrained LightGBM the constrained_group_column parameter will take this value. + */ + public static final int NO_SPECIFIC = -1; + + public static Optional getColumnIndex(final String fieldName, + final DatasetSchema schema) { + + final List featureFields = schema.getPredictiveFields(); + Optional field = featureFields + .stream() + .filter(field_ -> field_.getFieldName().equalsIgnoreCase(fieldName)) + .findFirst(); + + // Check if column exists + if (!field.isPresent()) { + logger.error(String.format( + "Column %s was not found in the dataset.", + fieldName)); + return Optional.empty(); + } + + return Optional.of(field.get().getFieldIndex()); + } + + /** + * Gets the index of the soft label column without the label column (LightGBM-specific format) + * + * @param fieldName Name of the field in the dataset. + * @param schema Schema of the dataset. + * @return the index of the constraint group column without the label if the constraint_group_column parameter + * was provided, else returns an empty Optional. + */ + public static Optional getFieldIndexWithoutLabel(final String fieldName, + final DatasetSchema schema) { + + final Optional fieldIndex = getColumnIndex(fieldName, schema); + if (!fieldIndex.isPresent()) { + return Optional.empty(); + } + + // Compute column index in LightGBM-specific format (disregarding target column) + final int targetIndex = schema.getTargetIndex() + .orElseThrow(RuntimeException::new); // Our model is supervised. It needs the target. + + final int offsetIfFieldIsAfterLabel = fieldIndex.get() > targetIndex ? -1 : 0; + return Optional.of(fieldIndex.get() + offsetIfFieldIsAfterLabel); + } +} diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java new file mode 100644 index 00000000..16c47414 --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java @@ -0,0 +1,64 @@ +package com.feedzai.openml.provider.lightgbm.parameters; + +import com.feedzai.openml.data.schema.DatasetSchema; +import com.feedzai.openml.data.schema.FieldSchema; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SOFT_LABEL_PARAMETER_NAME; + +/** + * Utility to parse parameters specific to the FairGBM model. + * + * @author Alberto Ferreira (alberto.ferreira@feedzai.com) + */ +public class SoftLabelParamParserUtil { + + /** + * Logger for this class. + */ + private static final Logger logger = LoggerFactory.getLogger(SoftLabelParamParserUtil.class); + + /** + * This class is not meant to be instantiated. + */ + private SoftLabelParamParserUtil() { + } + + public static Optional getSoftLabelFieldName(final Map params) { + final String softLabelFieldName = params.get(SOFT_LABEL_PARAMETER_NAME); + + return softLabelFieldName.equals("") ? Optional.empty() : Optional.of(softLabelFieldName.trim()); + } + + public static boolean useSoftLabel(final Map mapParams) { + return getSoftLabelFieldName(mapParams).isPresent(); + } + + + /** + * Gets the (canonical) index of the constraint group column. + * NOTE: the soft label column must be part of the features in the Dataset, but it may be ignored for training + * + * @param params LightGBM train parameters. + * @param schema Schema of the dataset. + * @return the index of the soft label column if one was provided, else returns an empty Optional. + */ + public static Optional getSoftLabelColumnIndex(final Map params, + final DatasetSchema schema) { + final Optional softLabelFieldName = getSoftLabelFieldName(params); + return softLabelFieldName.isPresent() ? + SchemaFieldsUtil.getColumnIndex(softLabelFieldName.get(), schema) : Optional.empty(); + } + + public static Optional getSoftLabelFieldIndexWithoutLabel(final Map params, + final DatasetSchema schema) { + final Optional softLabelFieldName = getSoftLabelFieldName(params); + return softLabelFieldName.isPresent() ? + SchemaFieldsUtil.getFieldIndexWithoutLabel(softLabelFieldName.get(), schema) : Optional.empty(); + } +} From 3a320d2f0d22a07b62fdc03f87393cad07ecc405 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Wed, 13 May 2026 18:01:58 +0100 Subject: [PATCH 02/27] chore(lightgbm): move SchemaFieldsUtil to lightgbm package --- .../{parameters => }/SchemaFieldsUtil.java | 24 +++++-- .../parameters/SoftLabelParamParserUtil.java | 64 ------------------- 2 files changed, 17 insertions(+), 71 deletions(-) rename openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/{parameters => }/SchemaFieldsUtil.java (80%) delete mode 100644 openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtil.java similarity index 80% rename from openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java rename to openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtil.java index aa3c85a6..50043159 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SchemaFieldsUtil.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtil.java @@ -1,12 +1,22 @@ -package com.feedzai.openml.provider.lightgbm.parameters; +/* + * The copyright of this file belongs to Feedzai. The file cannot be + * reproduced in whole or in part, stored in a retrieval system, + * transmitted in any form, or by any means electronic, mechanical, + * photocopying, or otherwise, without the prior permission of the owner. + * + * © 2026 Feedzai, Strictly Confidential + */ + +package com.feedzai.openml.provider.lightgbm; -import com.feedzai.openml.data.schema.DatasetSchema; -import com.feedzai.openml.data.schema.FieldSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.util.List; import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.feedzai.openml.data.schema.DatasetSchema; +import com.feedzai.openml.data.schema.FieldSchema; /** * Utilities to compute fields/column indices. @@ -29,7 +39,7 @@ public class SchemaFieldsUtil { public static Optional getColumnIndex(final String fieldName, final DatasetSchema schema) { - final List featureFields = schema.getPredictiveFields(); + final List featureFields = schema.getFieldSchemas(); Optional field = featureFields .stream() .filter(field_ -> field_.getFieldName().equalsIgnoreCase(fieldName)) @@ -64,7 +74,7 @@ public static Optional getFieldIndexWithoutLabel(final String fieldName // Compute column index in LightGBM-specific format (disregarding target column) final int targetIndex = schema.getTargetIndex() - .orElseThrow(RuntimeException::new); // Our model is supervised. It needs the target. + .orElseThrow(RuntimeException::new); // Our model is supervised. It needs the target. final int offsetIfFieldIsAfterLabel = fieldIndex.get() > targetIndex ? -1 : 0; return Optional.of(fieldIndex.get() + offsetIfFieldIsAfterLabel); diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java deleted file mode 100644 index 16c47414..00000000 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/parameters/SoftLabelParamParserUtil.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.feedzai.openml.provider.lightgbm.parameters; - -import com.feedzai.openml.data.schema.DatasetSchema; -import com.feedzai.openml.data.schema.FieldSchema; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SOFT_LABEL_PARAMETER_NAME; - -/** - * Utility to parse parameters specific to the FairGBM model. - * - * @author Alberto Ferreira (alberto.ferreira@feedzai.com) - */ -public class SoftLabelParamParserUtil { - - /** - * Logger for this class. - */ - private static final Logger logger = LoggerFactory.getLogger(SoftLabelParamParserUtil.class); - - /** - * This class is not meant to be instantiated. - */ - private SoftLabelParamParserUtil() { - } - - public static Optional getSoftLabelFieldName(final Map params) { - final String softLabelFieldName = params.get(SOFT_LABEL_PARAMETER_NAME); - - return softLabelFieldName.equals("") ? Optional.empty() : Optional.of(softLabelFieldName.trim()); - } - - public static boolean useSoftLabel(final Map mapParams) { - return getSoftLabelFieldName(mapParams).isPresent(); - } - - - /** - * Gets the (canonical) index of the constraint group column. - * NOTE: the soft label column must be part of the features in the Dataset, but it may be ignored for training - * - * @param params LightGBM train parameters. - * @param schema Schema of the dataset. - * @return the index of the soft label column if one was provided, else returns an empty Optional. - */ - public static Optional getSoftLabelColumnIndex(final Map params, - final DatasetSchema schema) { - final Optional softLabelFieldName = getSoftLabelFieldName(params); - return softLabelFieldName.isPresent() ? - SchemaFieldsUtil.getColumnIndex(softLabelFieldName.get(), schema) : Optional.empty(); - } - - public static Optional getSoftLabelFieldIndexWithoutLabel(final Map params, - final DatasetSchema schema) { - final Optional softLabelFieldName = getSoftLabelFieldName(params); - return softLabelFieldName.isPresent() ? - SchemaFieldsUtil.getFieldIndexWithoutLabel(softLabelFieldName.get(), schema) : Optional.empty(); - } -} From 4b743e375a2cd20670d06bc063ec5e6e2134c4aa Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Wed, 13 May 2026 18:07:03 +0100 Subject: [PATCH 03/27] feat(lightgbm): added utility class to parse lightgbm sample weight train parameter --- .../lightgbm/SampleWeightParamParserUtil.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java new file mode 100644 index 00000000..7b3c2110 --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java @@ -0,0 +1,62 @@ +/* + * The copyright of this file belongs to Feedzai. The file cannot be + * reproduced in whole or in part, stored in a retrieval system, + * transmitted in any form, or by any means electronic, mechanical, + * photocopying, or otherwise, without the prior permission of the owner. + * + * © 2026 Feedzai, Strictly Confidential + */ + +package com.feedzai.openml.provider.lightgbm; + +import java.util.Map; +import java.util.Optional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.feedzai.openml.data.schema.DatasetSchema; + +import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SAMPLE_WEIGHT_COL_PARAMETER_NAME; + +/** + * Utility class to parse and resolve the sample weight column parameter for LightGBM model training. + * + * @author Joaquim Leitão (joaquim.leitao@feedzai.com) + */ +public class SampleWeightParamParserUtil { + + /** + * This class is not meant to be instantiated. + */ + private SampleWeightParamParserUtil() { + } + + /** + * Retrieves the name of the sample weight field specified in the model parameters. + * + * @param params LightGBM train parameters. + * @return The name of the sample weight field, if specified in the model parameters; + * otherwise empty Optional + */ + public static Optional getSampleWeightFieldName(final Map params) { + final String softLabelFieldName = params.get(SAMPLE_WEIGHT_COL_PARAMETER_NAME); + + return softLabelFieldName == null || softLabelFieldName.isEmpty() ? + Optional.empty() : Optional.of(softLabelFieldName.trim()); + } + + /** + * Gets the (canonical) index of the constraint group column. + * NOTE: the sample weight column must be part of the features in the Dataset, but it may be ignored for training + * + * @param params LightGBM train parameters. + * @param schema Schema of the dataset. + * @return the index of the sample weight column if one was provided, else returns an empty Optional. + */ + public static Optional getSampleWeightColumnIndex(final Map params, + final DatasetSchema schema) { + final Optional sampleWeightFieldName = getSampleWeightFieldName(params); + return sampleWeightFieldName.isPresent() ? + SchemaFieldsUtil.getColumnIndex(sampleWeightFieldName.get(), schema) : Optional.empty(); + } +} From b6b0ce33c08a1d4ff745e6f5ca0f165ed6947a36 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Wed, 13 May 2026 18:09:35 +0100 Subject: [PATCH 04/27] feat(lightgbm): add sample weight parameter to lightgbm descriptor --- .../lightgbm/LightGBMDescriptorUtil.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMDescriptorUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMDescriptorUtil.java index cf03abe2..9d5722c3 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMDescriptorUtil.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMDescriptorUtil.java @@ -20,6 +20,8 @@ import com.feedzai.openml.provider.descriptor.ModelParameter; import com.feedzai.openml.provider.descriptor.fieldtype.BooleanFieldType; import com.feedzai.openml.provider.descriptor.fieldtype.ChoiceFieldType; +import com.feedzai.openml.provider.descriptor.fieldtype.FreeTextFieldType; + import com.google.common.collect.ImmutableSet; import java.util.Set; @@ -52,6 +54,11 @@ public class LightGBMDescriptorUtil extends AlgoDescriptorUtil { */ public static final String BAGGING_FREQUENCY_PARAMETER_NAME = "bagging_freq"; + /** + * Sample weight parameter name. + */ + public static final String SAMPLE_WEIGHT_COL_PARAMETER_NAME = "sample_weight"; + /** * Global seed parameter name. */ @@ -347,8 +354,17 @@ public class LightGBMDescriptorUtil extends AlgoDescriptorUtil { "Set to true if training data is unbalanced. \nWhilst enabling this should increase the overall performance metric of the model, it will also result in poor estimates of the individual class probabilities. Cannot be used at the same time as 'scale_pos_weight'.", // TODO nam parameter in ui (scale_pos_weight) NOT_MANDATORY, new BooleanFieldType(false) - ) + ), // TODO: https://lightgbm.readthedocs.io/en/latest/Parameters.html#scale_pos_weight ?? would require setting the pos label - + new ModelParameter( + SAMPLE_WEIGHT_COL_PARAMETER_NAME, + "Sample Weight", + "Name of the field containing per-instance weights for training. \n" + + "Higher weights result in the model prioritizing training on those samples. \n" + + "Values must be non-negative. \n" + + "If this field is selected, it is automatically dropped from the selected features.", + NOT_MANDATORY, + new FreeTextFieldType("") + ) ); } From 8ab146c453303013bdca360255ef732985f1b13b Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Wed, 13 May 2026 18:14:10 +0100 Subject: [PATCH 05/27] feat(lightgbm): modify training to make use of sample weight, when provided --- ...htGBMBinaryClassificationModelTrainer.java | 105 +++++++++++++++--- .../lightgbm/LightGBMModelCreator.java | 92 ++++++++++++--- .../provider/lightgbm/SWIGTrainData.java | 60 +++++++++- 3 files changed, 229 insertions(+), 28 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java index 69eb7b70..beccdc24 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java @@ -22,6 +22,7 @@ import com.feedzai.openml.data.schema.CategoricalValueSchema; import com.feedzai.openml.data.schema.DatasetSchema; import com.feedzai.openml.data.schema.FieldSchema; + import com.google.common.collect.ImmutableSet; import com.microsoft.ml.lightgbm.SWIGTYPE_p_float; import com.microsoft.ml.lightgbm.SWIGTYPE_p_int; @@ -43,6 +44,7 @@ import static com.feedzai.openml.provider.lightgbm.FairGBMDescriptorUtil.CONSTRAINT_GROUP_COLUMN_PARAMETER_NAME; import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.NUM_ITERATIONS_PARAMETER_NAME; +import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SAMPLE_WEIGHT_COL_PARAMETER_NAME; import static java.lang.Integer.parseInt; import static java.util.stream.Collectors.toList; @@ -129,7 +131,23 @@ static void fit(final Dataset dataset, final long instancesPerChunk) { final DatasetSchema schema = dataset.getSchema(); - final int numFeatures = schema.getPredictiveFields().size(); + + final Optional sampleWeightColIndex = + SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, schema); + + final int numPredictiveFields = schema.getPredictiveFields().size(); + final int numFeatures; + if (!sampleWeightColIndex.isPresent()) { + numFeatures = numPredictiveFields; + } else { + final boolean isSoftLabelSelectedAsFeature = schema.getPredictiveFields().stream().anyMatch( + field -> field.getFieldName().equals( + SampleWeightParamParserUtil.getSampleWeightFieldName(params).get() + ) + ); + + numFeatures = numPredictiveFields - (isSoftLabelSelectedAsFeature ? 1 : 0); + } // Parse train parameters to LightGBM format final String trainParams = getLightGBMTrainParamsString(params, schema); @@ -140,13 +158,22 @@ static void fit(final Dataset dataset, final SWIGTrainData swigTrainData = new SWIGTrainData( numFeatures, instancesPerChunk, - FairGBMParamParserUtil.isFairnessConstrained(params)); + FairGBMParamParserUtil.isFairnessConstrained(params), + sampleWeightColIndex.isPresent() + ); final SWIGTrainBooster swigTrainBooster = new SWIGTrainBooster(); /// Create LightGBM dataset final int constraintGroupColIndex = FairGBMParamParserUtil.getConstraintGroupColumnIndex(params, schema).orElse( FairGBMParamParserUtil.NO_SPECIFIC); - createTrainDataset(dataset, numFeatures, trainParams, constraintGroupColIndex, swigTrainData); + createTrainDataset( + dataset, + numFeatures, + trainParams, + constraintGroupColIndex, + sampleWeightColIndex, + swigTrainData + ); /// Create Booster from dataset createBoosterStructure(swigTrainBooster, swigTrainData, trainParams); @@ -203,6 +230,7 @@ private static void createTrainDataset(final Dataset dataset, final int numFeatures, final String trainParams, final int constraintGroupColIndex, + final Optional sampleWeightColIndex, final SWIGTrainData swigTrainData) { logger.info("Creating LightGBM dataset"); @@ -211,7 +239,8 @@ private static void createTrainDataset(final Dataset dataset, copyTrainDataToSWIGArrays( dataset, swigTrainData, - constraintGroupColIndex + constraintGroupColIndex, + sampleWeightColIndex ); initializeLightGBMTrainDatasetFeatures( @@ -224,13 +253,17 @@ private static void createTrainDataset(final Dataset dataset, swigTrainData ); + if (sampleWeightColIndex.isPresent()) { + setLightGBMDatasetSampleWeightData(swigTrainData); + } + if (constraintGroupColIndex != FairGBMParamParserUtil.NO_SPECIFIC) { setLightGBMDatasetConstraintGroupData( swigTrainData ); } - setLightGBMDatasetFeatureNames(swigTrainData.swigDatasetHandle, dataset.getSchema()); + setLightGBMDatasetFeatureNames(swigTrainData.swigDatasetHandle, dataset.getSchema(), sampleWeightColIndex); logger.info("Created LightGBM dataset."); } @@ -308,6 +341,33 @@ private static SWIGTYPE_p_int genSWIGFeatureChunkSizesArray(final SWIGTrainData return swigChunkSizesArray; } + /** + * Sets the LightGBM dataset sample weight data. + * + * @param swigTrainData SWIGTrainData object. + */ + private static void setLightGBMDatasetSampleWeightData(final SWIGTrainData swigTrainData) { + final long numInstances = swigTrainData.swigSampleWeightsChunkedArray.get_add_count(); + // Init SWIG array and copy from chunked data. + SWIGTYPE_p_float swigSampleWeightsData = swigTrainData.coalesceChunkedSwigSampleWeightDataArray(); + logger.debug("FTL: #weights={}", numInstances); + + logger.debug("Setting sample weight data..."); + final int returnCodeLGBM = lightgbmlib.LGBM_DatasetSetField( + swigTrainData.swigDatasetHandle, + "weight", // LightGBM weight column type. + lightgbmlib.float_to_voidp_ptr(swigSampleWeightsData), + (int) numInstances, + lightgbmlibConstants.C_API_DTYPE_FLOAT32 + ); + if (returnCodeLGBM == -1) { + logger.error("Could not set sample weight data."); + throw new LightGBMException(); + } + + swigTrainData.destroySwigSampleWeightsDataArray(); + } + /** * Sets the LightGBM dataset label data. * @@ -370,11 +430,16 @@ private static void setLightGBMDatasetConstraintGroupData(final SWIGTrainData sw * @param swigDatasetHandle SWIG dataset handle * @param schema Dataset schema */ - private static void setLightGBMDatasetFeatureNames(final SWIGTYPE_p_void swigDatasetHandle, final DatasetSchema schema) { + private static void setLightGBMDatasetFeatureNames(final SWIGTYPE_p_void swigDatasetHandle, + final DatasetSchema schema, + final Optional sampleWeightColIndex) { - final int numFeatures = schema.getPredictiveFields().size(); + final List featureFields = schema.getPredictiveFields().stream() + .filter(field -> !sampleWeightColIndex.equals(Optional.of(field.getFieldIndex()))) + .collect(toList()); + final int numFeatures = featureFields.size(); - final String[] featureNames = getFieldNames(schema.getPredictiveFields()); + final String[] featureNames = getFieldNames(featureFields); logger.debug("featureNames {}", Arrays.toString(featureNames)); final int returnCodeLGBM = lightgbmlib.LGBM_DatasetSetFeatureNames(swigDatasetHandle, featureNames, numFeatures); @@ -482,12 +547,13 @@ static void saveModelFileToDisk(final SWIGTYPE_p_void swigBoosterHandle, final P */ private static void copyTrainDataToSWIGArrays(final Dataset dataset, final SWIGTrainData swigTrainData) { - copyTrainDataToSWIGArrays(dataset, swigTrainData, FairGBMParamParserUtil.NO_SPECIFIC); + copyTrainDataToSWIGArrays(dataset, swigTrainData, FairGBMParamParserUtil.NO_SPECIFIC, Optional.empty()); } private static void copyTrainDataToSWIGArrays(final Dataset dataset, final SWIGTrainData swigTrainData, - final int constraintGroupIndex) { + final int constraintGroupIndex, + final Optional sampleWeightColIndex) { final DatasetSchema datasetSchema = dataset.getSchema(); final int numFields = datasetSchema.getFieldSchemas().size(); @@ -507,8 +573,13 @@ private static void copyTrainDataToSWIGArrays(final Dataset dataset, swigTrainData.addConstraintGroupValue((int) instance.getValue(constraintGroupIndex)); } + sampleWeightColIndex.ifPresent(integer -> swigTrainData.addSampleWeightValue((float) instance.getValue( + integer))); + for (int colIdx = 0; colIdx < numFields; ++colIdx) { - if (colIdx != targetIndex) { + // Don't add features for target and sample weight columns (in the case of sample weight, + // only if this is defined) + if ((colIdx != targetIndex) && (!sampleWeightColIndex.equals(Optional.of(colIdx))) ) { swigTrainData.addFeatureValue(instance.getValue(colIdx)); } } @@ -522,6 +593,11 @@ private static void copyTrainDataToSWIGArrays(final Dataset dataset, swigTrainData.swigLabelsChunkedArray.get_add_count(); } + if (swigTrainData.useSampleWeight) { + assert swigTrainData.swigSampleWeightsChunkedArray.get_add_count() == + swigTrainData.swigLabelsChunkedArray.get_add_count(); + } + logger.debug("Copied train data of size {} into {} chunks.", swigTrainData.swigLabelsChunkedArray.get_add_count(), swigTrainData.swigLabelsChunkedArray.get_chunks_count() @@ -559,8 +635,11 @@ private static String getLightGBMTrainParamsString(final Map map constraintGroupColIdx.ifPresent( integer -> preprocessedMapParams.put(CONSTRAINT_GROUP_COLUMN_PARAMETER_NAME, Integer.toString(integer))); - // Add all **other** parameters - mapParams.forEach(preprocessedMapParams::putIfAbsent); + // Add all **other** parameters - remove sample weight parameter as it is passed to LightGBM in a different way + // (via lightgbmlib.LGBM_DatasetSetField(..., "weight", ...)) + mapParams.entrySet().stream() + .filter(e -> !e.getKey().equals(SAMPLE_WEIGHT_COL_PARAMETER_NAME)) + .forEach(e -> preprocessedMapParams.putIfAbsent(e.getKey(), e.getValue())); // Build string containing params in LightGBM format final StringBuilder paramsBuilder = new StringBuilder(); diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java index f492f8cf..c7d6c20d 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java @@ -22,12 +22,17 @@ import com.feedzai.openml.data.schema.CategoricalValueSchema; import com.feedzai.openml.data.schema.DatasetSchema; import com.feedzai.openml.data.schema.FieldSchema; +import com.feedzai.openml.data.schema.NumericValueSchema; import com.feedzai.openml.data.schema.StringValueSchema; import com.feedzai.openml.provider.descriptor.fieldtype.ParamValidationError; import com.feedzai.openml.provider.exception.ModelLoadingException; import com.feedzai.openml.provider.model.MachineLearningModelTrainer; import com.feedzai.openml.util.load.LoadSchemaUtils; import com.google.common.collect.ImmutableList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,7 +136,20 @@ public LightGBMBinaryClassificationModel fit(final Dataset dataset, try { LightGBMBinaryClassificationModelTrainer.fit( dataset, params, tmpModelFilePath); - return loadModel(tmpModelFilePath, dataset.getSchema()); + + // Build a schema without the weight column for model loading validation + final DatasetSchema schemaForLoading; + final Optional weightColIdx = + SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, dataset.getSchema()); + if (weightColIdx.isPresent()) { + final List fieldsWithoutWeight = dataset.getSchema().getPredictiveFields().stream() + .filter(field -> field.getFieldIndex() != weightColIdx.get()) + .collect(Collectors.toList()); + schemaForLoading = new DatasetSchema(fieldsWithoutWeight); + } else { + schemaForLoading = dataset.getSchema(); + } + return loadModel(tmpModelFilePath, schemaForLoading); } catch (final Exception e) { logger.error("Could not train the model."); throw new RuntimeException(e); @@ -155,7 +173,8 @@ public List validateForFit(final Path pathToPersist, errorsBuilder .addAll(validateModelPathToTrain(pathToPersist)) .addAll(validateSchema(schema)) - .addAll(validateFitParams(params)); + .addAll(validateFitParams(params)) + .addAll(validateSampleWeightsCol(schema, params)); return errorsBuilder.build(); } @@ -183,6 +202,42 @@ private List validateSchema(final DatasetSchema schema) { return errorsBuilder.build(); } + /** + * Ensure that if the sample weight column parameter is specified, it corresponds + * to a column in the dataset schema + * + * @param schema Dataset schema. + * @param params Model fit parameters. + * @return list of validation errors. + */ + private List validateSampleWeightsCol(DatasetSchema schema, + final Map params) { + // Don't test anything if the parameter is not set: + final Optional sampleWeightFieldName = SampleWeightParamParserUtil.getSampleWeightFieldName(params); + if (!sampleWeightFieldName.isPresent()) { + return ImmutableList.of(); + } + + // Check if the field exists in the dataset: + final Optional sampleWeightColIndex = + SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, schema); + if (!sampleWeightColIndex.isPresent()) { + return ImmutableList.of(new ParamValidationError(String.format( + "Sample weight field %s doesn't exist in the dataset.", + sampleWeightFieldName.get() + ))); + } + + // Ensure the sample weight field is numeric + final FieldSchema sampleWeightSchema = schema.getFieldSchemas().get(sampleWeightColIndex.get()); + final AbstractValueSchema valueSchema = sampleWeightSchema.getValueSchema(); + if (!(valueSchema instanceof NumericValueSchema)) { + return ImmutableList.of(new ParamValidationError("Sample weight must be a numeric field!")); + } + + return ImmutableList.of(); + } + /** * Validate model fit parameters. * @@ -235,11 +290,21 @@ public LightGBMBinaryClassificationModel loadModel(final Path modelPath, throw new ModelLoadingException(ERROR_MSG_CANNOT_LOAD_NON_BINARY_LIGHTGBM_MODEL); } - if (model.getBoosterNumFeatures() != schema.getPredictiveFields().size()) { + // Check predictive fields size + // - In LightGBM, if the sample weights are provided then the trained model will not + // have this field, but the DatasetSchema will -- Need to exclude this field + // In short, ensure all fields in model.getBoosterNumFeatures() exist in the DatasetSchema + final String[] boosterFeatureNames = model.getBoosterFeatureNames(); + final Set modelFeatureSet = new HashSet<>(Arrays.asList(boosterFeatureNames)); + final List relevantFields = schema.getPredictiveFields().stream() + .filter(field -> modelFeatureSet.contains(field.getFieldName().replace(" ", "_"))) + .collect(Collectors.toList()); + + if (relevantFields.size() != boosterFeatureNames.length) { throw new ModelLoadingException(ERROR_MSG_SCHEMA_WITH_WRONG_PREDICTIVE_FIELDS_SIZE); } - if (!schemaMatchAllFeatures(schema, model.getBoosterFeatureNames())) { + if (!schemaMatchAllFeatures(relevantFields, boosterFeatureNames)) { throw new ModelLoadingException(ERROR_MSG_SCHEMA_WITH_WRONG_PREDICTIVE_FIELD_NAMES); } @@ -338,18 +403,18 @@ private static Optional getNumTargetClasses(final DatasetSchema schema) } /** - * Gets the feature names from schema. + * Gets the feature names from the given fields. * * @implNote The space character is replaced with underscore * to comply with LightGBM's model features representation. * - * @param schema Schema + * @param fields List of field schemas. * @return Feature names from the schema. * @since 1.0.18 */ - private static String[] getFeatureNamesFrom(final DatasetSchema schema) { + private static String[] getFeatureNamesFrom(final List fields) { - return schema.getPredictiveFields().stream() + return fields.stream() .map(FieldSchema::getFieldName) .map(fieldName -> fieldName.replace(" ", "_")) .toArray(String[]::new); @@ -357,18 +422,19 @@ private static String[] getFeatureNamesFrom(final DatasetSchema schema) { /** * Performs a one-by-one feature name comparison between a - * {@link DatasetSchema} and an array of feature names. - * This way the first mismatch is logged, improving debug. + * given list of {@link FieldSchema} and an array of feature + * names. This way the first mismatch is logged, improving debug. * - * @param schema Schema + * @param schemaRelevantFeatureNames Schema * @param featureNames Feature names to validate. * @return {@code true} if the schema predictive field names * match the provided array, {@code false} otherwise. * @since 1.0.18 */ - private boolean schemaMatchAllFeatures(final DatasetSchema schema, final String[] featureNames) { + private boolean schemaMatchAllFeatures(List schemaRelevantFeatureNames, + final String[] featureNames) { - final String[] schemaFeatureNames = getFeatureNamesFrom(schema); + final String[] schemaFeatureNames = getFeatureNamesFrom(schemaRelevantFeatureNames); boolean isMatch = true; diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java index 1036e753..7ef21c58 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java @@ -92,6 +92,16 @@ public class SWIGTrainData implements AutoCloseable { */ floatChunkedArray swigLabelsChunkedArray; + /** + * SWIG object to hold the sample weights in chunks. + */ + floatChunkedArray swigSampleWeightsChunkedArray; + + /** + * SWIG pointer to the coalesced sample weights array. + */ + SWIGTYPE_p_float swigSampleWeightsDataArray; + /** * SWIG object to hold the constraint groups in chunks. */ @@ -102,6 +112,11 @@ public class SWIGTrainData implements AutoCloseable { */ public final boolean fairnessConstrained; + /** + * Whether the LightGBM model uses sample weights for training. + */ + public final boolean useSampleWeight; + /** * Constructor. * @@ -115,7 +130,7 @@ public class SWIGTrainData implements AutoCloseable { * @param numInstancesChunk The number of instances per chunk of data. */ public SWIGTrainData(final int numFeatures, final long numInstancesChunk) { - this(numFeatures, numInstancesChunk, false); + this(numFeatures, numInstancesChunk, false, false); } /** @@ -131,11 +146,14 @@ public SWIGTrainData(final int numFeatures, final long numInstancesChunk) { * @param numInstancesChunk The number of instances per chunk of data. * @param fairnessConstrained Whether this data will be used for a model with fairness (group) constraints. */ - public SWIGTrainData(final int numFeatures, final long numInstancesChunk, final boolean fairnessConstrained) { + public SWIGTrainData(final int numFeatures, final long numInstancesChunk, + final boolean fairnessConstrained, + final boolean useSampleWeight) { this.numFeatures = numFeatures; this.numInstancesChunk = numInstancesChunk; this.swigOutDatasetHandlePtr = lightgbmlib.voidpp_handle(); this.fairnessConstrained = fairnessConstrained; + this.useSampleWeight = useSampleWeight; logger.debug("Intermediate SWIG train buffers will be allocated in chunks of {} instances.", numInstancesChunk); // 1-D Array in row-major-order that stores only the features (excludes label) in double format by chunks: @@ -148,6 +166,10 @@ public SWIGTrainData(final int numFeatures, final long numInstancesChunk, final if (this.fairnessConstrained) { this.swigConstraintGroupChunkedArray = new int32ChunkedArray(numInstancesChunk); } + + if (this.useSampleWeight) { + this.swigSampleWeightsChunkedArray = new floatChunkedArray(numInstancesChunk); + } } /** @@ -165,6 +187,11 @@ public void addLabelValue(float value) { this.swigLabelsChunkedArray.add(value); } + public void addSampleWeightValue(float value) { + assert this.useSampleWeight : "Attempting to set sample weight data with useSampleWeight=false"; + this.swigSampleWeightsChunkedArray.add(value); + } + /** * Adds a value to the constraint group ChunkedArray. * @param value the value to add. @@ -204,6 +231,18 @@ SWIGTYPE_p_int coalesceChunkedSwigConstraintGroupDataArray() { return this.swigConstraintGroupDataArray; } + /** + * Initializes the swigWeightDataArray, copies the chunked constraint group array data to it, + * and releases the chunked data from memory. + */ + SWIGTYPE_p_float coalesceChunkedSwigSampleWeightDataArray() { + assert this.useSampleWeight && this.swigSampleWeightsChunkedArray != null; + this.swigSampleWeightsDataArray = lightgbmlib.new_floatArray(this.swigSampleWeightsChunkedArray.get_add_count()); + this.swigSampleWeightsChunkedArray.coalesce_to(this.swigSampleWeightsDataArray); + this.swigSampleWeightsChunkedArray.release(); + return this.swigSampleWeightsDataArray; + } + /** * Setup swigDatasetHandle after its setup. */ @@ -235,6 +274,17 @@ void destroySwigConstraintGroupDataArray() { } } + /** + * Release the memory of the sample weight array. + * This can be called after instantiating the dataset and setting the sample weight. + */ + void destroySwigSampleWeightsDataArray() { + if (this.swigSampleWeightsDataArray != null) { + lightgbmlib.delete_floatArray(this.swigSampleWeightsDataArray); + this.swigSampleWeightsDataArray = null; + } + } + /** * Release the memory of the chunked features array. @@ -250,6 +300,8 @@ void releaseSwigTrainFeaturesChunkedArray() { /** * Releases the ChunkedArrays of both features and label. + * If ChunkedArrays for constraint group and/or sample weights are + * defined, these are also released. * Idempotent. After calling this ChunkedArrays cannot be re-used. */ void releaseChunkedResources() { @@ -259,6 +311,9 @@ void releaseChunkedResources() { if (this.swigConstraintGroupChunkedArray != null) { this.swigConstraintGroupChunkedArray.release(); } + if (this.swigSampleWeightsChunkedArray != null) { + this.swigSampleWeightsChunkedArray.release(); + } } /** @@ -271,6 +326,7 @@ public void close() { releaseChunkedResources(); destroySwigTrainLabelDataArray(); destroySwigConstraintGroupDataArray(); + destroySwigSampleWeightsDataArray(); if (this.swigOutDatasetHandlePtr != null) { lightgbmlib.delete_voidpp(this.swigOutDatasetHandlePtr); From 74ceac054b9a062484b8df98a9901914bee2879d Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Wed, 13 May 2026 18:15:30 +0100 Subject: [PATCH 06/27] chore(lightgbm): updated tests to validate sample weight --- ...MBinaryClassificationModelTrainerTest.java | 120 +++ .../lightgbm/LightGBMModelCreatorTest.java | 53 ++ .../provider/lightgbm/TestResources.java | 11 + .../openml/provider/lightgbm/TestSchemas.java | 14 + .../resources/instances_with_fraud_weight.csv | 713 ++++++++++++++++++ .../test/resources/instances_with_weight.csv | 713 ++++++++++++++++++ 6 files changed, 1624 insertions(+) create mode 100644 openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_fraud_weight.csv create mode 100644 openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_weight.csv diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java index 2b075b99..fbeb611f 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java @@ -22,6 +22,8 @@ import com.feedzai.openml.data.schema.DatasetSchema; import com.feedzai.openml.mocks.MockDataset; import com.feedzai.openml.provider.exception.ModelLoadingException; + +import java.util.Arrays; import org.junit.BeforeClass; import org.junit.Test; @@ -38,6 +40,7 @@ import java.util.Random; import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.NUM_ITERATIONS_PARAMETER_NAME; +import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SAMPLE_WEIGHT_COL_PARAMETER_NAME; import static java.nio.file.Files.createTempFile; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -301,6 +304,43 @@ public void fitWithNonASCIIFeatureNameIsPossible() { .isBetween(0.0, 1.0); } + /** + * Asserts that a model can be successfully trained with a sample weight column, + * and that the weight column is excluded from the model's features. + * + * @throws URISyntaxException For errors when loading the dataset resource. + * @throws IOException For errors when reading the dataset. + */ + @Test + public void fitWithSampleWeight() throws URISyntaxException, IOException { + // Replace "sample_weight" key-value pair in default model params + final Map params = new HashMap<>(MODEL_PARAMS); + params.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "sample_weight_double"); + + final Dataset dataset = CSVUtils.getDatasetWithSchema( + TestResources.getResourcePath(TestResources.INSTANCES_WITH_SAMPLE_WEIGHT_NAME), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END, + MAX_NUMBER_OF_INSTANCES_TO_TRAIN + ); + + try(final LightGBMBinaryClassificationModel model = fit( + dataset, + params, + SMALL_TRAIN_DATA_CHUNK_INSTANCES_SIZE + )) { + // Assert model trained successfully - sample weight column is not feature + assertThat(model.getBoosterNumFeatures()) + .as("Model features should not include sample weight") + .isEqualTo(4); + + assertThat(Arrays.asList(model.getBoosterFeatureNames())) + .as("Model feature names should not contain the weight column") + .doesNotContain("sample_weight_double"); + } catch (final Exception e) { + throw new RuntimeException("Could not train model with sample weights: ", e); + } + } + /** * Test Feature Contributions with target at end. * @@ -352,6 +392,59 @@ public void testFeatureContributionsTargetBeginning() throws URISyntaxException, ensureFeatureContributions(dataset, MODEL_PARAMS); } + /** + * Asserts that sample weights affect model training by comparing recall between + * a model trained with high weights on fraud (10x) and a model trained without weights. + * The weighted model should achieve higher recall due to increased penalty on false negatives + * @throws URISyntaxException For errors when loading the dataset resource. + * @throws IOException For errors when reading the dataset. + */ + @Test + public void testSampleWeightAffectsRecall() throws URISyntaxException, IOException { + // Train first model and compute its recall + final Map unweightedParams = new HashMap<>(MODEL_PARAMS); + unweightedParams.put(NUM_ITERATIONS_PARAMETER_NAME, "10"); + final Dataset dataset = CSVUtils.getDatasetWithSchema( + TestResources.getResourcePath(TestResources.INSTANCES_WITH_SAMPLE_WEIGHT_NAME), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END, + MAX_NUMBER_OF_INSTANCES_TO_TRAIN + ); + + final double recallUnweighted; + try (final LightGBMBinaryClassificationModel model = fit( + dataset, unweightedParams, SMALL_TRAIN_DATA_CHUNK_INSTANCES_SIZE + )) { + recallUnweighted = computeRecall(dataset, model); + } catch (final Exception e) { + throw new RuntimeException(e); + } + + // Train second model and compute its recall + final Map weightedParams = new HashMap<>(MODEL_PARAMS); + weightedParams.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "sample_weight_double"); + weightedParams.put(NUM_ITERATIONS_PARAMETER_NAME, "10"); + + final Dataset weightedDataset = CSVUtils.getDatasetWithSchema( + TestResources.getResourcePath(TestResources.INSTANCES_WITH_FRAUD_SAMPLE_WEIGHT_NAME), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END, + MAX_NUMBER_OF_INSTANCES_TO_TRAIN + ); + + final double recallWeighted; + try (final LightGBMBinaryClassificationModel model = fit( + weightedDataset, weightedParams, SMALL_TRAIN_DATA_CHUNK_INSTANCES_SIZE + )){ + recallWeighted = computeRecall(dataset, model); + } catch (final Exception e) { + throw new RuntimeException(e); + } + + // Assert that the recall of the second model (weighted samples) is higher + assertThat(recallWeighted) + .as("Weighted model (high weight on fraud) should have higher recall") + .isGreaterThan(recallUnweighted); + } + /** * Ensures feature contributions results by given dataset. * @@ -533,4 +626,31 @@ static ArrayList> getListOfTwoLists() { list.add(new LinkedList<>()); return list; } + + /** + * Computes recall (true positive rate) for the positive class using a 0.5 threshold + * + * @param dataset Dataset with labeled instances. + * @param model Trained model to evaluate. + * @return Recall value. + */ + static double computeRecall(final Dataset dataset, final LightGBMBinaryClassificationModel model) { + final int targetIndex = dataset.getSchema().getTargetIndex().get(); + int truePositives = 0; + int actualPositives = 0; + + final Iterator iterator = dataset.getInstances(); + while (iterator.hasNext()) { + final Instance instance = iterator.next(); + final int actualClass = (int) instance.getValue(targetIndex); + if (actualClass == 1) { + actualPositives++; + final double[] scores = model.getClassDistribution(instance); + if (scores[1] > 0.5) { + truePositives++; + } + } + } + return actualPositives > 0 ? (double) truePositives / actualPositives : 0.0; + } } diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java index d3a147dd..2e29091a 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Map; +import static com.feedzai.openml.provider.lightgbm.LightGBMDescriptorUtil.SAMPLE_WEIGHT_COL_PARAMETER_NAME; import static com.feedzai.openml.provider.lightgbm.LightGBMModelCreator.ERROR_MSG_NON_BINARY_TARGET; import static com.feedzai.openml.provider.lightgbm.LightGBMModelCreator.ERROR_MSG_PREFIX_CANNOT_FIND_MODEL_FILE; import static com.feedzai.openml.provider.lightgbm.LightGBMModelCreator.ERROR_MSG_RANDOM_FOREST_REQUIRES_BAGGING; @@ -332,6 +333,20 @@ public void loadModelFileDoesNotThrowTest() { ).doesNotThrowAnyException(); } + /** + * Assert that loading a model with a schema containing sample weights works. + */ + @Test + public void loadModelFileWithSampleWeightDoesNotThrowTest() { + + assertThatCode(() -> + modelLoader.loadModel( + TestResources.getModelFilePath(), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END + ) + ).doesNotThrowAnyException(); + } + /** * Assert that validate for fir doesn't return errors if inputs are Ok. */ @@ -410,6 +425,44 @@ public void validateForFitNoTargetReturnsErrorsTest() { assertThat(errors.size()).as("error count").isPositive(); } + /** + * Asserts that validateForFit returns an error when the sample weight parameter + * references a column that does not exist in the schema. + */ + @Test + public void validateForFitSampleWeightColumnNotInSchemaReturnsErrorTest() { + final Map params = TestParameters.getDefaultLightGBMParameters(); + params.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "__sample_column__"); + + final List errors = modelLoader.validateForFit( + tmpEmptyDir, + TestSchemas.NUMERICALS_SCHEMA_WITH_LABEL_AT_END, + params + ); + + assertThat(errors).as("Should return error for nonexistent sample weight column").hasSize(1); + assertThat(errors.get(0).getMessage()).contains("doesn't exist in the dataset"); + } + + /** + * Assert that validateForFit returns an error when the sample weight parameter + * references a non-numeric column. + */ + @Test + public void validateWeightColumnNonNumericReturnsErrorTest() { + final Map params = TestParameters.getDefaultLightGBMParameters(); + params.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "is_fraud_label_indexed"); + + final List errors = modelLoader.validateForFit( + tmpEmptyDir, + TestSchemas.NUMERICALS_SCHEMA_WITH_LABEL_AT_END, + params + ); + + assertThat(errors).as("Should return error for non-numeric sample weight column").hasSize(1); + assertThat(errors.get(0).getMessage()).isEqualTo("Sample weight must be a numeric field!"); + } + /** * Asserts that there are no errors. * diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java index 49d2f533..5959b62d 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java @@ -38,6 +38,17 @@ public class TestResources { */ public static final String SCORED_INSTANCES_NAME = "scored_instances.csv"; + /** + * Name of the resource containing instances with random sample weights, between 0 and 2. + */ + public static final String INSTANCES_WITH_SAMPLE_WEIGHT_NAME = "instances_with_weight.csv"; + + /** + * Name of the resource containing instances with sample weights where fraud instances (class 1) have + * weight 10, and non-fraud instances (class 0) have weight 1. + */ + public static final String INSTANCES_WITH_FRAUD_SAMPLE_WEIGHT_NAME = "instances_with_fraud_weight.csv"; + /** * Model folder resource name. */ diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestSchemas.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestSchemas.java index 61d9e6b6..cfe71683 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestSchemas.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestSchemas.java @@ -102,6 +102,20 @@ public class TestSchemas { .build() ); + /** + * Schema with numerical features, a numeric sample weight column, and binary label at end. + * Fields: amount(0), num1_float(1), num2_double(2), num3_int(3), sample_weight_double(4), + * is_fraud_label_indexed(5). + */ + public static final DatasetSchema NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END = new DatasetSchema( + 5, + ImmutableList.builder() + .addAll(NUMERICAL_SCHEMA_FEATURES) + .add(new FieldSchema("sample_weight_double", 4, new NumericValueSchema(false))) + .add(SchemaUtils.getFieldCopyWithIndex(FRAUD_LABEL_INDEXED_FIELD, 5)) + .build() + ); + /** * Test schema with categoricals and label as last field in instance. * diff --git a/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_fraud_weight.csv b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_fraud_weight.csv new file mode 100644 index 00000000..ffea50e4 --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_fraud_weight.csv @@ -0,0 +1,713 @@ +card,amount,event_timestamp,uuid,num1_float,num2_double,num3_int,cat1_string,is_fraud_label_indexed,sample_weight_double +17,567,2018-10-6,1049288,160.4,6025580.7,11819,C,1.0,10.0 +56,38,2018-10-6,1049289,83.4,5283538.7,10565,aaa,0.0,1.0 +7,503,2018-11-5,1049290,757.4,28760094.7,11177,b,0.0,1.0 +15,749,2018-11-22,1049291,319.4,3522113.7,11822,b,0.0,1.0 +87,524,2018-12-3,1049292,815.4,32883183.7,11003,aaa,0.0,1.0 +48,968,2018-10-7,1049293,34.4,3723194.7,11699,b,0.0,1.0 +91,552,2018-11-19,1049294,474.4,12149864.7,11836,aaa,0.0,1.0 +44,902,2018-11-1,1049295,111.4,27091506.7,11830,b,0.0,1.0 +51,26,2018-12-27,1049296,521.4,17449759.7,11991,b,0.0,1.0 +35,24,2018-10-18,1049297,404.4,37359857.7,11554,C,0.0,1.0 +21,582,2018-11-15,1049298,645.4,8400166.7,11341,C,1.0,10.0 +20,128,2018-11-13,1049299,953.4,28996407.7,10890,aaa,0.0,1.0 +54,847,2018-12-18,1049300,18.4,19075072.7,11065,C,0.0,1.0 +54,636,2018-11-8,1049301,546.4,6903447.7,11121,dDd,0.0,1.0 +85,231,2018-10-10,1049302,645.4,19859752.7,10973,aaa,0.0,1.0 +6,691,2018-10-28,1049303,74.4,31026014.7,10388,b,0.0,1.0 +29,311,2018-11-15,1049304,957.4,22808904.7,10299,b,0.0,1.0 +78,805,2018-10-27,1049305,931.4,10358131.7,10907,C,0.0,1.0 +84,882,2018-12-10,1049306,790.4,37998060.7,11038,b,0.0,1.0 +57,579,2018-11-25,1049307,954.4,35367561.7,11540,C,0.0,1.0 +79,544,2018-11-21,1049308,67.4,34387902.7,10280,dDd,0.0,1.0 +92,649,2018-12-13,1049309,295.4,16600833.7,11241,b,0.0,1.0 +46,152,2018-10-3,1049310,692.4,31376892.7,11776,b,0.0,1.0 +37,832,2018-11-25,1049311,77.4,33046809.7,10262,b,0.0,1.0 +79,90,2018-11-1,1049312,897.4,26019875.7,11006,b,0.0,1.0 +36,419,2018-10-3,1049313,848.4,33393435.7,10937,b,0.0,1.0 +99,194,2018-10-28,1049314,389.4,16413028.7,10230,aaa,0.0,1.0 +18,977,2018-11-1,1049315,602.4,36307673.7,11421,dDd,0.0,1.0 +59,643,2018-11-27,1049316,170.4,8919422.7,11490,dDd,0.0,1.0 +39,320,2018-10-24,1049317,530.4,8713834.7,11933,aaa,0.0,1.0 +29,950,2018-11-22,1049318,44.4,11624206.7,10918,dDd,0.0,1.0 +50,359,2018-12-29,1049319,937.4,8182500.7,10396,C,0.0,1.0 +69,961,2018-11-18,1049320,999.4,13074615.7,10372,aaa,0.0,1.0 +17,173,2018-11-18,1049321,527.4,4531587.7,11237,aaa,0.0,1.0 +90,480,2018-12-1,1049322,594.4,19013138.7,10573,dDd,0.0,1.0 +41,528,2018-10-5,1049323,424.4,31516519.7,10731,b,0.0,1.0 +49,641,2018-12-19,1049324,599.4,21868175.7,10771,b,0.0,1.0 +46,672,2018-11-3,1049325,396.4,27860735.7,11473,b,0.0,1.0 +16,552,2018-10-21,1049326,627.4,25320892.7,11056,C,1.0,10.0 +95,613,2018-12-1,1049327,818.4,31341462.7,10873,dDd,0.0,1.0 +75,910,2018-11-14,1049328,644.4,11239364.7,10776,dDd,0.0,1.0 +51,179,2018-12-16,1049329,774.4,29858606.7,11328,dDd,0.0,1.0 +30,477,2018-12-24,1049330,521.4,4150163.7,10661,C,1.0,10.0 +58,266,2018-11-4,1049331,522.4,37458619.7,11806,dDd,0.0,1.0 +49,319,2018-12-29,1049332,707.4,22404561.7,11808,dDd,0.0,1.0 +74,924,2018-12-10,1049333,686.4,16087861.7,11949,aaa,0.0,1.0 +49,673,2018-12-20,1049334,117.4,14259755.7,11403,C,1.0,10.0 +27,642,2018-12-3,1049335,879.4,28985545.7,10193,C,0.0,1.0 +31,702,2018-10-10,1049336,180.4,25185877.7,11748,b,0.0,1.0 +36,101,2018-11-30,1049337,923.4,15362870.7,10519,dDd,0.0,1.0 +26,296,2018-11-1,1049338,843.4,26609141.7,11301,b,0.0,1.0 +3,412,2018-12-22,1049339,354.4,23396197.7,11876,b,0.0,1.0 +26,265,2018-11-12,1049340,961.4,10331127.7,11151,dDd,0.0,1.0 +80,987,2018-12-22,1049341,255.4,18799834.7,11832,dDd,0.0,1.0 +85,50,2018-10-17,1049342,25.4,4539677.7,11563,aaa,0.0,1.0 +63,553,2018-10-25,1049343,447.4,36735570.7,10287,b,0.0,1.0 +61,778,2018-11-26,1049344,362.4,5427283.7,11992,aaa,0.0,1.0 +85,544,2018-11-16,1049345,52.4,4001584.7,10558,aaa,0.0,1.0 +9,138,2018-11-9,1049346,270.4,37231785.7,10929,C,0.0,1.0 +10,616,2018-12-9,1049347,334.4,27942777.7,11806,aaa,0.0,1.0 +42,858,2018-12-23,1049348,158.4,8404215.7,10777,dDd,0.0,1.0 +69,6,2018-11-13,1049349,546.4,15308850.7,11832,dDd,0.0,1.0 +71,456,2018-11-6,1049350,13.4,11477405.7,10776,dDd,0.0,1.0 +69,424,2018-10-17,1049351,877.4,7552889.7,10988,b,0.0,1.0 +91,412,2018-12-1,1049352,142.4,23523400.7,10300,C,1.0,10.0 +41,7,2018-10-8,1049353,764.4,798581.7,11735,dDd,0.0,1.0 +2,656,2018-12-30,1049354,142.4,7892579.7,10920,C,1.0,10.0 +32,174,2018-10-15,1049355,424.4,30096218.7,11920,C,0.0,1.0 +74,102,2018-12-17,1049356,628.4,9966560.7,11969,aaa,0.0,1.0 +39,597,2018-11-28,1049357,174.4,18238744.7,11288,dDd,0.0,1.0 +96,339,2018-12-10,1049358,810.4,332899.7,11519,aaa,0.0,1.0 +85,350,2018-12-12,1049359,954.4,2988438.7,10731,b,0.0,1.0 +93,170,2018-11-12,1049360,916.4,20065446.7,11591,C,0.0,1.0 +39,447,2018-10-6,1049361,146.4,39232857.7,11760,dDd,0.0,1.0 +89,704,2018-10-3,1049362,738.4,13707294.7,10924,C,0.0,1.0 +26,559,2018-10-27,1049363,558.4,23584741.7,11565,dDd,0.0,1.0 +45,459,2018-11-26,1049364,822.4,17639277.7,11100,aaa,0.0,1.0 +6,266,2018-11-12,1049365,953.4,27744001.7,10920,b,0.0,1.0 +95,612,2018-10-18,1049366,592.4,29096246.7,10451,b,0.0,1.0 +18,547,2018-10-4,1049367,251.4,38682762.7,11877,aaa,0.0,1.0 +7,812,2018-11-1,1049368,546.4,38793076.7,10342,b,0.0,1.0 +30,337,2018-10-29,1049369,509.4,38968593.7,10310,dDd,0.0,1.0 +82,645,2018-12-14,1049370,752.4,35080814.7,10726,dDd,0.0,1.0 +5,771,2018-10-7,1049371,451.4,1491396.7,11898,b,0.0,1.0 +30,470,2018-10-2,1049372,867.4,7016700.7,10355,C,0.0,1.0 +97,752,2018-12-12,1049373,652.4,12584033.7,11393,b,0.0,1.0 +35,457,2018-12-4,1049374,4.4,10623678.7,11012,C,1.0,10.0 +48,999,2018-12-12,1049375,181.4,26896719.7,11864,b,0.0,1.0 +63,971,2018-11-16,1049376,300.4,29618446.7,10605,aaa,0.0,1.0 +40,659,2018-11-13,1049377,935.4,35644646.7,10331,aaa,0.0,1.0 +70,524,2018-10-26,1049378,893.4,4015615.7,10365,aaa,0.0,1.0 +80,586,2018-10-10,1049379,834.4,11959317.7,10399,aaa,0.0,1.0 +32,323,2018-12-15,1049380,307.4,28778499.7,10012,aaa,0.0,1.0 +37,99,2018-11-6,1049381,223.4,15410836.7,11786,b,0.0,1.0 +98,751,2018-11-17,1049382,533.4,35268985.7,10634,dDd,0.0,1.0 +89,176,2018-10-25,1049383,323.4,33315743.7,10637,dDd,0.0,1.0 +17,226,2018-12-7,1049384,119.4,26961321.7,10831,C,0.0,1.0 +49,629,2018-12-26,1049385,557.4,2256305.7,10302,b,0.0,1.0 +8,95,2018-10-8,1049386,864.4,23430968.7,11426,aaa,0.0,1.0 +99,397,2018-11-3,1049387,93.4,20621185.7,10267,C,0.0,1.0 +10,309,2018-11-29,1049388,701.4,16742514.7,11911,b,0.0,1.0 +3,866,2018-10-4,1049389,56.4,22865562.7,11820,dDd,0.0,1.0 +65,419,2018-12-10,1049390,656.4,3643620.7,11842,aaa,0.0,1.0 +94,28,2018-10-30,1049391,387.4,37732277.7,11360,b,0.0,1.0 +25,214,2018-12-29,1049392,228.4,8527569.7,11042,dDd,0.0,1.0 +100,753,2018-12-19,1049393,80.4,26252736.7,11731,aaa,0.0,1.0 +25,462,2018-11-27,1049394,712.4,30032785.7,11701,aaa,0.0,1.0 +43,703,2018-10-11,1049395,615.4,32048887.7,11958,C,0.0,1.0 +62,419,2018-12-17,1049396,424.4,7517607.7,10732,aaa,0.0,1.0 +49,96,2018-11-18,1049397,188.4,4148488.7,10887,dDd,0.0,1.0 +0,472,2018-11-23,1049398,839.4,891910.7,10073,dDd,0.0,1.0 +16,364,2018-12-27,1049399,404.4,35638674.7,11463,b,0.0,1.0 +27,489,2018-10-29,1049400,496.4,34884999.7,11699,b,0.0,1.0 +61,676,2018-10-19,1049401,972.4,35040651.7,11796,dDd,0.0,1.0 +25,169,2018-12-3,1049402,573.4,16312929.7,10295,aaa,0.0,1.0 +94,818,2018-10-2,1049403,114.4,15176170.7,11895,dDd,0.0,1.0 +57,674,2018-12-14,1049404,23.4,25085712.7,10857,dDd,0.0,1.0 +37,239,2018-10-21,1049405,692.4,22977705.7,10273,C,0.0,1.0 +29,962,2018-12-9,1049406,653.4,26601831.7,11616,b,0.0,1.0 +43,200,2018-10-24,1049407,973.4,25474351.7,11384,b,0.0,1.0 +0,491,2018-12-10,1049408,174.4,13135459.7,10549,b,0.0,1.0 +5,132,2018-10-17,1049409,666.4,30477808.7,10253,b,0.0,1.0 +43,809,2018-10-10,1049410,775.4,11598450.7,11232,b,0.0,1.0 +99,669,2018-11-10,1049411,21.4,8480195.7,11104,dDd,0.0,1.0 +1,781,2018-10-11,1049412,485.4,4735963.7,11505,C,0.0,1.0 +8,178,2018-11-7,1049413,979.4,34664212.7,11941,C,0.0,1.0 +32,115,2018-12-4,1049414,486.4,19001289.7,10731,C,0.0,1.0 +16,423,2018-12-21,1049415,274.4,16735797.7,11887,dDd,0.0,1.0 +93,735,2018-10-28,1049416,878.4,15996480.7,10525,C,0.0,1.0 +96,95,2018-10-4,1049417,31.4,6696057.7,11861,dDd,0.0,1.0 +59,31,2018-10-27,1049418,723.4,844560.7,10124,aaa,0.0,1.0 +90,330,2018-10-19,1049419,164.4,31217361.7,10675,C,0.0,1.0 +15,168,2018-12-10,1049420,205.4,17969936.7,11753,aaa,0.0,1.0 +30,742,2018-10-13,1049421,542.4,12175267.7,10551,dDd,0.0,1.0 +97,867,2018-10-5,1049422,182.4,18356710.7,10680,C,0.0,1.0 +68,159,2018-11-3,1049423,275.4,31053000.7,11540,dDd,0.0,1.0 +36,711,2018-10-5,1049424,262.4,31535243.7,10447,b,0.0,1.0 +42,481,2018-12-4,1049425,745.4,39197227.7,10699,b,0.0,1.0 +11,661,2018-12-22,1049426,526.4,37307237.7,11889,C,1.0,10.0 +72,380,2018-10-7,1049427,906.4,20607507.7,10642,b,0.0,1.0 +53,103,2018-12-16,1049428,218.4,7616086.7,10258,b,0.0,1.0 +36,402,2018-12-22,1049429,770.4,23259431.7,11350,b,0.0,1.0 +23,990,2018-11-14,1049430,871.4,25274658.7,10442,b,0.0,1.0 +44,301,2018-12-5,1049431,27.4,4670603.7,11472,b,0.0,1.0 +0,513,2018-10-19,1049432,373.4,36532176.7,10186,C,1.0,10.0 +13,415,2018-11-7,1049433,629.4,28633245.7,11822,dDd,0.0,1.0 +5,317,2018-10-25,1049434,649.4,13168783.7,10529,dDd,0.0,1.0 +55,251,2018-11-27,1049435,993.4,22013773.7,10673,C,0.0,1.0 +47,51,2018-12-18,1049436,618.4,3456270.7,11615,dDd,0.0,1.0 +90,877,2018-11-1,1049437,901.4,12666128.7,10633,b,0.0,1.0 +44,626,2018-12-17,1049438,56.4,9089618.7,11024,aaa,0.0,1.0 +41,112,2018-11-2,1049439,238.4,29917321.7,11834,dDd,0.0,1.0 +72,478,2018-10-8,1049440,909.4,14433213.7,10557,dDd,0.0,1.0 +38,306,2018-12-4,1049441,324.4,6569835.7,10620,dDd,0.0,1.0 +51,324,2018-11-9,1049442,665.4,31890909.7,11062,aaa,0.0,1.0 +98,60,2018-10-26,1049443,116.4,23384717.7,11083,dDd,0.0,1.0 +54,641,2018-10-9,1049444,624.4,16638992.7,11697,aaa,0.0,1.0 +76,640,2018-12-13,1049445,689.4,24430247.7,11096,aaa,0.0,1.0 +56,814,2018-11-27,1049446,14.4,37625839.7,11302,aaa,0.0,1.0 +86,533,2018-11-1,1049447,163.4,245131.7,10473,aaa,0.0,1.0 +89,686,2018-11-4,1049448,457.4,15016709.7,11890,b,0.0,1.0 +48,443,2018-10-28,1049449,351.4,7795400.7,11179,dDd,0.0,1.0 +47,618,2018-12-16,1049450,572.4,12519492.7,10666,b,0.0,1.0 +20,403,2018-10-18,1049451,357.4,5029242.7,11981,dDd,0.0,1.0 +62,238,2018-10-20,1049452,235.4,24811206.7,10705,C,0.0,1.0 +45,569,2018-12-27,1049453,953.4,17939174.7,10286,b,0.0,1.0 +5,406,2018-11-19,1049454,468.4,2646862.7,10437,aaa,0.0,1.0 +98,218,2018-12-13,1049455,992.4,19349809.7,10036,C,0.0,1.0 +86,974,2018-10-29,1049456,64.4,36516019.7,10536,C,0.0,1.0 +12,627,2018-11-26,1049457,466.4,3112591.7,11093,aaa,0.0,1.0 +90,600,2018-12-17,1049458,231.4,7624169.7,11984,dDd,0.0,1.0 +59,237,2018-12-12,1049459,600.4,38441315.7,11117,dDd,0.0,1.0 +77,780,2018-12-9,1049460,368.4,24752703.7,11455,aaa,0.0,1.0 +30,39,2018-11-9,1049461,320.4,12058750.7,11233,aaa,0.0,1.0 +78,203,2018-10-27,1049462,593.4,24970811.7,10249,dDd,0.0,1.0 +13,688,2018-10-1,1049463,615.4,29657479.7,11569,dDd,0.0,1.0 +91,78,2018-12-5,1049464,563.4,7204973.7,10594,aaa,0.0,1.0 +31,218,2018-10-17,1049465,558.4,4362915.7,11650,C,0.0,1.0 +5,899,2018-10-27,1049466,845.4,17971788.7,10178,C,0.0,1.0 +53,891,2018-11-12,1049467,274.4,26592075.7,11103,aaa,0.0,1.0 +64,553,2018-12-19,1049468,265.4,1929575.7,11996,b,0.0,1.0 +74,366,2018-12-22,1049469,691.4,2088511.7,10587,C,0.0,1.0 +29,866,2018-11-18,1049470,518.4,20174337.7,10487,aaa,0.0,1.0 +35,608,2018-11-14,1049471,97.4,20662806.7,11331,b,0.0,1.0 +10,122,2018-12-3,1049472,317.4,1510426.7,10537,C,0.0,1.0 +41,71,2018-10-6,1049473,594.4,15039203.7,11600,C,0.0,1.0 +0,670,2018-12-5,1049474,302.4,16543567.7,10827,C,1.0,10.0 +61,828,2018-10-5,1049475,732.4,33239363.7,11160,b,0.0,1.0 +84,99,2018-12-28,1049476,236.4,36293614.7,10722,b,0.0,1.0 +53,834,2018-11-2,1049477,492.4,19458376.7,10444,b,0.0,1.0 +97,213,2018-11-6,1049478,619.4,10047739.7,10001,C,0.0,1.0 +87,582,2018-12-18,1049479,536.4,2498679.7,10247,aaa,0.0,1.0 +94,651,2018-11-23,1049480,889.4,32350240.7,11700,C,0.0,1.0 +42,511,2018-10-19,1049481,773.4,15983466.7,11138,b,0.0,1.0 +90,226,2018-11-22,1049482,883.4,18627824.7,10753,aaa,0.0,1.0 +50,826,2018-11-9,1049483,358.4,15077180.7,10565,b,0.0,1.0 +88,907,2018-10-19,1049484,981.4,39380395.7,11621,aaa,0.0,1.0 +100,456,2018-10-15,1049485,890.4,35427831.7,10527,dDd,0.0,1.0 +71,248,2018-10-27,1049486,126.4,23126790.7,11294,b,0.0,1.0 +99,504,2018-11-25,1049487,176.4,21857401.7,11276,C,1.0,10.0 +54,899,2018-12-1,1049488,645.4,32542900.7,10010,dDd,0.0,1.0 +96,40,2018-11-19,1049489,567.4,25396572.7,11859,C,0.0,1.0 +50,255,2018-10-11,1049490,653.4,12780974.7,10357,aaa,0.0,1.0 +32,259,2018-10-23,1049491,900.4,6830317.7,10587,dDd,0.0,1.0 +31,17,2018-12-25,1049492,805.4,13832927.7,11012,dDd,0.0,1.0 +51,825,2018-11-29,1049493,230.4,37520032.7,11070,aaa,0.0,1.0 +6,495,2018-11-10,1049494,541.4,26678573.7,11640,aaa,0.0,1.0 +81,651,2018-10-23,1049495,300.4,26470328.7,11070,b,0.0,1.0 +4,843,2018-12-17,1049496,834.4,11395154.7,11499,dDd,0.0,1.0 +46,113,2018-11-26,1049497,470.4,9527269.7,11590,b,0.0,1.0 +0,769,2018-12-27,1049498,415.4,31241419.7,10682,aaa,0.0,1.0 +60,17,2018-12-22,1049499,131.4,5933267.7,10919,aaa,0.0,1.0 +61,537,2018-12-5,1049500,868.4,33351755.7,11937,b,0.0,1.0 +9,16,2018-11-26,1049501,462.4,14462691.7,10390,aaa,0.0,1.0 +38,919,2018-10-16,1049502,988.4,19264188.7,11377,aaa,0.0,1.0 +53,630,2018-11-17,1049503,974.4,26744420.7,11110,b,0.0,1.0 +63,25,2018-12-9,1049504,268.4,36783590.7,11586,dDd,0.0,1.0 +16,811,2018-12-22,1049505,472.4,39084976.7,11699,C,0.0,1.0 +43,464,2018-10-27,1049506,747.4,19793308.7,11049,b,0.0,1.0 +37,412,2018-11-27,1049507,42.4,1358285.7,10462,aaa,0.0,1.0 +95,559,2018-11-20,1049508,727.4,20365379.7,11373,b,0.0,1.0 +29,236,2018-11-13,1049509,664.4,26605061.7,11170,b,0.0,1.0 +41,255,2018-11-2,1049510,253.4,28466751.7,11235,C,0.0,1.0 +20,635,2018-12-8,1049511,404.4,17016091.7,10069,b,0.0,1.0 +86,223,2018-10-21,1049512,688.4,34237770.7,10533,b,0.0,1.0 +39,522,2018-10-12,1049513,417.4,15643014.7,10569,b,0.0,1.0 +94,449,2018-11-21,1049514,433.4,6168090.7,11029,aaa,0.0,1.0 +79,638,2018-11-8,1049515,870.4,12464362.7,11903,b,0.0,1.0 +86,162,2018-11-4,1049516,234.4,25425977.7,10968,C,0.0,1.0 +22,324,2018-12-15,1049517,270.4,23999471.7,11926,C,0.0,1.0 +85,557,2018-12-18,1049518,733.4,15451423.7,10691,aaa,0.0,1.0 +89,843,2018-10-3,1049519,114.4,12184849.7,11343,C,0.0,1.0 +78,719,2018-10-5,1049520,238.4,506401.7,11253,aaa,0.0,1.0 +90,375,2018-11-14,1049521,4.4,5266344.7,10727,aaa,0.0,1.0 +77,255,2018-12-26,1049522,666.4,15800484.7,10201,b,0.0,1.0 +97,973,2018-12-24,1049523,724.4,30507970.7,10698,aaa,0.0,1.0 +65,893,2018-11-7,1049524,659.4,30215369.7,10682,C,0.0,1.0 +3,371,2018-11-15,1049525,607.4,3139760.7,10084,C,0.0,1.0 +86,524,2018-10-12,1049526,774.4,15891699.7,10806,dDd,0.0,1.0 +14,0,2018-10-28,1049527,260.4,16023321.7,10953,C,0.0,1.0 +23,554,2018-11-20,1049528,733.4,33462835.7,10493,aaa,0.0,1.0 +40,359,2018-10-28,1049529,469.4,2437866.7,11001,dDd,0.0,1.0 +26,782,2018-12-18,1049530,20.4,7936545.7,11619,b,0.0,1.0 +96,967,2018-10-28,1049531,207.4,37802309.7,11073,dDd,0.0,1.0 +4,13,2018-12-7,1049532,887.4,27264494.7,10737,C,0.0,1.0 +77,855,2018-11-25,1049533,229.4,25635084.7,10797,dDd,0.0,1.0 +0,160,2018-11-11,1049534,162.4,29388904.7,11082,dDd,0.0,1.0 +66,320,2018-10-2,1049535,37.4,35592587.7,10087,C,0.0,1.0 +10,509,2018-11-23,1049536,220.4,22169042.7,11672,b,0.0,1.0 +57,968,2018-10-27,1049537,497.4,29900043.7,10895,C,0.0,1.0 +47,377,2018-11-30,1049538,95.4,17035699.7,11311,C,0.0,1.0 +57,74,2018-10-29,1049539,973.4,31494828.7,10572,dDd,0.0,1.0 +58,559,2018-11-5,1049540,635.4,7420786.7,10017,b,0.0,1.0 +28,34,2018-12-11,1049541,334.4,13379455.7,11015,aaa,0.0,1.0 +38,743,2018-10-20,1049542,391.4,23837989.7,10131,b,0.0,1.0 +83,532,2018-12-18,1049543,832.4,15830137.7,11532,aaa,0.0,1.0 +2,814,2018-10-22,1049544,467.4,26559223.7,10484,C,0.0,1.0 +14,432,2018-12-9,1049545,318.4,37408336.7,11568,b,0.0,1.0 +2,500,2018-10-17,1049546,100.4,8430870.7,11698,aaa,0.0,1.0 +35,362,2018-11-6,1049547,450.4,24589518.7,10519,dDd,0.0,1.0 +15,427,2018-10-17,1049548,517.4,4999325.7,11914,aaa,0.0,1.0 +24,156,2018-12-19,1049549,456.4,39681730.7,10450,dDd,0.0,1.0 +56,434,2018-10-5,1049550,541.4,37773712.7,11090,b,0.0,1.0 +67,712,2018-10-1,1049551,354.4,17495832.7,11596,C,0.0,1.0 +21,536,2018-12-1,1049552,563.4,37445113.7,10293,b,0.0,1.0 +91,936,2018-11-28,1049553,632.4,10719934.7,10689,C,0.0,1.0 +55,689,2018-10-10,1049554,514.4,18151461.7,10965,dDd,0.0,1.0 +36,337,2018-10-25,1049555,881.4,36739079.7,10175,dDd,0.0,1.0 +99,332,2018-10-12,1049556,300.4,29258614.7,11338,b,0.0,1.0 +87,463,2018-10-16,1049557,24.4,18942510.7,10513,dDd,0.0,1.0 +52,88,2018-11-7,1049558,628.4,971485.7,10862,dDd,0.0,1.0 +58,162,2018-12-11,1049559,262.4,6407442.7,11569,C,0.0,1.0 +27,598,2018-11-28,1049560,643.4,29104760.7,11936,aaa,0.0,1.0 +21,112,2018-10-3,1049561,76.4,32042059.7,11926,C,0.0,1.0 +43,859,2018-11-24,1049562,738.4,5694327.7,11718,aaa,0.0,1.0 +96,975,2018-12-5,1049563,424.4,25840502.7,11461,C,0.0,1.0 +62,684,2018-12-5,1049564,679.4,31541667.7,10040,C,1.0,10.0 +65,730,2018-10-19,1049565,694.4,9127884.7,10146,C,0.0,1.0 +7,367,2018-12-20,1049566,861.4,37266786.7,10173,b,0.0,1.0 +80,853,2018-11-15,1049567,425.4,12547948.7,11871,dDd,0.0,1.0 +73,319,2018-11-19,1049568,177.4,29644133.7,11820,C,0.0,1.0 +7,132,2018-10-17,1049569,395.4,37072122.7,11115,aaa,0.0,1.0 +64,145,2018-12-8,1049570,466.4,26805861.7,10503,C,0.0,1.0 +86,943,2018-10-19,1049571,578.4,599195.7,11385,dDd,0.0,1.0 +56,245,2018-10-30,1049572,110.4,7061397.7,11043,C,0.0,1.0 +50,900,2018-11-8,1049573,56.4,26249111.7,11980,dDd,0.0,1.0 +56,819,2018-12-23,1049574,109.4,30989840.7,10145,dDd,0.0,1.0 +55,786,2018-10-4,1049575,579.4,28692037.7,11790,C,0.0,1.0 +85,19,2018-10-19,1049576,522.4,7374515.7,11794,b,0.0,1.0 +28,941,2018-11-27,1049577,846.4,26778909.7,11802,C,0.0,1.0 +45,674,2018-10-26,1049578,875.4,14939610.7,11915,aaa,0.0,1.0 +100,425,2018-11-24,1049579,988.4,36351644.7,11944,C,0.0,1.0 +35,411,2018-12-5,1049580,41.4,27837948.7,11583,b,0.0,1.0 +74,795,2018-10-4,1049581,116.4,12779913.7,10238,C,0.0,1.0 +85,705,2018-12-4,1049582,210.4,12428721.7,10518,C,0.0,1.0 +76,430,2018-12-8,1049583,810.4,35819436.7,11815,b,0.0,1.0 +26,700,2018-10-24,1049584,942.4,20950356.7,10132,b,0.0,1.0 +14,712,2018-11-21,1049585,497.4,13672264.7,10991,b,0.0,1.0 +83,635,2018-10-18,1049586,260.4,10104005.7,11073,C,1.0,10.0 +91,325,2018-11-20,1049587,359.4,4037476.7,11398,C,0.0,1.0 +36,531,2018-12-27,1049588,219.4,27039922.7,10637,aaa,0.0,1.0 +82,263,2018-10-17,1049589,909.4,26087186.7,11663,C,0.0,1.0 +85,545,2018-12-10,1049590,162.4,1375397.7,11090,aaa,0.0,1.0 +48,116,2018-10-7,1049591,505.4,31234848.7,11399,dDd,0.0,1.0 +99,56,2018-12-12,1049592,101.4,11812821.7,10217,b,0.0,1.0 +59,96,2018-11-17,1049593,978.4,14740509.7,10929,dDd,0.0,1.0 +19,574,2018-11-2,1049594,687.4,29212360.7,11613,b,0.0,1.0 +75,80,2018-12-6,1049595,938.4,33129952.7,10648,b,0.0,1.0 +22,607,2018-11-18,1049596,508.4,36055006.7,11185,C,1.0,10.0 +25,37,2018-11-14,1049597,387.4,18986592.7,10883,C,0.0,1.0 +64,598,2018-10-7,1049598,316.4,4121792.7,10350,C,1.0,10.0 +64,560,2018-12-21,1049599,797.4,14348711.7,11077,dDd,0.0,1.0 +45,444,2018-10-1,1049600,804.4,27080873.7,10099,C,0.0,1.0 +61,9,2018-11-12,1049601,385.4,24576148.7,10404,b,0.0,1.0 +22,914,2018-10-10,1049602,657.4,31263293.7,11379,dDd,0.0,1.0 +33,561,2018-11-15,1049603,910.4,37233038.7,11115,dDd,0.0,1.0 +25,986,2018-11-10,1049604,923.4,36135003.7,11375,b,0.0,1.0 +50,769,2018-11-4,1049605,990.4,9494034.7,10167,b,0.0,1.0 +67,554,2018-12-17,1049606,927.4,28523734.7,11694,b,0.0,1.0 +64,704,2018-12-20,1049607,629.4,24745778.7,10735,dDd,0.0,1.0 +10,113,2018-12-20,1049608,425.4,26401363.7,11352,C,0.0,1.0 +62,716,2018-11-23,1049609,576.4,3283958.7,11545,aaa,0.0,1.0 +42,969,2018-10-10,1049610,902.4,30534179.7,10590,b,0.0,1.0 +41,354,2018-11-23,1049611,220.4,35013301.7,10288,aaa,0.0,1.0 +49,928,2018-10-25,1049612,371.4,2759386.7,11062,aaa,0.0,1.0 +53,476,2018-11-15,1049613,544.4,23726385.7,10822,b,0.0,1.0 +23,375,2018-10-30,1049614,509.4,25415534.7,11213,aaa,0.0,1.0 +56,520,2018-12-29,1049615,185.4,24945970.7,10221,b,0.0,1.0 +96,983,2018-11-6,1049616,420.4,845683.7,10980,C,0.0,1.0 +85,14,2018-11-13,1049617,278.4,6397136.7,11194,b,0.0,1.0 +84,259,2018-12-29,1049618,389.4,36714381.7,11499,dDd,0.0,1.0 +48,728,2018-12-9,1049619,299.4,13907476.7,10925,b,0.0,1.0 +54,85,2018-12-7,1049620,95.4,33614476.7,10910,dDd,0.0,1.0 +84,366,2018-10-20,1049621,326.4,38777188.7,10508,aaa,0.0,1.0 +80,889,2018-12-23,1049622,768.4,33975392.7,11101,b,0.0,1.0 +64,734,2018-11-25,1049623,171.4,21955001.7,10569,aaa,0.0,1.0 +44,690,2018-11-7,1049624,403.4,19079824.7,11885,aaa,0.0,1.0 +93,869,2018-10-28,1049625,201.4,11904345.7,10975,aaa,0.0,1.0 +7,888,2018-10-25,1049626,443.4,14073884.7,11716,aaa,0.0,1.0 +84,944,2018-12-14,1049627,457.4,5684496.7,11597,aaa,0.0,1.0 +77,913,2018-12-21,1049628,701.4,29643687.7,11970,dDd,0.0,1.0 +54,892,2018-11-19,1049629,882.4,5505089.7,10969,b,0.0,1.0 +95,473,2018-12-28,1049630,811.4,16460707.7,10951,b,0.0,1.0 +75,833,2018-11-7,1049631,192.4,17636562.7,11575,b,0.0,1.0 +20,209,2018-11-30,1049632,395.4,37296971.7,10780,C,0.0,1.0 +30,517,2018-11-2,1049633,143.4,35049531.7,10386,aaa,0.0,1.0 +57,516,2018-10-10,1049634,903.4,28042668.7,10800,b,0.0,1.0 +12,401,2018-11-27,1049635,151.4,11724322.7,11453,C,1.0,10.0 +3,688,2018-11-21,1049636,422.4,26006899.7,11891,C,1.0,10.0 +57,74,2018-11-18,1049637,511.4,36545314.7,11201,dDd,0.0,1.0 +6,878,2018-12-16,1049638,739.4,35663177.7,10869,aaa,0.0,1.0 +28,179,2018-11-24,1049639,416.4,21462072.7,11346,dDd,0.0,1.0 +89,643,2018-10-9,1049640,502.4,37094367.7,11641,dDd,0.0,1.0 +68,746,2018-11-12,1049641,367.4,20828977.7,11898,C,0.0,1.0 +83,842,2018-10-27,1049642,226.4,36999604.7,11583,C,0.0,1.0 +19,556,2018-12-27,1049643,102.4,30512916.7,11211,dDd,0.0,1.0 +87,9,2018-10-27,1049644,642.4,4720144.7,10369,b,0.0,1.0 +62,116,2018-11-29,1049645,90.4,29831265.7,10700,b,0.0,1.0 +4,168,2018-12-6,1049646,559.4,6261914.7,11750,C,0.0,1.0 +71,2,2018-11-13,1049647,526.4,30863515.7,10897,C,0.0,1.0 +88,926,2018-12-28,1049648,815.4,17353708.7,11403,b,0.0,1.0 +3,46,2018-10-2,1049649,829.4,299797.7,11696,aaa,0.0,1.0 +88,722,2018-12-19,1049650,878.4,16682757.7,10490,aaa,0.0,1.0 +94,894,2018-12-30,1049651,200.4,30204803.7,11182,dDd,0.0,1.0 +3,582,2018-11-25,1049652,48.4,8694012.7,11140,C,1.0,10.0 +97,603,2018-12-4,1049653,612.4,2044256.7,11386,C,1.0,10.0 +97,889,2018-12-8,1049654,198.4,34710801.7,11018,dDd,0.0,1.0 +73,310,2018-12-29,1049655,79.4,23483770.7,11383,dDd,0.0,1.0 +99,782,2018-11-20,1049656,222.4,6575175.7,11215,b,0.0,1.0 +1,98,2018-12-25,1049657,449.4,31928623.7,11206,b,0.0,1.0 +5,692,2018-12-3,1049658,767.4,1265000.7,10910,aaa,0.0,1.0 +44,501,2018-12-28,1049659,677.4,33962220.7,10026,dDd,0.0,1.0 +88,236,2018-10-14,1049660,278.4,19955045.7,11647,aaa,0.0,1.0 +32,507,2018-10-27,1049661,169.4,37561857.7,11131,C,1.0,10.0 +23,74,2018-10-8,1049662,866.4,9868752.7,10126,aaa,0.0,1.0 +26,303,2018-11-8,1049663,623.4,24342629.7,10522,aaa,0.0,1.0 +10,406,2018-12-20,1049664,845.4,34252486.7,10958,b,0.0,1.0 +34,157,2018-10-12,1049665,25.4,10618198.7,10793,C,0.0,1.0 +40,724,2018-12-12,1049666,179.4,39668470.7,11690,aaa,0.0,1.0 +21,603,2018-10-17,1049667,464.4,35038544.7,10709,dDd,0.0,1.0 +65,611,2018-11-13,1049668,726.4,7915660.7,10512,C,0.0,1.0 +66,574,2018-10-24,1049669,871.4,4761966.7,11071,aaa,0.0,1.0 +42,14,2018-11-9,1049670,712.4,1210364.7,11942,C,0.0,1.0 +0,436,2018-11-1,1049671,267.4,12509164.7,10897,C,1.0,10.0 +27,572,2018-12-10,1049672,227.4,39585155.7,11737,b,0.0,1.0 +24,195,2018-11-23,1049673,788.4,39058581.7,10835,C,0.0,1.0 +2,833,2018-12-25,1049674,209.4,14846642.7,11081,aaa,0.0,1.0 +75,635,2018-12-16,1049675,740.4,32442488.7,11327,aaa,0.0,1.0 +67,762,2018-12-21,1049676,956.4,28250631.7,11548,C,0.0,1.0 +9,907,2018-10-22,1049677,236.4,235469.7,11117,C,0.0,1.0 +43,617,2018-11-20,1049678,508.4,12662350.7,11842,C,1.0,10.0 +64,267,2018-11-28,1049679,708.4,8395033.7,10331,dDd,0.0,1.0 +49,380,2018-11-14,1049680,422.4,16453200.7,10676,C,0.0,1.0 +71,740,2018-10-22,1049681,773.4,16391788.7,10967,C,0.0,1.0 +19,556,2018-11-23,1049682,374.4,26851619.7,10927,b,0.0,1.0 +21,436,2018-10-19,1049683,404.4,21754058.7,10710,aaa,0.0,1.0 +71,18,2018-10-3,1049684,560.4,31338947.7,10915,b,0.0,1.0 +26,990,2018-12-30,1049685,374.4,38890594.7,11978,dDd,0.0,1.0 +86,651,2018-10-22,1049686,14.4,8546118.7,10972,dDd,0.0,1.0 +93,270,2018-10-24,1049687,558.4,36775546.7,10923,C,0.0,1.0 +77,33,2018-12-6,1049688,280.4,10691314.7,10716,dDd,0.0,1.0 +61,275,2018-10-13,1049689,10.4,14188820.7,11010,dDd,0.0,1.0 +8,335,2018-12-28,1049690,429.4,11580333.7,10356,C,0.0,1.0 +24,412,2018-10-29,1049691,822.4,22949069.7,10061,aaa,0.0,1.0 +16,462,2018-12-7,1049692,655.4,319376.7,10058,dDd,0.0,1.0 +57,137,2018-10-8,1049693,603.4,21213757.7,10553,b,0.0,1.0 +92,112,2018-12-23,1049694,692.4,36535443.7,10339,b,0.0,1.0 +25,711,2018-10-28,1049695,267.4,38790980.7,11837,dDd,0.0,1.0 +21,160,2018-11-28,1049696,762.4,12698235.7,10442,dDd,0.0,1.0 +27,315,2018-11-1,1049697,377.4,8287556.7,11544,dDd,0.0,1.0 +33,311,2018-11-7,1049698,293.4,25056056.7,11526,dDd,0.0,1.0 +78,566,2018-11-30,1049699,135.4,32273158.7,11722,aaa,0.0,1.0 +42,808,2018-11-3,1049700,22.4,22842214.7,10064,b,0.0,1.0 +6,771,2018-10-24,1049701,823.4,14900821.7,10301,b,0.0,1.0 +13,140,2018-12-11,1049702,873.4,25130170.7,10903,dDd,0.0,1.0 +77,330,2018-12-20,1049703,999.4,27412209.7,10653,aaa,0.0,1.0 +85,566,2018-11-5,1049704,33.4,13338176.7,11110,aaa,0.0,1.0 +90,330,2018-12-10,1049705,87.4,15276449.7,11761,aaa,0.0,1.0 +90,972,2018-10-1,1049706,929.4,5413107.7,11505,b,0.0,1.0 +99,990,2018-11-15,1049707,278.4,20643864.7,10609,b,0.0,1.0 +7,872,2018-11-5,1049708,883.4,485320.7,10244,b,0.0,1.0 +20,79,2018-12-11,1049709,748.4,6829642.7,10167,dDd,0.0,1.0 +1,531,2018-11-26,1049710,762.4,15050865.7,11160,dDd,0.0,1.0 +92,324,2018-10-27,1049711,95.4,4055632.7,10232,b,0.0,1.0 +11,302,2018-10-16,1049712,254.4,20423099.7,11388,aaa,0.0,1.0 +7,299,2018-10-13,1049713,778.4,18975982.7,11908,aaa,0.0,1.0 +86,75,2018-10-17,1049714,898.4,39764088.7,10415,dDd,0.0,1.0 +36,606,2018-11-15,1049715,205.4,39293799.7,10471,C,1.0,10.0 +19,86,2018-10-26,1049716,222.4,39066597.7,11910,b,0.0,1.0 +44,482,2018-10-27,1049717,730.4,17717496.7,11497,dDd,0.0,1.0 +34,980,2018-11-30,1049718,722.4,37922202.7,10626,aaa,0.0,1.0 +94,38,2018-12-20,1049719,278.4,36396997.7,11718,aaa,0.0,1.0 +3,717,2018-10-24,1049720,27.4,5076374.7,10130,dDd,0.0,1.0 +27,524,2018-10-5,1049721,454.4,32626467.7,10524,b,0.0,1.0 +41,170,2018-12-15,1049722,17.4,1021409.7,11619,C,0.0,1.0 +50,997,2018-10-11,1049723,469.4,18180702.7,10240,b,0.0,1.0 +19,597,2018-12-21,1049724,334.4,8088207.7,11586,aaa,0.0,1.0 +50,698,2018-10-7,1049725,823.4,6586905.7,10021,dDd,0.0,1.0 +12,180,2018-11-16,1049726,519.4,26622483.7,10690,aaa,0.0,1.0 +40,807,2018-12-22,1049727,854.4,31130704.7,10531,aaa,0.0,1.0 +67,883,2018-11-13,1049728,859.4,6689719.7,11353,C,0.0,1.0 +34,697,2018-11-26,1049729,560.4,13239267.7,10098,aaa,0.0,1.0 +43,828,2018-10-12,1049730,122.4,37434413.7,11053,b,0.0,1.0 +69,827,2018-11-25,1049731,188.4,15954819.7,10664,b,0.0,1.0 +70,202,2018-10-7,1049732,897.4,39168156.7,11695,dDd,0.0,1.0 +42,345,2018-11-6,1049733,687.4,37172397.7,11850,aaa,0.0,1.0 +52,340,2018-11-19,1049734,607.4,12452469.7,10400,aaa,0.0,1.0 +79,154,2018-11-1,1049735,902.4,30571073.7,10465,aaa,0.0,1.0 +79,986,2018-11-21,1049736,433.4,23237013.7,11223,C,0.0,1.0 +100,205,2018-11-22,1049737,663.4,18137333.7,11608,dDd,0.0,1.0 +83,743,2018-11-19,1049738,473.4,38373326.7,11178,C,0.0,1.0 +21,924,2018-11-11,1049739,828.4,20999639.7,10329,aaa,0.0,1.0 +39,351,2018-12-23,1049740,722.4,27348575.7,11973,aaa,0.0,1.0 +23,469,2018-12-6,1049741,584.4,36098347.7,11565,C,1.0,10.0 +17,806,2018-11-14,1049742,144.4,39470364.7,11295,dDd,0.0,1.0 +59,553,2018-12-20,1049743,125.4,14942710.7,10749,C,1.0,10.0 +46,514,2018-10-17,1049744,854.4,1437819.7,11805,b,0.0,1.0 +74,186,2018-10-25,1049745,550.4,33319018.7,11637,aaa,0.0,1.0 +55,512,2018-10-7,1049746,824.4,39320021.7,10001,dDd,0.0,1.0 +45,694,2018-12-22,1049747,393.4,13460948.7,10383,dDd,0.0,1.0 +18,248,2018-12-23,1049748,504.4,23629364.7,11813,C,0.0,1.0 +80,639,2018-11-25,1049749,346.4,31830108.7,10252,dDd,0.0,1.0 +98,905,2018-10-10,1049750,129.4,7085030.7,11476,C,0.0,1.0 +68,67,2018-10-11,1049751,641.4,20329898.7,11627,b,0.0,1.0 +40,971,2018-12-20,1049752,511.4,37255249.7,11723,aaa,0.0,1.0 +80,717,2018-12-1,1049753,692.4,2065939.7,10429,dDd,0.0,1.0 +32,37,2018-11-2,1049754,191.4,32184525.7,11252,b,0.0,1.0 +51,259,2018-12-8,1049755,567.4,5928686.7,10250,dDd,0.0,1.0 +14,254,2018-10-28,1049756,38.4,15403241.7,10706,b,0.0,1.0 +49,7,2018-11-2,1049757,752.4,24710634.7,11417,aaa,0.0,1.0 +39,392,2018-10-12,1049758,64.4,34967252.7,11335,aaa,0.0,1.0 +100,466,2018-10-23,1049759,953.4,24848538.7,11386,aaa,0.0,1.0 +73,433,2018-10-21,1049760,929.4,4764149.7,11170,aaa,0.0,1.0 +9,393,2018-11-12,1049761,656.4,38569613.7,10332,dDd,0.0,1.0 +46,363,2018-10-24,1049762,90.4,33965748.7,10023,dDd,0.0,1.0 +69,439,2018-12-28,1049763,984.4,9852930.7,10377,C,0.0,1.0 +54,390,2018-10-29,1049764,952.4,13031463.7,10182,aaa,0.0,1.0 +46,300,2018-10-1,1049765,259.4,26505540.7,10530,aaa,0.0,1.0 +11,101,2018-11-2,1049766,133.4,6016198.7,10071,b,0.0,1.0 +39,477,2018-11-19,1049767,948.4,19515888.7,10907,C,0.0,1.0 +85,776,2018-11-6,1049768,69.4,26961242.7,10260,dDd,0.0,1.0 +68,926,2018-10-5,1049769,792.4,23638589.7,10129,dDd,0.0,1.0 +70,1,2018-12-7,1049770,870.4,28429581.7,11219,dDd,0.0,1.0 +22,464,2018-12-17,1049771,38.4,31189827.7,10387,b,0.0,1.0 +19,948,2018-12-22,1049772,972.4,9858477.7,10300,C,0.0,1.0 +1,487,2018-11-13,1049773,185.4,25188993.7,10025,C,1.0,10.0 +92,47,2018-10-29,1049774,790.4,35565244.7,11953,aaa,0.0,1.0 +40,403,2018-10-20,1049775,901.4,25294272.7,11145,aaa,0.0,1.0 +71,710,2018-12-16,1049776,520.4,13493521.7,10570,aaa,0.0,1.0 +2,764,2018-10-13,1049777,628.4,36373613.7,10535,aaa,0.0,1.0 +45,957,2018-12-13,1049778,297.4,33646111.7,11478,aaa,0.0,1.0 +5,876,2018-10-2,1049779,820.4,31364483.7,10763,aaa,0.0,1.0 +71,634,2018-12-22,1049780,675.4,22519001.7,11517,dDd,0.0,1.0 +85,868,2018-10-28,1049781,351.4,3228285.7,11618,b,0.0,1.0 +10,712,2018-11-4,1049782,851.4,36031178.7,11851,dDd,0.0,1.0 +55,765,2018-12-29,1049783,461.4,16590798.7,10517,C,0.0,1.0 +34,837,2018-12-29,1049784,22.4,11315908.7,10801,C,0.0,1.0 +15,547,2018-10-19,1049785,962.4,1777890.7,10558,C,0.0,1.0 +34,370,2018-11-26,1049786,525.4,691876.7,10146,C,0.0,1.0 +11,517,2018-11-17,1049787,275.4,1601811.7,11607,C,1.0,10.0 +40,388,2018-11-15,1049788,632.4,6987671.7,10512,C,0.0,1.0 +76,518,2018-10-14,1049789,298.4,1886372.7,11327,C,1.0,10.0 +53,267,2018-10-21,1049790,432.4,8351594.7,11274,b,0.0,1.0 +74,322,2018-12-4,1049791,294.4,32866557.7,10347,dDd,0.0,1.0 +89,145,2018-11-30,1049792,795.4,30815308.7,10017,aaa,0.0,1.0 +89,282,2018-12-12,1049793,296.4,33327072.7,11073,aaa,0.0,1.0 +94,111,2018-11-12,1049794,406.4,8200874.7,11328,b,0.0,1.0 +45,973,2018-10-28,1049795,938.4,4373504.7,10921,dDd,0.0,1.0 +40,370,2018-11-17,1049796,186.4,31190901.7,10018,b,0.0,1.0 +12,963,2018-12-4,1049797,391.4,32614914.7,10312,aaa,0.0,1.0 +2,356,2018-10-26,1049798,536.4,34946832.7,11591,aaa,0.0,1.0 +73,26,2018-11-22,1049799,120.4,24211015.7,11864,C,0.0,1.0 +69,329,2018-12-26,1049800,707.4,10827844.7,10774,aaa,0.0,1.0 +88,168,2018-10-28,1049801,740.4,20308442.7,10267,b,0.0,1.0 +52,412,2018-12-13,1049802,161.4,7679505.7,11993,C,1.0,10.0 +27,378,2018-11-26,1049803,274.4,14635592.7,11045,C,0.0,1.0 +66,513,2018-11-10,1049804,45.4,33848364.7,10433,aaa,0.0,1.0 +86,46,2018-10-3,1049805,601.4,37147806.7,11546,aaa,0.0,1.0 +73,93,2018-10-2,1049806,458.4,3232966.7,11178,b,0.0,1.0 +31,1,2018-12-11,1049807,840.4,34640553.7,10811,aaa,0.0,1.0 +92,25,2018-11-15,1049808,281.4,18054196.7,10437,C,0.0,1.0 +36,687,2018-12-10,1049809,405.4,37648967.7,10151,C,1.0,10.0 +18,201,2018-11-7,1049810,345.4,35205745.7,11874,C,0.0,1.0 +70,869,2018-11-9,1049811,958.4,36749445.7,11328,aaa,0.0,1.0 +93,328,2018-10-20,1049812,92.4,31913310.7,11988,aaa,0.0,1.0 +40,860,2018-10-13,1049813,58.4,17236021.7,10611,aaa,0.0,1.0 +25,486,2018-12-8,1049814,711.4,11060297.7,11890,b,0.0,1.0 +4,122,2018-10-30,1049815,101.4,12309948.7,10473,dDd,0.0,1.0 +74,951,2018-11-18,1049816,694.4,13080141.7,11056,dDd,0.0,1.0 +35,192,2018-11-24,1049817,542.4,27092275.7,11047,C,0.0,1.0 +32,813,2018-10-24,1049818,98.4,23284294.7,11053,dDd,0.0,1.0 +10,439,2018-12-11,1049819,698.4,35131275.7,11417,aaa,0.0,1.0 +46,942,2018-11-11,1049820,682.4,17169217.7,11462,C,0.0,1.0 +28,510,2018-12-17,1049821,913.4,7773846.7,11374,b,0.0,1.0 +18,9,2018-10-13,1049822,749.4,3221448.7,10969,C,0.0,1.0 +14,370,2018-11-15,1049823,632.4,33027359.7,11040,C,0.0,1.0 +1,146,2018-10-11,1049824,825.4,18266569.7,11348,dDd,0.0,1.0 +37,570,2018-10-22,1049825,350.4,26198681.7,10306,b,0.0,1.0 +1,693,2018-11-21,1049826,416.4,21474656.7,10724,dDd,0.0,1.0 +26,612,2018-10-28,1049827,653.4,6633836.7,11286,aaa,0.0,1.0 +64,76,2018-11-15,1049828,930.4,28304092.7,11043,C,0.0,1.0 +0,334,2018-12-18,1049829,635.4,33185217.7,10839,dDd,0.0,1.0 +73,880,2018-10-10,1049830,557.4,32708628.7,11518,dDd,0.0,1.0 +26,784,2018-10-10,1049831,37.4,1604211.7,10581,dDd,0.0,1.0 +47,460,2018-12-11,1049832,531.4,21688779.7,11279,dDd,0.0,1.0 +21,158,2018-12-6,1049833,864.4,27389165.7,10910,C,0.0,1.0 +8,418,2018-11-12,1049834,844.4,39506657.7,10387,b,0.0,1.0 +85,94,2018-12-8,1049835,490.4,10371939.7,10112,aaa,0.0,1.0 +100,998,2018-10-16,1049836,82.4,38817885.7,10587,aaa,0.0,1.0 +84,652,2018-12-8,1049837,310.4,35449720.7,11583,C,1.0,10.0 +63,490,2018-10-9,1049838,298.4,7459300.7,11528,aaa,0.0,1.0 +61,197,2018-11-17,1049839,602.4,28288048.7,11411,C,0.0,1.0 +72,584,2018-11-28,1049840,286.4,38526274.7,10056,C,1.0,10.0 +4,64,2018-11-27,1049841,486.4,20371487.7,10993,C,0.0,1.0 +82,636,2018-11-18,1049842,42.4,8262923.7,11382,aaa,0.0,1.0 +94,780,2018-12-3,1049843,734.4,22414368.7,10909,aaa,0.0,1.0 +100,391,2018-12-2,1049844,171.4,13329799.7,10217,C,0.0,1.0 +27,678,2018-11-7,1049845,234.4,6742778.7,11691,b,0.0,1.0 +38,858,2018-12-2,1049846,857.4,8130573.7,10951,b,0.0,1.0 +18,710,2018-10-13,1049847,748.4,14666580.7,10021,dDd,0.0,1.0 +78,666,2018-12-4,1049848,25.4,12639838.7,11980,aaa,0.0,1.0 +3,995,2018-11-30,1049849,205.4,6788832.7,10495,b,0.0,1.0 +13,703,2018-12-17,1049850,763.4,15166712.7,11989,b,0.0,1.0 +36,240,2018-11-28,1049851,872.4,24234390.7,11536,C,0.0,1.0 +14,769,2018-11-30,1049852,386.4,23029611.7,11523,dDd,0.0,1.0 +78,375,2018-12-15,1049853,838.4,6127787.7,10775,dDd,0.0,1.0 +74,517,2018-11-4,1049854,549.4,37305421.7,11889,b,0.0,1.0 +9,562,2018-10-6,1049855,741.4,24516025.7,10177,b,0.0,1.0 +80,913,2018-12-24,1049856,691.4,19680284.7,10650,dDd,0.0,1.0 +81,983,2018-12-10,1049857,721.4,2128860.7,11592,aaa,0.0,1.0 +92,187,2018-10-6,1049858,238.4,15355527.7,10874,b,0.0,1.0 +39,528,2018-11-1,1049859,521.4,19614508.7,11862,dDd,0.0,1.0 +4,248,2018-10-27,1049860,712.4,2948571.7,10185,b,0.0,1.0 +52,814,2018-12-17,1049861,533.4,10370209.7,10628,aaa,0.0,1.0 +69,71,2018-11-29,1049862,827.4,1967276.7,11687,C,0.0,1.0 +80,839,2018-11-29,1049863,895.4,19543265.7,10240,b,0.0,1.0 +13,751,2018-12-11,1049864,226.4,30711711.7,11698,C,0.0,1.0 +12,719,2018-12-22,1049865,132.4,17693003.7,11851,aaa,0.0,1.0 +31,381,2018-12-29,1049866,320.4,26797551.7,10469,dDd,0.0,1.0 +73,840,2018-10-4,1049867,656.4,29796637.7,10551,aaa,0.0,1.0 +27,277,2018-11-12,1049868,311.4,21257189.7,11800,dDd,0.0,1.0 +58,815,2018-11-18,1049869,16.4,30803479.7,10377,dDd,0.0,1.0 +91,143,2018-11-26,1049870,703.4,31406570.7,11850,C,0.0,1.0 +49,661,2018-10-8,1049871,591.4,33010542.7,10540,aaa,0.0,1.0 +14,361,2018-10-2,1049872,73.4,28461783.7,11872,b,0.0,1.0 +29,204,2018-11-26,1049873,457.4,28098559.7,10133,b,0.0,1.0 +9,630,2018-11-1,1049874,429.4,6462374.7,10844,b,0.0,1.0 +45,398,2018-11-6,1049875,809.4,30342380.7,10062,C,0.0,1.0 +86,615,2018-11-24,1049876,173.4,31671458.7,10306,C,1.0,10.0 +66,255,2018-12-18,1049877,128.4,38939877.7,10097,b,0.0,1.0 +3,221,2018-11-8,1049878,316.4,21291487.7,11579,aaa,0.0,1.0 +29,88,2018-11-1,1049879,438.4,10490925.7,11576,dDd,0.0,1.0 +70,663,2018-10-12,1049880,909.4,33995754.7,11091,C,0.0,1.0 +33,768,2018-12-13,1049881,179.4,10985173.7,11987,dDd,0.0,1.0 +50,311,2018-12-3,1049882,271.4,32421950.7,10134,dDd,0.0,1.0 +74,824,2018-10-26,1049883,206.4,9480962.7,11111,C,0.0,1.0 +98,708,2018-11-12,1049884,161.4,35661061.7,10413,dDd,0.0,1.0 +62,127,2018-12-12,1049885,337.4,25711928.7,10323,C,0.0,1.0 +43,536,2018-11-10,1049886,254.4,5257207.7,10330,aaa,0.0,1.0 +0,857,2018-10-30,1049887,873.4,18826077.7,11146,b,0.0,1.0 +43,942,2018-11-12,1049888,580.4,34823143.7,11875,aaa,0.0,1.0 +35,48,2018-10-23,1049889,593.4,5734100.7,10859,b,0.0,1.0 +98,997,2018-11-12,1049890,709.4,2322233.7,11118,dDd,0.0,1.0 +33,798,2018-10-29,1049891,198.4,27067323.7,11083,dDd,0.0,1.0 +86,654,2018-10-21,1049892,748.4,29489548.7,10972,dDd,0.0,1.0 +69,493,2018-12-19,1049893,456.4,29521195.7,11443,dDd,0.0,1.0 +80,117,2018-11-11,1049894,507.4,5317629.7,10924,b,0.0,1.0 +12,642,2018-12-7,1049895,18.4,7908923.7,11035,dDd,0.0,1.0 +81,210,2018-11-1,1049896,246.4,17015865.7,10017,aaa,0.0,1.0 +50,152,2018-10-20,1049897,887.4,35156849.7,10176,aaa,0.0,1.0 +51,34,2018-10-2,1049898,301.4,2341632.7,11202,dDd,0.0,1.0 +79,355,2018-11-13,1049899,666.4,12479913.7,11696,dDd,0.0,1.0 +66,886,2018-12-12,1049900,94.4,26957298.7,10042,dDd,0.0,1.0 +23,179,2018-11-9,1049901,816.4,39461570.7,10335,dDd,0.0,1.0 +19,239,2018-11-17,1049902,257.4,3168625.7,10353,C,0.0,1.0 +13,122,2018-12-19,1049903,354.4,26222450.7,10147,b,0.0,1.0 +34,917,2018-12-11,1049904,723.4,9419580.7,11838,b,0.0,1.0 +45,557,2018-11-4,1049905,923.4,39663552.7,11267,b,0.0,1.0 +21,702,2018-10-18,1049906,651.4,38949276.7,10564,aaa,0.0,1.0 +96,503,2018-11-2,1049907,129.4,3446627.7,10371,aaa,0.0,1.0 +99,929,2018-11-14,1049908,703.4,28339635.7,11689,aaa,0.0,1.0 +57,34,2018-11-23,1049909,934.4,35614330.7,10109,aaa,0.0,1.0 +87,852,2018-11-2,1049910,316.4,22974034.7,11243,b,0.0,1.0 +83,170,2018-11-16,1049911,70.4,16942877.7,11128,C,0.0,1.0 +7,491,2018-12-10,1049912,264.4,27489350.7,11357,dDd,0.0,1.0 +100,92,2018-10-12,1049913,939.4,14858263.7,10648,C,0.0,1.0 +23,907,2018-10-20,1049914,763.4,2186573.7,10771,b,0.0,1.0 +62,474,2018-12-18,1049915,912.4,37763744.7,11153,aaa,0.0,1.0 +90,473,2018-10-6,1049916,16.4,21002603.7,11750,b,0.0,1.0 +96,582,2018-11-19,1049917,143.4,14865801.7,10067,dDd,0.0,1.0 +34,520,2018-10-12,1049918,87.4,18027844.7,10547,C,1.0,10.0 +21,641,2018-11-14,1049919,698.4,2027518.7,11282,b,0.0,1.0 +33,615,2018-12-30,1049920,354.4,15049499.7,10367,dDd,0.0,1.0 +9,494,2018-11-6,1049921,582.4,34932543.7,10185,aaa,0.0,1.0 +11,898,2018-10-9,1049922,950.4,10750329.7,11883,b,0.0,1.0 +19,74,2018-10-4,1049923,973.4,19654119.7,11162,aaa,0.0,1.0 +50,999,2018-10-22,1049924,267.4,38897187.7,10929,aaa,0.0,1.0 +40,567,2018-11-18,1049925,78.4,25973217.7,10610,C,1.0,10.0 +80,385,2018-12-18,1049926,119.4,9922474.7,11733,b,0.0,1.0 +16,485,2018-10-15,1049927,765.4,25854515.7,10110,dDd,0.0,1.0 +32,735,2018-11-2,1049928,897.4,12113517.7,11022,dDd,0.0,1.0 +96,146,2018-10-7,1049929,511.4,9173018.7,10095,aaa,0.0,1.0 +45,140,2018-10-29,1049930,596.4,27586529.7,11235,b,0.0,1.0 +28,777,2018-10-29,1049931,212.4,17260845.7,10879,dDd,0.0,1.0 +15,699,2018-11-22,1049932,553.4,27308084.7,11714,aaa,0.0,1.0 +10,348,2018-12-9,1049933,622.4,22745320.7,10102,C,0.0,1.0 +53,65,2018-11-27,1049934,504.4,11399239.7,10019,dDd,0.0,1.0 +8,437,2018-11-29,1049935,474.4,37233935.7,10285,C,1.0,10.0 +54,705,2018-12-11,1049936,226.4,6331758.7,10857,aaa,0.0,1.0 +92,999,2018-12-7,1049937,365.4,32144246.7,10785,b,0.0,1.0 +59,468,2018-11-16,1049938,470.4,37056211.7,11237,C,1.0,10.0 +3,436,2018-11-15,1049939,170.4,18257815.7,11216,C,1.0,10.0 +52,160,2018-12-24,1049940,471.4,31498441.7,10550,dDd,0.0,1.0 +12,643,2018-10-17,1049941,679.4,21858927.7,11262,C,1.0,10.0 +8,66,2018-11-13,1049942,797.4,7757464.7,10028,b,0.0,1.0 +79,146,2018-12-24,1049943,684.4,21052481.7,10053,b,0.0,1.0 +10,848,2018-10-26,1049944,464.4,26449872.7,11994,b,0.0,1.0 +89,946,2018-10-8,1049945,426.4,5384283.7,11797,dDd,0.0,1.0 +8,487,2018-12-10,1049946,386.4,4485378.7,11809,b,0.0,1.0 +41,676,2018-10-17,1049947,818.4,4511628.7,10908,b,0.0,1.0 +79,923,2018-10-24,1049948,685.4,26053284.7,11680,C,0.0,1.0 +25,937,2018-12-26,1049949,167.4,30144346.7,11544,dDd,0.0,1.0 +94,275,2018-11-14,1049950,588.4,33183432.7,10521,aaa,0.0,1.0 +15,902,2018-11-30,1049951,726.4,24027515.7,10029,C,0.0,1.0 +27,786,2018-12-17,1049952,266.4,33644391.7,11835,aaa,0.0,1.0 +50,241,2018-11-2,1049953,744.4,18473514.7,11900,C,0.0,1.0 +45,243,2018-12-20,1049954,367.4,9426050.7,11261,b,0.0,1.0 +17,969,2018-10-21,1049955,333.4,31721222.7,10802,dDd,0.0,1.0 +60,441,2018-10-7,1049956,239.4,19940361.7,11246,aaa,0.0,1.0 +92,929,2018-12-10,1049957,105.4,7633714.7,10010,b,0.0,1.0 +75,287,2018-11-16,1049958,154.4,37197926.7,10973,aaa,0.0,1.0 +28,64,2018-10-8,1049959,276.4,30681125.7,11710,aaa,0.0,1.0 +87,424,2018-12-7,1049960,387.4,13636919.7,10421,b,0.0,1.0 +34,706,2018-10-18,1049961,407.4,16752267.7,10628,aaa,0.0,1.0 +34,138,2018-12-12,1049962,303.4,26785575.7,10033,dDd,0.0,1.0 +73,390,2018-12-19,1049963,759.4,35804356.7,11553,C,0.0,1.0 +81,301,2018-12-20,1049964,475.4,17992492.7,10386,dDd,0.0,1.0 +47,475,2018-11-13,1049965,509.4,32738223.7,11615,aaa,0.0,1.0 +35,374,2018-12-15,1049966,772.4,37608793.7,10685,aaa,0.0,1.0 +94,432,2018-12-18,1049967,245.4,10902153.7,10953,b,0.0,1.0 +30,490,2018-12-20,1049968,820.4,28768015.7,10659,aaa,0.0,1.0 +75,179,2018-10-23,1049969,786.4,32880228.7,10925,b,0.0,1.0 +11,95,2018-10-30,1049970,104.4,18661024.7,10493,b,0.0,1.0 +12,135,2018-11-2,1049971,249.4,5877149.7,10604,dDd,0.0,1.0 +12,520,2018-10-28,1049972,302.4,24648459.7,10880,C,1.0,10.0 +36,375,2018-11-18,1049973,387.4,21618787.7,10230,C,0.0,1.0 +60,312,2018-10-24,1049974,164.4,17482396.7,11588,C,0.0,1.0 +91,682,2018-11-29,1049975,408.4,26458193.7,11048,aaa,0.0,1.0 +45,914,2018-10-6,1049976,739.4,39562790.7,11103,dDd,0.0,1.0 +10,744,2018-11-1,1049977,965.4,11342856.7,11815,aaa,0.0,1.0 +18,565,2018-10-3,1049978,650.4,32226926.7,11929,aaa,0.0,1.0 +85,337,2018-11-2,1049979,475.4,581517.7,11990,dDd,0.0,1.0 +3,895,2018-12-16,1049980,156.4,5035395.7,10918,aaa,0.0,1.0 +40,153,2018-11-1,1049981,948.4,38389740.7,11644,dDd,0.0,1.0 +12,409,2018-10-14,1049982,236.4,35471562.7,10483,dDd,0.0,1.0 +76,796,2018-12-2,1049983,301.4,5066702.7,10574,dDd,0.0,1.0 +86,706,2018-10-4,1049984,665.4,6170065.7,10293,b,0.0,1.0 +63,919,2018-12-26,1049985,891.4,724333.7,10051,dDd,0.0,1.0 +19,663,2018-10-28,1049986,775.4,12063732.7,11996,dDd,0.0,1.0 +96,541,2018-10-26,1049987,78.4,35719826.7,11675,C,1.0,10.0 +59,503,2018-10-9,1049988,111.4,2853594.7,11103,b,0.0,1.0 +23,299,2018-10-4,1049989,25.4,17413830.7,11792,dDd,0.0,1.0 +11,611,2018-11-25,1049990,383.4,5327693.7,11810,b,0.0,1.0 +70,226,2018-11-7,1049991,577.4,23854000.7,10903,aaa,0.0,1.0 +31,137,2018-10-13,1049992,816.4,30840207.7,11949,aaa,0.0,1.0 +77,492,2018-11-25,1049993,375.4,11017846.7,11617,aaa,0.0,1.0 +74,672,2018-12-16,1049994,997.4,29622187.7,11782,aaa,0.0,1.0 +92,469,2018-11-26,1049995,25.4,12345168.7,10268,dDd,0.0,1.0 +15,728,2018-10-21,1049996,474.4,25623075.7,11489,aaa,0.0,1.0 +6,831,2018-10-3,1049997,320.4,34930523.7,10284,dDd,0.0,1.0 +666,831,2018-12-22,1049998,582.4,16144459.7,11133,b,0.0,1.0 +666,527,2018-10-14,1049999,727.4,31138011.7,10805,aaa,0.0,1.0 diff --git a/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_weight.csv b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_weight.csv new file mode 100644 index 00000000..c86e1ddc --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_weight.csv @@ -0,0 +1,713 @@ +card,amount,event_timestamp,uuid,num1_float,num2_double,num3_int,cat1_string,is_fraud_label_indexed,sample_weight_double +17,567,2018-10-6,1049288,160.4,6025580.7,11819,C,1.0,0.0669 +56,38,2018-10-6,1049289,83.4,5283538.7,10565,aaa,0.0,0.6599 +7,503,2018-11-5,1049290,757.4,28760094.7,11177,b,0.0,1.3813 +15,749,2018-11-22,1049291,319.4,3522113.7,11822,b,0.0,0.8450 +87,524,2018-12-3,1049292,815.4,32883183.7,11003,aaa,0.0,0.4125 +48,968,2018-10-7,1049293,34.4,3723194.7,11699,b,0.0,0.5003 +91,552,2018-11-19,1049294,474.4,12149864.7,11836,aaa,0.0,1.2731 +44,902,2018-11-1,1049295,111.4,27091506.7,11830,b,0.0,1.7272 +51,26,2018-12-27,1049296,521.4,17449759.7,11991,b,0.0,0.6033 +35,24,2018-10-18,1049297,404.4,37359857.7,11554,C,0.0,0.0498 +21,582,2018-11-15,1049298,645.4,8400166.7,11341,C,1.0,0.7300 +20,128,2018-11-13,1049299,953.4,28996407.7,10890,aaa,0.0,1.5308 +54,847,2018-12-18,1049300,18.4,19075072.7,11065,C,0.0,0.6357 +54,636,2018-11-8,1049301,546.4,6903447.7,11121,dDd,0.0,0.2715 +85,231,2018-10-10,1049302,645.4,19859752.7,10973,aaa,0.0,0.2135 +6,691,2018-10-28,1049303,74.4,31026014.7,10388,b,0.0,1.5213 +29,311,2018-11-15,1049304,957.4,22808904.7,10299,b,0.0,0.1633 +78,805,2018-10-27,1049305,931.4,10358131.7,10907,C,0.0,1.1019 +84,882,2018-12-10,1049306,790.4,37998060.7,11038,b,0.0,1.1293 +57,579,2018-11-25,1049307,954.4,35367561.7,11540,C,0.0,1.4865 +79,544,2018-11-21,1049308,67.4,34387902.7,10280,dDd,0.0,1.9635 +92,649,2018-12-13,1049309,295.4,16600833.7,11241,b,0.0,0.4377 +46,152,2018-10-3,1049310,692.4,31376892.7,11776,b,0.0,0.9088 +37,832,2018-11-25,1049311,77.4,33046809.7,10262,b,0.0,1.0373 +79,90,2018-11-1,1049312,897.4,26019875.7,11006,b,0.0,1.1477 +36,419,2018-10-3,1049313,848.4,33393435.7,10937,b,0.0,1.1105 +99,194,2018-10-28,1049314,389.4,16413028.7,10230,aaa,0.0,1.4571 +18,977,2018-11-1,1049315,602.4,36307673.7,11421,dDd,0.0,1.2577 +59,643,2018-11-27,1049316,170.4,8919422.7,11490,dDd,0.0,1.5923 +39,320,2018-10-24,1049317,530.4,8713834.7,11933,aaa,0.0,1.1674 +29,950,2018-11-22,1049318,44.4,11624206.7,10918,dDd,0.0,0.5495 +50,359,2018-12-29,1049319,937.4,8182500.7,10396,C,0.0,1.6592 +69,961,2018-11-18,1049320,999.4,13074615.7,10372,aaa,0.0,1.8274 +17,173,2018-11-18,1049321,527.4,4531587.7,11237,aaa,0.0,1.9308 +90,480,2018-12-1,1049322,594.4,19013138.7,10573,dDd,0.0,0.5042 +41,528,2018-10-5,1049323,424.4,31516519.7,10731,b,0.0,0.2399 +49,641,2018-12-19,1049324,599.4,21868175.7,10771,b,0.0,0.4311 +46,672,2018-11-3,1049325,396.4,27860735.7,11473,b,0.0,1.7773 +16,552,2018-10-21,1049326,627.4,25320892.7,11056,C,1.0,1.9671 +95,613,2018-12-1,1049327,818.4,31341462.7,10873,dDd,0.0,1.0344 +75,910,2018-11-14,1049328,644.4,11239364.7,10776,dDd,0.0,1.8271 +51,179,2018-12-16,1049329,774.4,29858606.7,11328,dDd,0.0,0.6971 +30,477,2018-12-24,1049330,521.4,4150163.7,10661,C,1.0,0.5651 +58,266,2018-11-4,1049331,522.4,37458619.7,11806,dDd,0.0,0.4629 +49,319,2018-12-29,1049332,707.4,22404561.7,11808,dDd,0.0,0.9686 +74,924,2018-12-10,1049333,686.4,16087861.7,11949,aaa,0.0,0.7786 +49,673,2018-12-20,1049334,117.4,14259755.7,11403,C,1.0,1.9842 +27,642,2018-12-3,1049335,879.4,28985545.7,10193,C,0.0,1.1319 +31,702,2018-10-10,1049336,180.4,25185877.7,11748,b,0.0,1.8805 +36,101,2018-11-30,1049337,923.4,15362870.7,10519,dDd,0.0,1.1135 +26,296,2018-11-1,1049338,843.4,26609141.7,11301,b,0.0,0.6185 +3,412,2018-12-22,1049339,354.4,23396197.7,11876,b,0.0,1.8441 +26,265,2018-11-12,1049340,961.4,10331127.7,11151,dDd,0.0,1.5512 +80,987,2018-12-22,1049341,255.4,18799834.7,11832,dDd,0.0,1.5273 +85,50,2018-10-17,1049342,25.4,4539677.7,11563,aaa,0.0,0.8814 +63,553,2018-10-25,1049343,447.4,36735570.7,10287,b,0.0,0.6989 +61,778,2018-11-26,1049344,362.4,5427283.7,11992,aaa,0.0,0.6377 +85,544,2018-11-16,1049345,52.4,4001584.7,10558,aaa,0.0,0.3385 +9,138,2018-11-9,1049346,270.4,37231785.7,10929,C,0.0,1.9566 +10,616,2018-12-9,1049347,334.4,27942777.7,11806,aaa,0.0,0.2300 +42,858,2018-12-23,1049348,158.4,8404215.7,10777,dDd,0.0,1.5059 +69,6,2018-11-13,1049349,546.4,15308850.7,11832,dDd,0.0,0.5062 +71,456,2018-11-6,1049350,13.4,11477405.7,10776,dDd,0.0,1.8892 +69,424,2018-10-17,1049351,877.4,7552889.7,10988,b,0.0,1.3332 +91,412,2018-12-1,1049352,142.4,23523400.7,10300,C,1.0,0.4370 +41,7,2018-10-8,1049353,764.4,798581.7,11735,dDd,0.0,0.3933 +2,656,2018-12-30,1049354,142.4,7892579.7,10920,C,1.0,1.5731 +32,174,2018-10-15,1049355,424.4,30096218.7,11920,C,0.0,0.8680 +74,102,2018-12-17,1049356,628.4,9966560.7,11969,aaa,0.0,0.1706 +39,597,2018-11-28,1049357,174.4,18238744.7,11288,dDd,0.0,1.5403 +96,339,2018-12-10,1049358,810.4,332899.7,11519,aaa,0.0,1.9024 +85,350,2018-12-12,1049359,954.4,2988438.7,10731,b,0.0,1.9978 +93,170,2018-11-12,1049360,916.4,20065446.7,11591,C,0.0,0.2374 +39,447,2018-10-6,1049361,146.4,39232857.7,11760,dDd,0.0,0.4675 +89,704,2018-10-3,1049362,738.4,13707294.7,10924,C,0.0,0.4606 +26,559,2018-10-27,1049363,558.4,23584741.7,11565,dDd,0.0,1.2060 +45,459,2018-11-26,1049364,822.4,17639277.7,11100,aaa,0.0,1.2462 +6,266,2018-11-12,1049365,953.4,27744001.7,10920,b,0.0,0.4448 +95,612,2018-10-18,1049366,592.4,29096246.7,10451,b,0.0,0.3379 +18,547,2018-10-4,1049367,251.4,38682762.7,11877,aaa,0.0,1.1267 +7,812,2018-11-1,1049368,546.4,38793076.7,10342,b,0.0,1.5583 +30,337,2018-10-29,1049369,509.4,38968593.7,10310,dDd,0.0,0.9564 +82,645,2018-12-14,1049370,752.4,35080814.7,10726,dDd,0.0,0.9708 +5,771,2018-10-7,1049371,451.4,1491396.7,11898,b,0.0,1.1095 +30,470,2018-10-2,1049372,867.4,7016700.7,10355,C,0.0,0.4836 +97,752,2018-12-12,1049373,652.4,12584033.7,11393,b,0.0,1.8521 +35,457,2018-12-4,1049374,4.4,10623678.7,11012,C,1.0,1.8084 +48,999,2018-12-12,1049375,181.4,26896719.7,11864,b,0.0,1.1213 +63,971,2018-11-16,1049376,300.4,29618446.7,10605,aaa,0.0,0.1906 +40,659,2018-11-13,1049377,935.4,35644646.7,10331,aaa,0.0,1.7650 +70,524,2018-10-26,1049378,893.4,4015615.7,10365,aaa,0.0,1.3513 +80,586,2018-10-10,1049379,834.4,11959317.7,10399,aaa,0.0,1.6965 +32,323,2018-12-15,1049380,307.4,28778499.7,10012,aaa,0.0,0.2712 +37,99,2018-11-6,1049381,223.4,15410836.7,11786,b,0.0,1.2405 +98,751,2018-11-17,1049382,533.4,35268985.7,10634,dDd,0.0,1.0297 +89,176,2018-10-25,1049383,323.4,33315743.7,10637,dDd,0.0,0.7082 +17,226,2018-12-7,1049384,119.4,26961321.7,10831,C,0.0,1.6338 +49,629,2018-12-26,1049385,557.4,2256305.7,10302,b,0.0,0.6029 +8,95,2018-10-8,1049386,864.4,23430968.7,11426,aaa,0.0,1.5762 +99,397,2018-11-3,1049387,93.4,20621185.7,10267,C,0.0,1.8044 +10,309,2018-11-29,1049388,701.4,16742514.7,11911,b,0.0,0.1431 +3,866,2018-10-4,1049389,56.4,22865562.7,11820,dDd,0.0,1.4786 +65,419,2018-12-10,1049390,656.4,3643620.7,11842,aaa,0.0,1.8022 +94,28,2018-10-30,1049391,387.4,37732277.7,11360,b,0.0,0.3805 +25,214,2018-12-29,1049392,228.4,8527569.7,11042,dDd,0.0,1.9461 +100,753,2018-12-19,1049393,80.4,26252736.7,11731,aaa,0.0,0.2628 +25,462,2018-11-27,1049394,712.4,30032785.7,11701,aaa,0.0,1.5865 +43,703,2018-10-11,1049395,615.4,32048887.7,11958,C,0.0,1.1923 +62,419,2018-12-17,1049396,424.4,7517607.7,10732,aaa,0.0,0.7076 +49,96,2018-11-18,1049397,188.4,4148488.7,10887,dDd,0.0,1.9244 +0,472,2018-11-23,1049398,839.4,891910.7,10073,dDd,0.0,0.3190 +16,364,2018-12-27,1049399,404.4,35638674.7,11463,b,0.0,0.2659 +27,489,2018-10-29,1049400,496.4,34884999.7,11699,b,0.0,0.8808 +61,676,2018-10-19,1049401,972.4,35040651.7,11796,dDd,0.0,1.2898 +25,169,2018-12-3,1049402,573.4,16312929.7,10295,aaa,0.0,1.3755 +94,818,2018-10-2,1049403,114.4,15176170.7,11895,dDd,0.0,1.3644 +57,674,2018-12-14,1049404,23.4,25085712.7,10857,dDd,0.0,1.1419 +37,239,2018-10-21,1049405,692.4,22977705.7,10273,C,0.0,1.1839 +29,962,2018-12-9,1049406,653.4,26601831.7,11616,b,0.0,0.4857 +43,200,2018-10-24,1049407,973.4,25474351.7,11384,b,0.0,1.3325 +0,491,2018-12-10,1049408,174.4,13135459.7,10549,b,0.0,0.9489 +5,132,2018-10-17,1049409,666.4,30477808.7,10253,b,0.0,1.8370 +43,809,2018-10-10,1049410,775.4,11598450.7,11232,b,0.0,1.0289 +99,669,2018-11-10,1049411,21.4,8480195.7,11104,dDd,0.0,1.2201 +1,781,2018-10-11,1049412,485.4,4735963.7,11505,C,0.0,1.0775 +8,178,2018-11-7,1049413,979.4,34664212.7,11941,C,0.0,0.0587 +32,115,2018-12-4,1049414,486.4,19001289.7,10731,C,0.0,1.9283 +16,423,2018-12-21,1049415,274.4,16735797.7,11887,dDd,0.0,0.7113 +93,735,2018-10-28,1049416,878.4,15996480.7,10525,C,0.0,0.6615 +96,95,2018-10-4,1049417,31.4,6696057.7,11861,dDd,0.0,1.5045 +59,31,2018-10-27,1049418,723.4,844560.7,10124,aaa,0.0,0.5157 +90,330,2018-10-19,1049419,164.4,31217361.7,10675,C,0.0,0.8047 +15,168,2018-12-10,1049420,205.4,17969936.7,11753,aaa,0.0,0.9831 +30,742,2018-10-13,1049421,542.4,12175267.7,10551,dDd,0.0,0.3179 +97,867,2018-10-5,1049422,182.4,18356710.7,10680,C,0.0,1.1852 +68,159,2018-11-3,1049423,275.4,31053000.7,11540,dDd,0.0,0.9292 +36,711,2018-10-5,1049424,262.4,31535243.7,10447,b,0.0,0.5807 +42,481,2018-12-4,1049425,745.4,39197227.7,10699,b,0.0,0.7717 +11,661,2018-12-22,1049426,526.4,37307237.7,11889,C,1.0,0.1215 +72,380,2018-10-7,1049427,906.4,20607507.7,10642,b,0.0,1.2883 +53,103,2018-12-16,1049428,218.4,7616086.7,10258,b,0.0,0.6961 +36,402,2018-12-22,1049429,770.4,23259431.7,11350,b,0.0,0.4405 +23,990,2018-11-14,1049430,871.4,25274658.7,10442,b,0.0,1.5543 +44,301,2018-12-5,1049431,27.4,4670603.7,11472,b,0.0,1.5769 +0,513,2018-10-19,1049432,373.4,36532176.7,10186,C,1.0,1.7303 +13,415,2018-11-7,1049433,629.4,28633245.7,11822,dDd,0.0,0.9297 +5,317,2018-10-25,1049434,649.4,13168783.7,10529,dDd,0.0,0.9412 +55,251,2018-11-27,1049435,993.4,22013773.7,10673,C,0.0,0.8722 +47,51,2018-12-18,1049436,618.4,3456270.7,11615,dDd,0.0,0.1136 +90,877,2018-11-1,1049437,901.4,12666128.7,10633,b,0.0,1.4269 +44,626,2018-12-17,1049438,56.4,9089618.7,11024,aaa,0.0,0.2046 +41,112,2018-11-2,1049439,238.4,29917321.7,11834,dDd,0.0,1.0625 +72,478,2018-10-8,1049440,909.4,14433213.7,10557,dDd,0.0,1.2639 +38,306,2018-12-4,1049441,324.4,6569835.7,10620,dDd,0.0,1.2336 +51,324,2018-11-9,1049442,665.4,31890909.7,11062,aaa,0.0,0.2826 +98,60,2018-10-26,1049443,116.4,23384717.7,11083,dDd,0.0,0.3414 +54,641,2018-10-9,1049444,624.4,16638992.7,11697,aaa,0.0,1.2922 +76,640,2018-12-13,1049445,689.4,24430247.7,11096,aaa,0.0,0.2108 +56,814,2018-11-27,1049446,14.4,37625839.7,11302,aaa,0.0,1.0527 +86,533,2018-11-1,1049447,163.4,245131.7,10473,aaa,0.0,1.9538 +89,686,2018-11-4,1049448,457.4,15016709.7,11890,b,0.0,1.7153 +48,443,2018-10-28,1049449,351.4,7795400.7,11179,dDd,0.0,1.5684 +47,618,2018-12-16,1049450,572.4,12519492.7,10666,b,0.0,0.7584 +20,403,2018-10-18,1049451,357.4,5029242.7,11981,dDd,0.0,0.6984 +62,238,2018-10-20,1049452,235.4,24811206.7,10705,C,0.0,1.8863 +45,569,2018-12-27,1049453,953.4,17939174.7,10286,b,0.0,1.9436 +5,406,2018-11-19,1049454,468.4,2646862.7,10437,aaa,0.0,1.6276 +98,218,2018-12-13,1049455,992.4,19349809.7,10036,C,0.0,0.4671 +86,974,2018-10-29,1049456,64.4,36516019.7,10536,C,0.0,0.7153 +12,627,2018-11-26,1049457,466.4,3112591.7,11093,aaa,0.0,1.7491 +90,600,2018-12-17,1049458,231.4,7624169.7,11984,dDd,0.0,1.7554 +59,237,2018-12-12,1049459,600.4,38441315.7,11117,dDd,0.0,1.4114 +77,780,2018-12-9,1049460,368.4,24752703.7,11455,aaa,0.0,0.1896 +30,39,2018-11-9,1049461,320.4,12058750.7,11233,aaa,0.0,1.3097 +78,203,2018-10-27,1049462,593.4,24970811.7,10249,dDd,0.0,0.9883 +13,688,2018-10-1,1049463,615.4,29657479.7,11569,dDd,0.0,1.9199 +91,78,2018-12-5,1049464,563.4,7204973.7,10594,aaa,0.0,0.2394 +31,218,2018-10-17,1049465,558.4,4362915.7,11650,C,0.0,1.9295 +5,899,2018-10-27,1049466,845.4,17971788.7,10178,C,0.0,0.7920 +53,891,2018-11-12,1049467,274.4,26592075.7,11103,aaa,0.0,0.3530 +64,553,2018-12-19,1049468,265.4,1929575.7,11996,b,0.0,1.3564 +74,366,2018-12-22,1049469,691.4,2088511.7,10587,C,0.0,0.9967 +29,866,2018-11-18,1049470,518.4,20174337.7,10487,aaa,0.0,1.4155 +35,608,2018-11-14,1049471,97.4,20662806.7,11331,b,0.0,0.6204 +10,122,2018-12-3,1049472,317.4,1510426.7,10537,C,0.0,0.2302 +41,71,2018-10-6,1049473,594.4,15039203.7,11600,C,0.0,1.6981 +0,670,2018-12-5,1049474,302.4,16543567.7,10827,C,1.0,0.9618 +61,828,2018-10-5,1049475,732.4,33239363.7,11160,b,0.0,1.5225 +84,99,2018-12-28,1049476,236.4,36293614.7,10722,b,0.0,1.9089 +53,834,2018-11-2,1049477,492.4,19458376.7,10444,b,0.0,0.0145 +97,213,2018-11-6,1049478,619.4,10047739.7,10001,C,0.0,1.4762 +87,582,2018-12-18,1049479,536.4,2498679.7,10247,aaa,0.0,1.6242 +94,651,2018-11-23,1049480,889.4,32350240.7,11700,C,0.0,1.5829 +42,511,2018-10-19,1049481,773.4,15983466.7,11138,b,0.0,0.2347 +90,226,2018-11-22,1049482,883.4,18627824.7,10753,aaa,0.0,0.3226 +50,826,2018-11-9,1049483,358.4,15077180.7,10565,b,0.0,1.4692 +88,907,2018-10-19,1049484,981.4,39380395.7,11621,aaa,0.0,0.1783 +100,456,2018-10-15,1049485,890.4,35427831.7,10527,dDd,0.0,1.9501 +71,248,2018-10-27,1049486,126.4,23126790.7,11294,b,0.0,1.9363 +99,504,2018-11-25,1049487,176.4,21857401.7,11276,C,1.0,0.8936 +54,899,2018-12-1,1049488,645.4,32542900.7,10010,dDd,0.0,1.6992 +96,40,2018-11-19,1049489,567.4,25396572.7,11859,C,0.0,1.6917 +50,255,2018-10-11,1049490,653.4,12780974.7,10357,aaa,0.0,0.3050 +32,259,2018-10-23,1049491,900.4,6830317.7,10587,dDd,0.0,1.8888 +31,17,2018-12-25,1049492,805.4,13832927.7,11012,dDd,0.0,1.0014 +51,825,2018-11-29,1049493,230.4,37520032.7,11070,aaa,0.0,1.2933 +6,495,2018-11-10,1049494,541.4,26678573.7,11640,aaa,0.0,1.8086 +81,651,2018-10-23,1049495,300.4,26470328.7,11070,b,0.0,1.2408 +4,843,2018-12-17,1049496,834.4,11395154.7,11499,dDd,0.0,1.2228 +46,113,2018-11-26,1049497,470.4,9527269.7,11590,b,0.0,0.6007 +0,769,2018-12-27,1049498,415.4,31241419.7,10682,aaa,0.0,1.5939 +60,17,2018-12-22,1049499,131.4,5933267.7,10919,aaa,0.0,0.5793 +61,537,2018-12-5,1049500,868.4,33351755.7,11937,b,0.0,1.5973 +9,16,2018-11-26,1049501,462.4,14462691.7,10390,aaa,0.0,1.0094 +38,919,2018-10-16,1049502,988.4,19264188.7,11377,aaa,0.0,1.1996 +53,630,2018-11-17,1049503,974.4,26744420.7,11110,b,0.0,1.8276 +63,25,2018-12-9,1049504,268.4,36783590.7,11586,dDd,0.0,0.7075 +16,811,2018-12-22,1049505,472.4,39084976.7,11699,C,0.0,0.1614 +43,464,2018-10-27,1049506,747.4,19793308.7,11049,b,0.0,1.3501 +37,412,2018-11-27,1049507,42.4,1358285.7,10462,aaa,0.0,0.6164 +95,559,2018-11-20,1049508,727.4,20365379.7,11373,b,0.0,0.1759 +29,236,2018-11-13,1049509,664.4,26605061.7,11170,b,0.0,0.8263 +41,255,2018-11-2,1049510,253.4,28466751.7,11235,C,0.0,0.2406 +20,635,2018-12-8,1049511,404.4,17016091.7,10069,b,0.0,1.7588 +86,223,2018-10-21,1049512,688.4,34237770.7,10533,b,0.0,1.0610 +39,522,2018-10-12,1049513,417.4,15643014.7,10569,b,0.0,0.5632 +94,449,2018-11-21,1049514,433.4,6168090.7,11029,aaa,0.0,1.2280 +79,638,2018-11-8,1049515,870.4,12464362.7,11903,b,0.0,1.2393 +86,162,2018-11-4,1049516,234.4,25425977.7,10968,C,0.0,0.5133 +22,324,2018-12-15,1049517,270.4,23999471.7,11926,C,0.0,1.1643 +85,557,2018-12-18,1049518,733.4,15451423.7,10691,aaa,0.0,0.1329 +89,843,2018-10-3,1049519,114.4,12184849.7,11343,C,0.0,0.2125 +78,719,2018-10-5,1049520,238.4,506401.7,11253,aaa,0.0,0.8560 +90,375,2018-11-14,1049521,4.4,5266344.7,10727,aaa,0.0,0.4379 +77,255,2018-12-26,1049522,666.4,15800484.7,10201,b,0.0,0.1012 +97,973,2018-12-24,1049523,724.4,30507970.7,10698,aaa,0.0,1.8574 +65,893,2018-11-7,1049524,659.4,30215369.7,10682,C,0.0,1.7312 +3,371,2018-11-15,1049525,607.4,3139760.7,10084,C,0.0,1.9099 +86,524,2018-10-12,1049526,774.4,15891699.7,10806,dDd,0.0,1.0983 +14,0,2018-10-28,1049527,260.4,16023321.7,10953,C,0.0,0.9540 +23,554,2018-11-20,1049528,733.4,33462835.7,10493,aaa,0.0,0.5105 +40,359,2018-10-28,1049529,469.4,2437866.7,11001,dDd,0.0,0.6921 +26,782,2018-12-18,1049530,20.4,7936545.7,11619,b,0.0,1.5333 +96,967,2018-10-28,1049531,207.4,37802309.7,11073,dDd,0.0,0.1079 +4,13,2018-12-7,1049532,887.4,27264494.7,10737,C,0.0,1.7015 +77,855,2018-11-25,1049533,229.4,25635084.7,10797,dDd,0.0,0.7329 +0,160,2018-11-11,1049534,162.4,29388904.7,11082,dDd,0.0,1.9355 +66,320,2018-10-2,1049535,37.4,35592587.7,10087,C,0.0,0.4090 +10,509,2018-11-23,1049536,220.4,22169042.7,11672,b,0.0,0.8944 +57,968,2018-10-27,1049537,497.4,29900043.7,10895,C,0.0,1.2855 +47,377,2018-11-30,1049538,95.4,17035699.7,11311,C,0.0,1.0253 +57,74,2018-10-29,1049539,973.4,31494828.7,10572,dDd,0.0,1.0703 +58,559,2018-11-5,1049540,635.4,7420786.7,10017,b,0.0,0.1118 +28,34,2018-12-11,1049541,334.4,13379455.7,11015,aaa,0.0,1.2659 +38,743,2018-10-20,1049542,391.4,23837989.7,10131,b,0.0,0.8291 +83,532,2018-12-18,1049543,832.4,15830137.7,11532,aaa,0.0,1.1728 +2,814,2018-10-22,1049544,467.4,26559223.7,10484,C,0.0,1.8291 +14,432,2018-12-9,1049545,318.4,37408336.7,11568,b,0.0,0.0571 +2,500,2018-10-17,1049546,100.4,8430870.7,11698,aaa,0.0,0.4121 +35,362,2018-11-6,1049547,450.4,24589518.7,10519,dDd,0.0,0.3424 +15,427,2018-10-17,1049548,517.4,4999325.7,11914,aaa,0.0,1.2214 +24,156,2018-12-19,1049549,456.4,39681730.7,10450,dDd,0.0,0.5450 +56,434,2018-10-5,1049550,541.4,37773712.7,11090,b,0.0,0.5548 +67,712,2018-10-1,1049551,354.4,17495832.7,11596,C,0.0,0.0775 +21,536,2018-12-1,1049552,563.4,37445113.7,10293,b,0.0,0.9829 +91,936,2018-11-28,1049553,632.4,10719934.7,10689,C,0.0,0.6561 +55,689,2018-10-10,1049554,514.4,18151461.7,10965,dDd,0.0,1.9349 +36,337,2018-10-25,1049555,881.4,36739079.7,10175,dDd,0.0,0.7141 +99,332,2018-10-12,1049556,300.4,29258614.7,11338,b,0.0,0.5659 +87,463,2018-10-16,1049557,24.4,18942510.7,10513,dDd,0.0,1.0332 +52,88,2018-11-7,1049558,628.4,971485.7,10862,dDd,0.0,1.6681 +58,162,2018-12-11,1049559,262.4,6407442.7,11569,C,0.0,1.0765 +27,598,2018-11-28,1049560,643.4,29104760.7,11936,aaa,0.0,1.7253 +21,112,2018-10-3,1049561,76.4,32042059.7,11926,C,0.0,1.2014 +43,859,2018-11-24,1049562,738.4,5694327.7,11718,aaa,0.0,1.1843 +96,975,2018-12-5,1049563,424.4,25840502.7,11461,C,0.0,1.4268 +62,684,2018-12-5,1049564,679.4,31541667.7,10040,C,1.0,1.9343 +65,730,2018-10-19,1049565,694.4,9127884.7,10146,C,0.0,1.1198 +7,367,2018-12-20,1049566,861.4,37266786.7,10173,b,0.0,1.8357 +80,853,2018-11-15,1049567,425.4,12547948.7,11871,dDd,0.0,0.8287 +73,319,2018-11-19,1049568,177.4,29644133.7,11820,C,0.0,0.4053 +7,132,2018-10-17,1049569,395.4,37072122.7,11115,aaa,0.0,0.8611 +64,145,2018-12-8,1049570,466.4,26805861.7,10503,C,0.0,1.8990 +86,943,2018-10-19,1049571,578.4,599195.7,11385,dDd,0.0,0.5172 +56,245,2018-10-30,1049572,110.4,7061397.7,11043,C,0.0,0.1270 +50,900,2018-11-8,1049573,56.4,26249111.7,11980,dDd,0.0,0.7280 +56,819,2018-12-23,1049574,109.4,30989840.7,10145,dDd,0.0,1.6900 +55,786,2018-10-4,1049575,579.4,28692037.7,11790,C,0.0,1.9561 +85,19,2018-10-19,1049576,522.4,7374515.7,11794,b,0.0,0.7851 +28,941,2018-11-27,1049577,846.4,26778909.7,11802,C,0.0,0.1021 +45,674,2018-10-26,1049578,875.4,14939610.7,11915,aaa,0.0,0.2985 +100,425,2018-11-24,1049579,988.4,36351644.7,11944,C,0.0,0.0066 +35,411,2018-12-5,1049580,41.4,27837948.7,11583,b,0.0,0.6471 +74,795,2018-10-4,1049581,116.4,12779913.7,10238,C,0.0,0.8533 +85,705,2018-12-4,1049582,210.4,12428721.7,10518,C,0.0,0.0841 +76,430,2018-12-8,1049583,810.4,35819436.7,11815,b,0.0,1.6300 +26,700,2018-10-24,1049584,942.4,20950356.7,10132,b,0.0,1.5093 +14,712,2018-11-21,1049585,497.4,13672264.7,10991,b,0.0,0.0190 +83,635,2018-10-18,1049586,260.4,10104005.7,11073,C,1.0,0.3441 +91,325,2018-11-20,1049587,359.4,4037476.7,11398,C,0.0,0.0753 +36,531,2018-12-27,1049588,219.4,27039922.7,10637,aaa,0.0,1.0521 +82,263,2018-10-17,1049589,909.4,26087186.7,11663,C,0.0,0.0122 +85,545,2018-12-10,1049590,162.4,1375397.7,11090,aaa,0.0,1.1517 +48,116,2018-10-7,1049591,505.4,31234848.7,11399,dDd,0.0,0.7774 +99,56,2018-12-12,1049592,101.4,11812821.7,10217,b,0.0,1.2136 +59,96,2018-11-17,1049593,978.4,14740509.7,10929,dDd,0.0,0.3361 +19,574,2018-11-2,1049594,687.4,29212360.7,11613,b,0.0,0.2042 +75,80,2018-12-6,1049595,938.4,33129952.7,10648,b,0.0,1.1480 +22,607,2018-11-18,1049596,508.4,36055006.7,11185,C,1.0,1.4559 +25,37,2018-11-14,1049597,387.4,18986592.7,10883,C,0.0,0.0399 +64,598,2018-10-7,1049598,316.4,4121792.7,10350,C,1.0,1.9767 +64,560,2018-12-21,1049599,797.4,14348711.7,11077,dDd,0.0,1.8612 +45,444,2018-10-1,1049600,804.4,27080873.7,10099,C,0.0,0.9010 +61,9,2018-11-12,1049601,385.4,24576148.7,10404,b,0.0,1.8757 +22,914,2018-10-10,1049602,657.4,31263293.7,11379,dDd,0.0,0.3784 +33,561,2018-11-15,1049603,910.4,37233038.7,11115,dDd,0.0,1.0280 +25,986,2018-11-10,1049604,923.4,36135003.7,11375,b,0.0,0.6037 +50,769,2018-11-4,1049605,990.4,9494034.7,10167,b,0.0,0.0684 +67,554,2018-12-17,1049606,927.4,28523734.7,11694,b,0.0,0.9841 +64,704,2018-12-20,1049607,629.4,24745778.7,10735,dDd,0.0,1.3888 +10,113,2018-12-20,1049608,425.4,26401363.7,11352,C,0.0,0.1705 +62,716,2018-11-23,1049609,576.4,3283958.7,11545,aaa,0.0,1.2825 +42,969,2018-10-10,1049610,902.4,30534179.7,10590,b,0.0,1.3954 +41,354,2018-11-23,1049611,220.4,35013301.7,10288,aaa,0.0,0.8176 +49,928,2018-10-25,1049612,371.4,2759386.7,11062,aaa,0.0,0.1358 +53,476,2018-11-15,1049613,544.4,23726385.7,10822,b,0.0,1.4795 +23,375,2018-10-30,1049614,509.4,25415534.7,11213,aaa,0.0,0.4476 +56,520,2018-12-29,1049615,185.4,24945970.7,10221,b,0.0,1.6451 +96,983,2018-11-6,1049616,420.4,845683.7,10980,C,0.0,1.4985 +85,14,2018-11-13,1049617,278.4,6397136.7,11194,b,0.0,0.7917 +84,259,2018-12-29,1049618,389.4,36714381.7,11499,dDd,0.0,1.7204 +48,728,2018-12-9,1049619,299.4,13907476.7,10925,b,0.0,0.5506 +54,85,2018-12-7,1049620,95.4,33614476.7,10910,dDd,0.0,0.8039 +84,366,2018-10-20,1049621,326.4,38777188.7,10508,aaa,0.0,0.8721 +80,889,2018-12-23,1049622,768.4,33975392.7,11101,b,0.0,1.3280 +64,734,2018-11-25,1049623,171.4,21955001.7,10569,aaa,0.0,0.0176 +44,690,2018-11-7,1049624,403.4,19079824.7,11885,aaa,0.0,1.2082 +93,869,2018-10-28,1049625,201.4,11904345.7,10975,aaa,0.0,1.5321 +7,888,2018-10-25,1049626,443.4,14073884.7,11716,aaa,0.0,1.1656 +84,944,2018-12-14,1049627,457.4,5684496.7,11597,aaa,0.0,0.6641 +77,913,2018-12-21,1049628,701.4,29643687.7,11970,dDd,0.0,1.5720 +54,892,2018-11-19,1049629,882.4,5505089.7,10969,b,0.0,1.1422 +95,473,2018-12-28,1049630,811.4,16460707.7,10951,b,0.0,0.5253 +75,833,2018-11-7,1049631,192.4,17636562.7,11575,b,0.0,0.4730 +20,209,2018-11-30,1049632,395.4,37296971.7,10780,C,0.0,1.0179 +30,517,2018-11-2,1049633,143.4,35049531.7,10386,aaa,0.0,0.9037 +57,516,2018-10-10,1049634,903.4,28042668.7,10800,b,0.0,1.5009 +12,401,2018-11-27,1049635,151.4,11724322.7,11453,C,1.0,1.6216 +3,688,2018-11-21,1049636,422.4,26006899.7,11891,C,1.0,0.9722 +57,74,2018-11-18,1049637,511.4,36545314.7,11201,dDd,0.0,0.4850 +6,878,2018-12-16,1049638,739.4,35663177.7,10869,aaa,0.0,1.0104 +28,179,2018-11-24,1049639,416.4,21462072.7,11346,dDd,0.0,1.1427 +89,643,2018-10-9,1049640,502.4,37094367.7,11641,dDd,0.0,1.7675 +68,746,2018-11-12,1049641,367.4,20828977.7,11898,C,0.0,0.4059 +83,842,2018-10-27,1049642,226.4,36999604.7,11583,C,0.0,1.9603 +19,556,2018-12-27,1049643,102.4,30512916.7,11211,dDd,0.0,1.9033 +87,9,2018-10-27,1049644,642.4,4720144.7,10369,b,0.0,1.8853 +62,116,2018-11-29,1049645,90.4,29831265.7,10700,b,0.0,0.4080 +4,168,2018-12-6,1049646,559.4,6261914.7,11750,C,0.0,1.5484 +71,2,2018-11-13,1049647,526.4,30863515.7,10897,C,0.0,1.3838 +88,926,2018-12-28,1049648,815.4,17353708.7,11403,b,0.0,1.1996 +3,46,2018-10-2,1049649,829.4,299797.7,11696,aaa,0.0,1.2688 +88,722,2018-12-19,1049650,878.4,16682757.7,10490,aaa,0.0,1.9344 +94,894,2018-12-30,1049651,200.4,30204803.7,11182,dDd,0.0,0.0036 +3,582,2018-11-25,1049652,48.4,8694012.7,11140,C,1.0,0.1409 +97,603,2018-12-4,1049653,612.4,2044256.7,11386,C,1.0,1.2623 +97,889,2018-12-8,1049654,198.4,34710801.7,11018,dDd,0.0,0.0211 +73,310,2018-12-29,1049655,79.4,23483770.7,11383,dDd,0.0,1.3491 +99,782,2018-11-20,1049656,222.4,6575175.7,11215,b,0.0,0.7945 +1,98,2018-12-25,1049657,449.4,31928623.7,11206,b,0.0,1.1867 +5,692,2018-12-3,1049658,767.4,1265000.7,10910,aaa,0.0,0.0132 +44,501,2018-12-28,1049659,677.4,33962220.7,10026,dDd,0.0,0.3665 +88,236,2018-10-14,1049660,278.4,19955045.7,11647,aaa,0.0,0.3289 +32,507,2018-10-27,1049661,169.4,37561857.7,11131,C,1.0,0.5385 +23,74,2018-10-8,1049662,866.4,9868752.7,10126,aaa,0.0,0.8395 +26,303,2018-11-8,1049663,623.4,24342629.7,10522,aaa,0.0,1.3468 +10,406,2018-12-20,1049664,845.4,34252486.7,10958,b,0.0,1.4423 +34,157,2018-10-12,1049665,25.4,10618198.7,10793,C,0.0,0.3404 +40,724,2018-12-12,1049666,179.4,39668470.7,11690,aaa,0.0,0.9684 +21,603,2018-10-17,1049667,464.4,35038544.7,10709,dDd,0.0,0.4144 +65,611,2018-11-13,1049668,726.4,7915660.7,10512,C,0.0,0.8254 +66,574,2018-10-24,1049669,871.4,4761966.7,11071,aaa,0.0,1.9789 +42,14,2018-11-9,1049670,712.4,1210364.7,11942,C,0.0,1.5571 +0,436,2018-11-1,1049671,267.4,12509164.7,10897,C,1.0,0.5929 +27,572,2018-12-10,1049672,227.4,39585155.7,11737,b,0.0,0.3847 +24,195,2018-11-23,1049673,788.4,39058581.7,10835,C,0.0,1.5175 +2,833,2018-12-25,1049674,209.4,14846642.7,11081,aaa,0.0,0.4962 +75,635,2018-12-16,1049675,740.4,32442488.7,11327,aaa,0.0,0.2700 +67,762,2018-12-21,1049676,956.4,28250631.7,11548,C,0.0,1.9254 +9,907,2018-10-22,1049677,236.4,235469.7,11117,C,0.0,0.0446 +43,617,2018-11-20,1049678,508.4,12662350.7,11842,C,1.0,1.6538 +64,267,2018-11-28,1049679,708.4,8395033.7,10331,dDd,0.0,1.1251 +49,380,2018-11-14,1049680,422.4,16453200.7,10676,C,0.0,1.3134 +71,740,2018-10-22,1049681,773.4,16391788.7,10967,C,0.0,1.5882 +19,556,2018-11-23,1049682,374.4,26851619.7,10927,b,0.0,1.1287 +21,436,2018-10-19,1049683,404.4,21754058.7,10710,aaa,0.0,1.4543 +71,18,2018-10-3,1049684,560.4,31338947.7,10915,b,0.0,0.8506 +26,990,2018-12-30,1049685,374.4,38890594.7,11978,dDd,0.0,1.1498 +86,651,2018-10-22,1049686,14.4,8546118.7,10972,dDd,0.0,0.8034 +93,270,2018-10-24,1049687,558.4,36775546.7,10923,C,0.0,1.6450 +77,33,2018-12-6,1049688,280.4,10691314.7,10716,dDd,0.0,0.3365 +61,275,2018-10-13,1049689,10.4,14188820.7,11010,dDd,0.0,0.8166 +8,335,2018-12-28,1049690,429.4,11580333.7,10356,C,0.0,0.0115 +24,412,2018-10-29,1049691,822.4,22949069.7,10061,aaa,0.0,0.6654 +16,462,2018-12-7,1049692,655.4,319376.7,10058,dDd,0.0,1.3551 +57,137,2018-10-8,1049693,603.4,21213757.7,10553,b,0.0,0.8510 +92,112,2018-12-23,1049694,692.4,36535443.7,10339,b,0.0,0.0122 +25,711,2018-10-28,1049695,267.4,38790980.7,11837,dDd,0.0,0.7974 +21,160,2018-11-28,1049696,762.4,12698235.7,10442,dDd,0.0,1.1914 +27,315,2018-11-1,1049697,377.4,8287556.7,11544,dDd,0.0,0.9806 +33,311,2018-11-7,1049698,293.4,25056056.7,11526,dDd,0.0,1.2118 +78,566,2018-11-30,1049699,135.4,32273158.7,11722,aaa,0.0,0.0168 +42,808,2018-11-3,1049700,22.4,22842214.7,10064,b,0.0,0.9595 +6,771,2018-10-24,1049701,823.4,14900821.7,10301,b,0.0,0.7690 +13,140,2018-12-11,1049702,873.4,25130170.7,10903,dDd,0.0,0.6098 +77,330,2018-12-20,1049703,999.4,27412209.7,10653,aaa,0.0,1.3442 +85,566,2018-11-5,1049704,33.4,13338176.7,11110,aaa,0.0,0.2865 +90,330,2018-12-10,1049705,87.4,15276449.7,11761,aaa,0.0,1.1060 +90,972,2018-10-1,1049706,929.4,5413107.7,11505,b,0.0,1.6142 +99,990,2018-11-15,1049707,278.4,20643864.7,10609,b,0.0,0.2119 +7,872,2018-11-5,1049708,883.4,485320.7,10244,b,0.0,1.1506 +20,79,2018-12-11,1049709,748.4,6829642.7,10167,dDd,0.0,1.2681 +1,531,2018-11-26,1049710,762.4,15050865.7,11160,dDd,0.0,1.3370 +92,324,2018-10-27,1049711,95.4,4055632.7,10232,b,0.0,0.4640 +11,302,2018-10-16,1049712,254.4,20423099.7,11388,aaa,0.0,0.8563 +7,299,2018-10-13,1049713,778.4,18975982.7,11908,aaa,0.0,0.4657 +86,75,2018-10-17,1049714,898.4,39764088.7,10415,dDd,0.0,1.9183 +36,606,2018-11-15,1049715,205.4,39293799.7,10471,C,1.0,1.7068 +19,86,2018-10-26,1049716,222.4,39066597.7,11910,b,0.0,1.6154 +44,482,2018-10-27,1049717,730.4,17717496.7,11497,dDd,0.0,0.7217 +34,980,2018-11-30,1049718,722.4,37922202.7,10626,aaa,0.0,1.3519 +94,38,2018-12-20,1049719,278.4,36396997.7,11718,aaa,0.0,1.9519 +3,717,2018-10-24,1049720,27.4,5076374.7,10130,dDd,0.0,1.5383 +27,524,2018-10-5,1049721,454.4,32626467.7,10524,b,0.0,1.3634 +41,170,2018-12-15,1049722,17.4,1021409.7,11619,C,0.0,0.6173 +50,997,2018-10-11,1049723,469.4,18180702.7,10240,b,0.0,0.8934 +19,597,2018-12-21,1049724,334.4,8088207.7,11586,aaa,0.0,0.2144 +50,698,2018-10-7,1049725,823.4,6586905.7,10021,dDd,0.0,0.6295 +12,180,2018-11-16,1049726,519.4,26622483.7,10690,aaa,0.0,1.6908 +40,807,2018-12-22,1049727,854.4,31130704.7,10531,aaa,0.0,1.4059 +67,883,2018-11-13,1049728,859.4,6689719.7,11353,C,0.0,1.6101 +34,697,2018-11-26,1049729,560.4,13239267.7,10098,aaa,0.0,0.9027 +43,828,2018-10-12,1049730,122.4,37434413.7,11053,b,0.0,1.4227 +69,827,2018-11-25,1049731,188.4,15954819.7,10664,b,0.0,0.5696 +70,202,2018-10-7,1049732,897.4,39168156.7,11695,dDd,0.0,1.6717 +42,345,2018-11-6,1049733,687.4,37172397.7,11850,aaa,0.0,0.0325 +52,340,2018-11-19,1049734,607.4,12452469.7,10400,aaa,0.0,1.9137 +79,154,2018-11-1,1049735,902.4,30571073.7,10465,aaa,0.0,1.9582 +79,986,2018-11-21,1049736,433.4,23237013.7,11223,C,0.0,1.1384 +100,205,2018-11-22,1049737,663.4,18137333.7,11608,dDd,0.0,1.5280 +83,743,2018-11-19,1049738,473.4,38373326.7,11178,C,0.0,0.1701 +21,924,2018-11-11,1049739,828.4,20999639.7,10329,aaa,0.0,0.2890 +39,351,2018-12-23,1049740,722.4,27348575.7,11973,aaa,0.0,0.7961 +23,469,2018-12-6,1049741,584.4,36098347.7,11565,C,1.0,1.5071 +17,806,2018-11-14,1049742,144.4,39470364.7,11295,dDd,0.0,0.7529 +59,553,2018-12-20,1049743,125.4,14942710.7,10749,C,1.0,1.6523 +46,514,2018-10-17,1049744,854.4,1437819.7,11805,b,0.0,1.9727 +74,186,2018-10-25,1049745,550.4,33319018.7,11637,aaa,0.0,0.6712 +55,512,2018-10-7,1049746,824.4,39320021.7,10001,dDd,0.0,1.3592 +45,694,2018-12-22,1049747,393.4,13460948.7,10383,dDd,0.0,1.5882 +18,248,2018-12-23,1049748,504.4,23629364.7,11813,C,0.0,1.3929 +80,639,2018-11-25,1049749,346.4,31830108.7,10252,dDd,0.0,0.7111 +98,905,2018-10-10,1049750,129.4,7085030.7,11476,C,0.0,1.5401 +68,67,2018-10-11,1049751,641.4,20329898.7,11627,b,0.0,0.9312 +40,971,2018-12-20,1049752,511.4,37255249.7,11723,aaa,0.0,0.0745 +80,717,2018-12-1,1049753,692.4,2065939.7,10429,dDd,0.0,0.1573 +32,37,2018-11-2,1049754,191.4,32184525.7,11252,b,0.0,1.8246 +51,259,2018-12-8,1049755,567.4,5928686.7,10250,dDd,0.0,0.2889 +14,254,2018-10-28,1049756,38.4,15403241.7,10706,b,0.0,0.7868 +49,7,2018-11-2,1049757,752.4,24710634.7,11417,aaa,0.0,1.5154 +39,392,2018-10-12,1049758,64.4,34967252.7,11335,aaa,0.0,1.6948 +100,466,2018-10-23,1049759,953.4,24848538.7,11386,aaa,0.0,0.3969 +73,433,2018-10-21,1049760,929.4,4764149.7,11170,aaa,0.0,0.4181 +9,393,2018-11-12,1049761,656.4,38569613.7,10332,dDd,0.0,1.1175 +46,363,2018-10-24,1049762,90.4,33965748.7,10023,dDd,0.0,0.9664 +69,439,2018-12-28,1049763,984.4,9852930.7,10377,C,0.0,0.0898 +54,390,2018-10-29,1049764,952.4,13031463.7,10182,aaa,0.0,1.1499 +46,300,2018-10-1,1049765,259.4,26505540.7,10530,aaa,0.0,0.8802 +11,101,2018-11-2,1049766,133.4,6016198.7,10071,b,0.0,0.0479 +39,477,2018-11-19,1049767,948.4,19515888.7,10907,C,0.0,0.2883 +85,776,2018-11-6,1049768,69.4,26961242.7,10260,dDd,0.0,0.4082 +68,926,2018-10-5,1049769,792.4,23638589.7,10129,dDd,0.0,0.2180 +70,1,2018-12-7,1049770,870.4,28429581.7,11219,dDd,0.0,0.5773 +22,464,2018-12-17,1049771,38.4,31189827.7,10387,b,0.0,1.2042 +19,948,2018-12-22,1049772,972.4,9858477.7,10300,C,0.0,1.7251 +1,487,2018-11-13,1049773,185.4,25188993.7,10025,C,1.0,1.3303 +92,47,2018-10-29,1049774,790.4,35565244.7,11953,aaa,0.0,0.8566 +40,403,2018-10-20,1049775,901.4,25294272.7,11145,aaa,0.0,1.6978 +71,710,2018-12-16,1049776,520.4,13493521.7,10570,aaa,0.0,0.0015 +2,764,2018-10-13,1049777,628.4,36373613.7,10535,aaa,0.0,0.2157 +45,957,2018-12-13,1049778,297.4,33646111.7,11478,aaa,0.0,1.2860 +5,876,2018-10-2,1049779,820.4,31364483.7,10763,aaa,0.0,1.3943 +71,634,2018-12-22,1049780,675.4,22519001.7,11517,dDd,0.0,0.9268 +85,868,2018-10-28,1049781,351.4,3228285.7,11618,b,0.0,0.8260 +10,712,2018-11-4,1049782,851.4,36031178.7,11851,dDd,0.0,0.3255 +55,765,2018-12-29,1049783,461.4,16590798.7,10517,C,0.0,1.0013 +34,837,2018-12-29,1049784,22.4,11315908.7,10801,C,0.0,0.9833 +15,547,2018-10-19,1049785,962.4,1777890.7,10558,C,0.0,0.1501 +34,370,2018-11-26,1049786,525.4,691876.7,10146,C,0.0,1.2902 +11,517,2018-11-17,1049787,275.4,1601811.7,11607,C,1.0,1.7701 +40,388,2018-11-15,1049788,632.4,6987671.7,10512,C,0.0,1.6655 +76,518,2018-10-14,1049789,298.4,1886372.7,11327,C,1.0,0.9849 +53,267,2018-10-21,1049790,432.4,8351594.7,11274,b,0.0,0.1670 +74,322,2018-12-4,1049791,294.4,32866557.7,10347,dDd,0.0,0.0836 +89,145,2018-11-30,1049792,795.4,30815308.7,10017,aaa,0.0,0.1024 +89,282,2018-12-12,1049793,296.4,33327072.7,11073,aaa,0.0,1.1334 +94,111,2018-11-12,1049794,406.4,8200874.7,11328,b,0.0,0.1733 +45,973,2018-10-28,1049795,938.4,4373504.7,10921,dDd,0.0,1.2523 +40,370,2018-11-17,1049796,186.4,31190901.7,10018,b,0.0,0.0136 +12,963,2018-12-4,1049797,391.4,32614914.7,10312,aaa,0.0,0.2212 +2,356,2018-10-26,1049798,536.4,34946832.7,11591,aaa,0.0,1.5406 +73,26,2018-11-22,1049799,120.4,24211015.7,11864,C,0.0,0.4217 +69,329,2018-12-26,1049800,707.4,10827844.7,10774,aaa,0.0,0.4392 +88,168,2018-10-28,1049801,740.4,20308442.7,10267,b,0.0,0.1179 +52,412,2018-12-13,1049802,161.4,7679505.7,11993,C,1.0,1.6260 +27,378,2018-11-26,1049803,274.4,14635592.7,11045,C,0.0,0.1643 +66,513,2018-11-10,1049804,45.4,33848364.7,10433,aaa,0.0,1.4482 +86,46,2018-10-3,1049805,601.4,37147806.7,11546,aaa,0.0,0.4825 +73,93,2018-10-2,1049806,458.4,3232966.7,11178,b,0.0,1.8621 +31,1,2018-12-11,1049807,840.4,34640553.7,10811,aaa,0.0,1.4497 +92,25,2018-11-15,1049808,281.4,18054196.7,10437,C,0.0,0.6982 +36,687,2018-12-10,1049809,405.4,37648967.7,10151,C,1.0,1.1481 +18,201,2018-11-7,1049810,345.4,35205745.7,11874,C,0.0,0.8440 +70,869,2018-11-9,1049811,958.4,36749445.7,11328,aaa,0.0,1.6250 +93,328,2018-10-20,1049812,92.4,31913310.7,11988,aaa,0.0,1.9741 +40,860,2018-10-13,1049813,58.4,17236021.7,10611,aaa,0.0,1.1695 +25,486,2018-12-8,1049814,711.4,11060297.7,11890,b,0.0,0.6263 +4,122,2018-10-30,1049815,101.4,12309948.7,10473,dDd,0.0,0.9574 +74,951,2018-11-18,1049816,694.4,13080141.7,11056,dDd,0.0,1.3196 +35,192,2018-11-24,1049817,542.4,27092275.7,11047,C,0.0,1.9165 +32,813,2018-10-24,1049818,98.4,23284294.7,11053,dDd,0.0,0.7275 +10,439,2018-12-11,1049819,698.4,35131275.7,11417,aaa,0.0,0.9851 +46,942,2018-11-11,1049820,682.4,17169217.7,11462,C,0.0,0.9014 +28,510,2018-12-17,1049821,913.4,7773846.7,11374,b,0.0,0.8945 +18,9,2018-10-13,1049822,749.4,3221448.7,10969,C,0.0,1.0687 +14,370,2018-11-15,1049823,632.4,33027359.7,11040,C,0.0,1.0038 +1,146,2018-10-11,1049824,825.4,18266569.7,11348,dDd,0.0,0.0279 +37,570,2018-10-22,1049825,350.4,26198681.7,10306,b,0.0,1.2420 +1,693,2018-11-21,1049826,416.4,21474656.7,10724,dDd,0.0,0.2561 +26,612,2018-10-28,1049827,653.4,6633836.7,11286,aaa,0.0,0.0415 +64,76,2018-11-15,1049828,930.4,28304092.7,11043,C,0.0,1.4633 +0,334,2018-12-18,1049829,635.4,33185217.7,10839,dDd,0.0,1.7967 +73,880,2018-10-10,1049830,557.4,32708628.7,11518,dDd,0.0,0.4632 +26,784,2018-10-10,1049831,37.4,1604211.7,10581,dDd,0.0,1.9025 +47,460,2018-12-11,1049832,531.4,21688779.7,11279,dDd,0.0,1.9146 +21,158,2018-12-6,1049833,864.4,27389165.7,10910,C,0.0,0.0892 +8,418,2018-11-12,1049834,844.4,39506657.7,10387,b,0.0,0.0668 +85,94,2018-12-8,1049835,490.4,10371939.7,10112,aaa,0.0,1.3628 +100,998,2018-10-16,1049836,82.4,38817885.7,10587,aaa,0.0,0.5717 +84,652,2018-12-8,1049837,310.4,35449720.7,11583,C,1.0,1.9289 +63,490,2018-10-9,1049838,298.4,7459300.7,11528,aaa,0.0,0.8124 +61,197,2018-11-17,1049839,602.4,28288048.7,11411,C,0.0,1.2699 +72,584,2018-11-28,1049840,286.4,38526274.7,10056,C,1.0,1.0769 +4,64,2018-11-27,1049841,486.4,20371487.7,10993,C,0.0,1.6564 +82,636,2018-11-18,1049842,42.4,8262923.7,11382,aaa,0.0,0.8950 +94,780,2018-12-3,1049843,734.4,22414368.7,10909,aaa,0.0,1.0510 +100,391,2018-12-2,1049844,171.4,13329799.7,10217,C,0.0,0.8259 +27,678,2018-11-7,1049845,234.4,6742778.7,11691,b,0.0,1.5213 +38,858,2018-12-2,1049846,857.4,8130573.7,10951,b,0.0,0.0084 +18,710,2018-10-13,1049847,748.4,14666580.7,10021,dDd,0.0,0.1455 +78,666,2018-12-4,1049848,25.4,12639838.7,11980,aaa,0.0,1.4378 +3,995,2018-11-30,1049849,205.4,6788832.7,10495,b,0.0,0.7360 +13,703,2018-12-17,1049850,763.4,15166712.7,11989,b,0.0,1.1306 +36,240,2018-11-28,1049851,872.4,24234390.7,11536,C,0.0,0.3392 +14,769,2018-11-30,1049852,386.4,23029611.7,11523,dDd,0.0,1.6305 +78,375,2018-12-15,1049853,838.4,6127787.7,10775,dDd,0.0,0.1993 +74,517,2018-11-4,1049854,549.4,37305421.7,11889,b,0.0,1.3429 +9,562,2018-10-6,1049855,741.4,24516025.7,10177,b,0.0,1.6584 +80,913,2018-12-24,1049856,691.4,19680284.7,10650,dDd,0.0,1.4414 +81,983,2018-12-10,1049857,721.4,2128860.7,11592,aaa,0.0,1.5990 +92,187,2018-10-6,1049858,238.4,15355527.7,10874,b,0.0,1.6999 +39,528,2018-11-1,1049859,521.4,19614508.7,11862,dDd,0.0,0.9046 +4,248,2018-10-27,1049860,712.4,2948571.7,10185,b,0.0,1.3956 +52,814,2018-12-17,1049861,533.4,10370209.7,10628,aaa,0.0,0.1631 +69,71,2018-11-29,1049862,827.4,1967276.7,11687,C,0.0,0.8072 +80,839,2018-11-29,1049863,895.4,19543265.7,10240,b,0.0,1.3102 +13,751,2018-12-11,1049864,226.4,30711711.7,11698,C,0.0,0.2523 +12,719,2018-12-22,1049865,132.4,17693003.7,11851,aaa,0.0,0.8739 +31,381,2018-12-29,1049866,320.4,26797551.7,10469,dDd,0.0,0.6730 +73,840,2018-10-4,1049867,656.4,29796637.7,10551,aaa,0.0,0.8240 +27,277,2018-11-12,1049868,311.4,21257189.7,11800,dDd,0.0,0.8028 +58,815,2018-11-18,1049869,16.4,30803479.7,10377,dDd,0.0,1.4855 +91,143,2018-11-26,1049870,703.4,31406570.7,11850,C,0.0,0.0940 +49,661,2018-10-8,1049871,591.4,33010542.7,10540,aaa,0.0,1.8798 +14,361,2018-10-2,1049872,73.4,28461783.7,11872,b,0.0,1.1419 +29,204,2018-11-26,1049873,457.4,28098559.7,10133,b,0.0,0.9889 +9,630,2018-11-1,1049874,429.4,6462374.7,10844,b,0.0,0.9308 +45,398,2018-11-6,1049875,809.4,30342380.7,10062,C,0.0,1.9679 +86,615,2018-11-24,1049876,173.4,31671458.7,10306,C,1.0,0.5102 +66,255,2018-12-18,1049877,128.4,38939877.7,10097,b,0.0,0.9392 +3,221,2018-11-8,1049878,316.4,21291487.7,11579,aaa,0.0,0.1134 +29,88,2018-11-1,1049879,438.4,10490925.7,11576,dDd,0.0,1.9480 +70,663,2018-10-12,1049880,909.4,33995754.7,11091,C,0.0,1.6752 +33,768,2018-12-13,1049881,179.4,10985173.7,11987,dDd,0.0,1.2440 +50,311,2018-12-3,1049882,271.4,32421950.7,10134,dDd,0.0,0.2871 +74,824,2018-10-26,1049883,206.4,9480962.7,11111,C,0.0,1.3057 +98,708,2018-11-12,1049884,161.4,35661061.7,10413,dDd,0.0,1.4434 +62,127,2018-12-12,1049885,337.4,25711928.7,10323,C,0.0,1.6300 +43,536,2018-11-10,1049886,254.4,5257207.7,10330,aaa,0.0,0.9640 +0,857,2018-10-30,1049887,873.4,18826077.7,11146,b,0.0,0.8848 +43,942,2018-11-12,1049888,580.4,34823143.7,11875,aaa,0.0,1.2290 +35,48,2018-10-23,1049889,593.4,5734100.7,10859,b,0.0,0.6639 +98,997,2018-11-12,1049890,709.4,2322233.7,11118,dDd,0.0,1.7894 +33,798,2018-10-29,1049891,198.4,27067323.7,11083,dDd,0.0,0.6247 +86,654,2018-10-21,1049892,748.4,29489548.7,10972,dDd,0.0,0.8271 +69,493,2018-12-19,1049893,456.4,29521195.7,11443,dDd,0.0,0.5966 +80,117,2018-11-11,1049894,507.4,5317629.7,10924,b,0.0,1.9349 +12,642,2018-12-7,1049895,18.4,7908923.7,11035,dDd,0.0,1.0794 +81,210,2018-11-1,1049896,246.4,17015865.7,10017,aaa,0.0,1.4705 +50,152,2018-10-20,1049897,887.4,35156849.7,10176,aaa,0.0,0.6080 +51,34,2018-10-2,1049898,301.4,2341632.7,11202,dDd,0.0,1.9034 +79,355,2018-11-13,1049899,666.4,12479913.7,11696,dDd,0.0,0.2733 +66,886,2018-12-12,1049900,94.4,26957298.7,10042,dDd,0.0,0.0934 +23,179,2018-11-9,1049901,816.4,39461570.7,10335,dDd,0.0,1.9974 +19,239,2018-11-17,1049902,257.4,3168625.7,10353,C,0.0,0.1531 +13,122,2018-12-19,1049903,354.4,26222450.7,10147,b,0.0,1.2353 +34,917,2018-12-11,1049904,723.4,9419580.7,11838,b,0.0,0.9863 +45,557,2018-11-4,1049905,923.4,39663552.7,11267,b,0.0,1.0839 +21,702,2018-10-18,1049906,651.4,38949276.7,10564,aaa,0.0,1.2032 +96,503,2018-11-2,1049907,129.4,3446627.7,10371,aaa,0.0,1.4965 +99,929,2018-11-14,1049908,703.4,28339635.7,11689,aaa,0.0,0.0231 +57,34,2018-11-23,1049909,934.4,35614330.7,10109,aaa,0.0,1.3166 +87,852,2018-11-2,1049910,316.4,22974034.7,11243,b,0.0,1.4445 +83,170,2018-11-16,1049911,70.4,16942877.7,11128,C,0.0,1.6983 +7,491,2018-12-10,1049912,264.4,27489350.7,11357,dDd,0.0,0.5607 +100,92,2018-10-12,1049913,939.4,14858263.7,10648,C,0.0,1.7316 +23,907,2018-10-20,1049914,763.4,2186573.7,10771,b,0.0,1.0039 +62,474,2018-12-18,1049915,912.4,37763744.7,11153,aaa,0.0,0.0040 +90,473,2018-10-6,1049916,16.4,21002603.7,11750,b,0.0,1.3617 +96,582,2018-11-19,1049917,143.4,14865801.7,10067,dDd,0.0,1.9680 +34,520,2018-10-12,1049918,87.4,18027844.7,10547,C,1.0,0.8888 +21,641,2018-11-14,1049919,698.4,2027518.7,11282,b,0.0,0.5907 +33,615,2018-12-30,1049920,354.4,15049499.7,10367,dDd,0.0,0.6319 +9,494,2018-11-6,1049921,582.4,34932543.7,10185,aaa,0.0,0.6782 +11,898,2018-10-9,1049922,950.4,10750329.7,11883,b,0.0,1.2153 +19,74,2018-10-4,1049923,973.4,19654119.7,11162,aaa,0.0,1.4590 +50,999,2018-10-22,1049924,267.4,38897187.7,10929,aaa,0.0,1.2748 +40,567,2018-11-18,1049925,78.4,25973217.7,10610,C,1.0,1.1503 +80,385,2018-12-18,1049926,119.4,9922474.7,11733,b,0.0,0.5383 +16,485,2018-10-15,1049927,765.4,25854515.7,10110,dDd,0.0,0.7453 +32,735,2018-11-2,1049928,897.4,12113517.7,11022,dDd,0.0,1.7582 +96,146,2018-10-7,1049929,511.4,9173018.7,10095,aaa,0.0,0.4418 +45,140,2018-10-29,1049930,596.4,27586529.7,11235,b,0.0,1.0186 +28,777,2018-10-29,1049931,212.4,17260845.7,10879,dDd,0.0,1.8516 +15,699,2018-11-22,1049932,553.4,27308084.7,11714,aaa,0.0,0.4391 +10,348,2018-12-9,1049933,622.4,22745320.7,10102,C,0.0,1.1717 +53,65,2018-11-27,1049934,504.4,11399239.7,10019,dDd,0.0,1.0870 +8,437,2018-11-29,1049935,474.4,37233935.7,10285,C,1.0,1.4254 +54,705,2018-12-11,1049936,226.4,6331758.7,10857,aaa,0.0,0.2556 +92,999,2018-12-7,1049937,365.4,32144246.7,10785,b,0.0,0.2902 +59,468,2018-11-16,1049938,470.4,37056211.7,11237,C,1.0,0.9220 +3,436,2018-11-15,1049939,170.4,18257815.7,11216,C,1.0,0.2787 +52,160,2018-12-24,1049940,471.4,31498441.7,10550,dDd,0.0,1.6068 +12,643,2018-10-17,1049941,679.4,21858927.7,11262,C,1.0,0.3665 +8,66,2018-11-13,1049942,797.4,7757464.7,10028,b,0.0,1.9770 +79,146,2018-12-24,1049943,684.4,21052481.7,10053,b,0.0,0.1674 +10,848,2018-10-26,1049944,464.4,26449872.7,11994,b,0.0,0.0981 +89,946,2018-10-8,1049945,426.4,5384283.7,11797,dDd,0.0,0.9809 +8,487,2018-12-10,1049946,386.4,4485378.7,11809,b,0.0,0.1715 +41,676,2018-10-17,1049947,818.4,4511628.7,10908,b,0.0,1.4597 +79,923,2018-10-24,1049948,685.4,26053284.7,11680,C,0.0,0.9489 +25,937,2018-12-26,1049949,167.4,30144346.7,11544,dDd,0.0,1.0603 +94,275,2018-11-14,1049950,588.4,33183432.7,10521,aaa,0.0,0.0504 +15,902,2018-11-30,1049951,726.4,24027515.7,10029,C,0.0,1.5808 +27,786,2018-12-17,1049952,266.4,33644391.7,11835,aaa,0.0,1.7385 +50,241,2018-11-2,1049953,744.4,18473514.7,11900,C,0.0,1.2657 +45,243,2018-12-20,1049954,367.4,9426050.7,11261,b,0.0,1.0398 +17,969,2018-10-21,1049955,333.4,31721222.7,10802,dDd,0.0,1.0133 +60,441,2018-10-7,1049956,239.4,19940361.7,11246,aaa,0.0,0.4160 +92,929,2018-12-10,1049957,105.4,7633714.7,10010,b,0.0,1.5781 +75,287,2018-11-16,1049958,154.4,37197926.7,10973,aaa,0.0,1.7585 +28,64,2018-10-8,1049959,276.4,30681125.7,11710,aaa,0.0,0.1742 +87,424,2018-12-7,1049960,387.4,13636919.7,10421,b,0.0,0.0199 +34,706,2018-10-18,1049961,407.4,16752267.7,10628,aaa,0.0,0.7772 +34,138,2018-12-12,1049962,303.4,26785575.7,10033,dDd,0.0,0.0258 +73,390,2018-12-19,1049963,759.4,35804356.7,11553,C,0.0,0.4590 +81,301,2018-12-20,1049964,475.4,17992492.7,10386,dDd,0.0,1.9489 +47,475,2018-11-13,1049965,509.4,32738223.7,11615,aaa,0.0,1.1128 +35,374,2018-12-15,1049966,772.4,37608793.7,10685,aaa,0.0,1.8844 +94,432,2018-12-18,1049967,245.4,10902153.7,10953,b,0.0,0.2045 +30,490,2018-12-20,1049968,820.4,28768015.7,10659,aaa,0.0,1.4030 +75,179,2018-10-23,1049969,786.4,32880228.7,10925,b,0.0,0.8064 +11,95,2018-10-30,1049970,104.4,18661024.7,10493,b,0.0,0.4832 +12,135,2018-11-2,1049971,249.4,5877149.7,10604,dDd,0.0,1.0098 +12,520,2018-10-28,1049972,302.4,24648459.7,10880,C,1.0,1.1728 +36,375,2018-11-18,1049973,387.4,21618787.7,10230,C,0.0,0.4602 +60,312,2018-10-24,1049974,164.4,17482396.7,11588,C,0.0,1.1773 +91,682,2018-11-29,1049975,408.4,26458193.7,11048,aaa,0.0,1.2709 +45,914,2018-10-6,1049976,739.4,39562790.7,11103,dDd,0.0,1.4411 +10,744,2018-11-1,1049977,965.4,11342856.7,11815,aaa,0.0,1.3487 +18,565,2018-10-3,1049978,650.4,32226926.7,11929,aaa,0.0,0.7306 +85,337,2018-11-2,1049979,475.4,581517.7,11990,dDd,0.0,0.3901 +3,895,2018-12-16,1049980,156.4,5035395.7,10918,aaa,0.0,0.4090 +40,153,2018-11-1,1049981,948.4,38389740.7,11644,dDd,0.0,0.7810 +12,409,2018-10-14,1049982,236.4,35471562.7,10483,dDd,0.0,1.9709 +76,796,2018-12-2,1049983,301.4,5066702.7,10574,dDd,0.0,0.1475 +86,706,2018-10-4,1049984,665.4,6170065.7,10293,b,0.0,0.0468 +63,919,2018-12-26,1049985,891.4,724333.7,10051,dDd,0.0,1.0106 +19,663,2018-10-28,1049986,775.4,12063732.7,11996,dDd,0.0,1.1608 +96,541,2018-10-26,1049987,78.4,35719826.7,11675,C,1.0,0.4628 +59,503,2018-10-9,1049988,111.4,2853594.7,11103,b,0.0,0.5888 +23,299,2018-10-4,1049989,25.4,17413830.7,11792,dDd,0.0,0.9193 +11,611,2018-11-25,1049990,383.4,5327693.7,11810,b,0.0,0.6370 +70,226,2018-11-7,1049991,577.4,23854000.7,10903,aaa,0.0,0.6086 +31,137,2018-10-13,1049992,816.4,30840207.7,11949,aaa,0.0,1.6965 +77,492,2018-11-25,1049993,375.4,11017846.7,11617,aaa,0.0,0.6628 +74,672,2018-12-16,1049994,997.4,29622187.7,11782,aaa,0.0,1.0676 +92,469,2018-11-26,1049995,25.4,12345168.7,10268,dDd,0.0,1.6454 +15,728,2018-10-21,1049996,474.4,25623075.7,11489,aaa,0.0,1.7756 +6,831,2018-10-3,1049997,320.4,34930523.7,10284,dDd,0.0,0.9521 +666,831,2018-12-22,1049998,582.4,16144459.7,11133,b,0.0,1.8499 +666,527,2018-10-14,1049999,727.4,31138011.7,10805,aaa,0.0,1.1787 From 629ced4502568b57d8b15532691c9f1a26505a52 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 10:26:13 +0100 Subject: [PATCH 07/27] chore(cicd): bump cache maven packages --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7589ce41..6bdf0aa5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,7 +36,7 @@ jobs: distribution: 'zulu' - name: Cache Maven packages - uses: actions/cache@v3.3.2 + uses: actions/cache@v4 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} From 496f96704d81c5aa9d0e7c8ffc22c3598873d68b Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 16:43:47 +0100 Subject: [PATCH 08/27] fix(submodules): pointing make-lightgbm submodule to fork with AMD64 dockerfile based on manylinux_2_28 --- .gitmodules | 3 ++- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitmodules b/.gitmodules index a50d8ea8..86b9dd3a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "openml-lightgbm/lightgbm-builder/make-lightgbm"] path = openml-lightgbm/lightgbm-builder/make-lightgbm - url = https://github.com/feedzai/make-lightgbm + url = https://github.com/jpleitao/make-lightgbm.git + branch = ft-jl-amd64-manylinux_2_28 diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index fdb7fde9..4aceceba 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit fdb7fde9814c4f55b0cb5a2add7d0a1bdb3ed0c0 +Subproject commit 4aceceba5c62f64235b32669c61687317d911db6 From 690313c04ce6423d764661c9a133fbd8dafb1e4d Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 17:09:26 +0100 Subject: [PATCH 09/27] fix(submodules): update make-lightgbm submodule --- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index 4aceceba..3d5692cf 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit 4aceceba5c62f64235b32669c61687317d911db6 +Subproject commit 3d5692cfe5ac7af778a68a873342f61e9b12eb40 From bcb3b8e3f5f348f95da6f57f76bd8f1f9b4ad31e Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 17:22:21 +0100 Subject: [PATCH 10/27] fix(submodules): update make-lightgbm submodule --- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index 3d5692cf..0b6edbef 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit 3d5692cfe5ac7af778a68a873342f61e9b12eb40 +Subproject commit 0b6edbefe610a3065311934dd812919e763bd134 From 241ec8965247bb0860dc33ea7a5fa9140a5f5e55 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 18:16:50 +0100 Subject: [PATCH 11/27] fix(submodules): update make-lightgbm submodule --- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index 0b6edbef..46eddbd8 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit 0b6edbefe610a3065311934dd812919e763bd134 +Subproject commit 46eddbd8dbc55ada8006264056216e027341ec31 From 905a26f6e2d7a5b8168742ec23ddfc2e4b4b9928 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Thu, 14 May 2026 19:39:08 +0100 Subject: [PATCH 12/27] fix(pom): pin maven-antrun-plugin version --- openml-lightgbm/lightgbm-builder/pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-builder/pom.xml b/openml-lightgbm/lightgbm-builder/pom.xml index d1c686eb..2b2f2783 100644 --- a/openml-lightgbm/lightgbm-builder/pom.xml +++ b/openml-lightgbm/lightgbm-builder/pom.xml @@ -85,15 +85,16 @@ maven-antrun-plugin + 3.1.0 generate-resources - + - + run From d1ce4d45ca516221a081ac05a1c4a4cd15cc5fd9 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Fri, 15 May 2026 10:32:13 +0100 Subject: [PATCH 13/27] chore(cicd): bumping codecod to v5 --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6bdf0aa5..16952d5b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,6 +70,8 @@ jobs: cd /feedzai-openml-java && \ mvn test -B -Dsurefire.failIfNoSpecifiedTests=false -Dtest=!ClassifyUnknownCategoryTest#test,!H2OModelProviderTrainTest#trainModelsForAllAlgorithms' - - uses: codecov/codecov-action@v1 + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 with: + use_oidc: true fail_ci_if_error: true From 47faf1f8046f778d5d96965dc88c6b29d92c1e69 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Fri, 15 May 2026 18:31:03 +0100 Subject: [PATCH 14/27] fix(lightgbm): add check for sample weight values --- .../LightGBMBinaryClassificationModelTrainer.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java index beccdc24..24997e3d 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java @@ -573,8 +573,16 @@ private static void copyTrainDataToSWIGArrays(final Dataset dataset, swigTrainData.addConstraintGroupValue((int) instance.getValue(constraintGroupIndex)); } - sampleWeightColIndex.ifPresent(integer -> swigTrainData.addSampleWeightValue((float) instance.getValue( - integer))); + // Add sample weight and validate that it is non-negative + sampleWeightColIndex.ifPresent(integer -> { + final float weight = (float) instance.getValue(integer); + if (weight < 0) { + throw new IllegalArgumentException(String.format( + "Sample weight must be non-negative, but got: %f", weight + )); + } + swigTrainData.addSampleWeightValue(weight); + }); for (int colIdx = 0; colIdx < numFields; ++colIdx) { // Don't add features for target and sample weight columns (in the case of sample weight, From 35bdb1b8cabeb0442bd39a5961f7783ca5231844 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Fri, 15 May 2026 18:32:13 +0100 Subject: [PATCH 15/27] chore(tests): added tests for SchemaFieldsUtil class --- .../lightgbm/SchemaFieldsUtilTest.java | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java new file mode 100644 index 00000000..43a2652e --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java @@ -0,0 +1,109 @@ +/* + * The copyright of this file belongs to Feedzai. The file cannot be + * reproduced in whole or in part, stored in a retrieval system, + * transmitted in any form, or by any means electronic, mechanical, + * photocopying, or otherwise, without the prior permission of the owner. + * + * © 2026 Feedzai, Strictly Confidential + */ + +package com.feedzai.openml.provider.lightgbm; + +import com.feedzai.openml.data.schema.CategoricalValueSchema; +import com.feedzai.openml.data.schema.DatasetSchema; +import com.feedzai.openml.data.schema.FieldSchema; +import com.feedzai.openml.data.schema.NumericValueSchema; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.junit.Test; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SchemaFieldsUtil}. + * + * @author Joaquim Leitão (joaquim.leitao@feedzai.com) + */ +public class SchemaFieldsUtilTest { + + /** + * Schema: amount(0), num1(1), label(2), num2(3) + * Target index: 2 + */ + private static final DatasetSchema SCHEMA_LABEL_IN_MIDDLE = new DatasetSchema( + 2, + ImmutableList.of( + new FieldSchema("amount", 0, new NumericValueSchema(false)), + new FieldSchema("num1", 1, new NumericValueSchema(false)), + new FieldSchema("label", 2, new CategoricalValueSchema(true, ImmutableSet.of("0", "1"))), + new FieldSchema("num2", 3, new NumericValueSchema(false)) + ) + ); + + /** + * Tests that {@link SchemaFieldsUtil#getColumnIndex} correctly identifies the index + * of a field that is present in the provided schema. + */ + @Test + public void testGetColumnIndexExistingField() { + final Optional result = SchemaFieldsUtil.getColumnIndex("amount", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isPresent().contains(0); + } + + /** + * Tests that {@link SchemaFieldsUtil#getColumnIndex} correctly identifies the index + * of a field that is present in the provided schema, in a case-insensitive manner. + */ + @Test + public void testGetColumnIndexCaseInsensitive() { + final Optional result = SchemaFieldsUtil.getColumnIndex("AMOUNT", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isPresent().contains(0); + } + + /** + * Tests that {@link SchemaFieldsUtil#getColumnIndex} returns an empty {@link Optional} + * when the requested field name is not present in the schema. + */ + @Test + public void testGetColumnIndexNotFound() { + final Optional result = SchemaFieldsUtil.getColumnIndex("nonexistent_field", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isEmpty(); + } + + /** + * Test that when a field comes before the target column in the schema, + * {@link SchemaFieldsUtil#getColumnIndex} returns its index unchanged + * (LightGBM's internal representation excludes the target column, so + * fields before the target should retain their index unchanged). + */ + @Test + public void testGetFieldIndexWithoutLabelFieldBeforeTarget() { + final Optional result = SchemaFieldsUtil.getFieldIndexWithoutLabel("num1", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isPresent().contains(1); + } + + /** + * Test that when a field comes after the target column in the schema, + * {@link SchemaFieldsUtil#getColumnIndex} offsets the field index by -1 + * (LightGBM's internal representation excludes the target column, so + * fields after the target have their index offset by -1). + */ + @Test + public void testGetFieldIndexWithoutLabelFieldAfterTarget() { + final Optional result = SchemaFieldsUtil.getFieldIndexWithoutLabel("num2", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isPresent().contains(2); + } + + /** + * Tests that {@link SchemaFieldsUtil#getFieldIndexWithoutLabel} returns + * an empty {@link Optional} when the requested field name is not present + * in the schema. + */ + @Test + public void testGetFieldIndexWithoutLabelNotFound() { + final Optional result = SchemaFieldsUtil.getFieldIndexWithoutLabel("nonexistent", SCHEMA_LABEL_IN_MIDDLE); + assertThat(result).isEmpty(); + } +} From 817ecec471a5732fecd5858bca0a187ad1fcef75 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Fri, 15 May 2026 18:33:07 +0100 Subject: [PATCH 16/27] chore(tests): add test for negative sample weights --- ...MBinaryClassificationModelTrainerTest.java | 21 + .../provider/lightgbm/TestResources.java | 5 + .../instances_with_negative_weight.csv | 713 ++++++++++++++++++ 3 files changed, 739 insertions(+) create mode 100644 openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_negative_weight.csv diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java index fbeb611f..e222c888 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java @@ -341,6 +341,27 @@ public void fitWithSampleWeight() throws URISyntaxException, IOException { } } + /** + * Asserts that training with negative sample weights throws an error, + * as LightGBM does not support negative weights + * + * @throws URISyntaxException For errors when loading the dataset resource. + * @throws IOException For errors when reading the dataset. + */ + @Test(expected = RuntimeException.class) + public void fitWithNegativeSampleWeightThrows() throws URISyntaxException, IOException, ModelLoadingException { + final Map params = new HashMap<>(MODEL_PARAMS); + params.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "sample_weight_double"); + + final Dataset dataset = CSVUtils.getDatasetWithSchema( + TestResources.getResourcePath(TestResources.INSTANCES_WITH_NEGATIVE_SAMPLE_WEIGHT_NAME), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END, + MAX_NUMBER_OF_INSTANCES_TO_TRAIN + ); + + fit(dataset, params, SMALL_TRAIN_DATA_CHUNK_INSTANCES_SIZE); + } + /** * Test Feature Contributions with target at end. * diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java index 5959b62d..a547a4ff 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/TestResources.java @@ -49,6 +49,11 @@ public class TestResources { */ public static final String INSTANCES_WITH_FRAUD_SAMPLE_WEIGHT_NAME = "instances_with_fraud_weight.csv"; + /** + * Name of the resource containing instances with negative sample weights. + */ + public static final String INSTANCES_WITH_NEGATIVE_SAMPLE_WEIGHT_NAME = "instances_with_negative_weight.csv"; + /** * Model folder resource name. */ diff --git a/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_negative_weight.csv b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_negative_weight.csv new file mode 100644 index 00000000..3b6fca95 --- /dev/null +++ b/openml-lightgbm/lightgbm-provider/src/test/resources/instances_with_negative_weight.csv @@ -0,0 +1,713 @@ +card,amount,event_timestamp,uuid,num1_float,num2_double,num3_int,cat1_string,is_fraud_label_indexed,sample_weight_double +17,567,2018-10-6,1049288,160.4,6025580.7,11819,C,1.0,0.0669 +56,38,2018-10-6,1049289,83.4,5283538.7,10565,aaa,0.0,0.6599 +7,503,2018-11-5,1049290,757.4,28760094.7,11177,b,0.0,-0.5 +15,749,2018-11-22,1049291,319.4,3522113.7,11822,b,0.0,0.8450 +87,524,2018-12-3,1049292,815.4,32883183.7,11003,aaa,0.0,0.4125 +48,968,2018-10-7,1049293,34.4,3723194.7,11699,b,0.0,-0.5 +91,552,2018-11-19,1049294,474.4,12149864.7,11836,aaa,0.0,1.2731 +44,902,2018-11-1,1049295,111.4,27091506.7,11830,b,0.0,1.7272 +51,26,2018-12-27,1049296,521.4,17449759.7,11991,b,0.0,-0.5 +35,24,2018-10-18,1049297,404.4,37359857.7,11554,C,0.0,0.0498 +21,582,2018-11-15,1049298,645.4,8400166.7,11341,C,1.0,0.7300 +20,128,2018-11-13,1049299,953.4,28996407.7,10890,aaa,0.0,-0.5 +54,847,2018-12-18,1049300,18.4,19075072.7,11065,C,0.0,0.6357 +54,636,2018-11-8,1049301,546.4,6903447.7,11121,dDd,0.0,0.2715 +85,231,2018-10-10,1049302,645.4,19859752.7,10973,aaa,0.0,-0.5 +6,691,2018-10-28,1049303,74.4,31026014.7,10388,b,0.0,1.5213 +29,311,2018-11-15,1049304,957.4,22808904.7,10299,b,0.0,0.1633 +78,805,2018-10-27,1049305,931.4,10358131.7,10907,C,0.0,-0.5 +84,882,2018-12-10,1049306,790.4,37998060.7,11038,b,0.0,1.1293 +57,579,2018-11-25,1049307,954.4,35367561.7,11540,C,0.0,1.4865 +79,544,2018-11-21,1049308,67.4,34387902.7,10280,dDd,0.0,-0.5 +92,649,2018-12-13,1049309,295.4,16600833.7,11241,b,0.0,0.4377 +46,152,2018-10-3,1049310,692.4,31376892.7,11776,b,0.0,0.9088 +37,832,2018-11-25,1049311,77.4,33046809.7,10262,b,0.0,-0.5 +79,90,2018-11-1,1049312,897.4,26019875.7,11006,b,0.0,1.1477 +36,419,2018-10-3,1049313,848.4,33393435.7,10937,b,0.0,1.1105 +99,194,2018-10-28,1049314,389.4,16413028.7,10230,aaa,0.0,-0.5 +18,977,2018-11-1,1049315,602.4,36307673.7,11421,dDd,0.0,1.2577 +59,643,2018-11-27,1049316,170.4,8919422.7,11490,dDd,0.0,1.5923 +39,320,2018-10-24,1049317,530.4,8713834.7,11933,aaa,0.0,-0.5 +29,950,2018-11-22,1049318,44.4,11624206.7,10918,dDd,0.0,0.5495 +50,359,2018-12-29,1049319,937.4,8182500.7,10396,C,0.0,1.6592 +69,961,2018-11-18,1049320,999.4,13074615.7,10372,aaa,0.0,-0.5 +17,173,2018-11-18,1049321,527.4,4531587.7,11237,aaa,0.0,1.9308 +90,480,2018-12-1,1049322,594.4,19013138.7,10573,dDd,0.0,0.5042 +41,528,2018-10-5,1049323,424.4,31516519.7,10731,b,0.0,-0.5 +49,641,2018-12-19,1049324,599.4,21868175.7,10771,b,0.0,0.4311 +46,672,2018-11-3,1049325,396.4,27860735.7,11473,b,0.0,1.7773 +16,552,2018-10-21,1049326,627.4,25320892.7,11056,C,1.0,-0.5 +95,613,2018-12-1,1049327,818.4,31341462.7,10873,dDd,0.0,1.0344 +75,910,2018-11-14,1049328,644.4,11239364.7,10776,dDd,0.0,1.8271 +51,179,2018-12-16,1049329,774.4,29858606.7,11328,dDd,0.0,-0.5 +30,477,2018-12-24,1049330,521.4,4150163.7,10661,C,1.0,0.5651 +58,266,2018-11-4,1049331,522.4,37458619.7,11806,dDd,0.0,0.4629 +49,319,2018-12-29,1049332,707.4,22404561.7,11808,dDd,0.0,-0.5 +74,924,2018-12-10,1049333,686.4,16087861.7,11949,aaa,0.0,0.7786 +49,673,2018-12-20,1049334,117.4,14259755.7,11403,C,1.0,1.9842 +27,642,2018-12-3,1049335,879.4,28985545.7,10193,C,0.0,-0.5 +31,702,2018-10-10,1049336,180.4,25185877.7,11748,b,0.0,1.8805 +36,101,2018-11-30,1049337,923.4,15362870.7,10519,dDd,0.0,1.1135 +26,296,2018-11-1,1049338,843.4,26609141.7,11301,b,0.0,-0.5 +3,412,2018-12-22,1049339,354.4,23396197.7,11876,b,0.0,1.8441 +26,265,2018-11-12,1049340,961.4,10331127.7,11151,dDd,0.0,1.5512 +80,987,2018-12-22,1049341,255.4,18799834.7,11832,dDd,0.0,-0.5 +85,50,2018-10-17,1049342,25.4,4539677.7,11563,aaa,0.0,0.8814 +63,553,2018-10-25,1049343,447.4,36735570.7,10287,b,0.0,0.6989 +61,778,2018-11-26,1049344,362.4,5427283.7,11992,aaa,0.0,-0.5 +85,544,2018-11-16,1049345,52.4,4001584.7,10558,aaa,0.0,0.3385 +9,138,2018-11-9,1049346,270.4,37231785.7,10929,C,0.0,1.9566 +10,616,2018-12-9,1049347,334.4,27942777.7,11806,aaa,0.0,-0.5 +42,858,2018-12-23,1049348,158.4,8404215.7,10777,dDd,0.0,1.5059 +69,6,2018-11-13,1049349,546.4,15308850.7,11832,dDd,0.0,0.5062 +71,456,2018-11-6,1049350,13.4,11477405.7,10776,dDd,0.0,-0.5 +69,424,2018-10-17,1049351,877.4,7552889.7,10988,b,0.0,1.3332 +91,412,2018-12-1,1049352,142.4,23523400.7,10300,C,1.0,0.4370 +41,7,2018-10-8,1049353,764.4,798581.7,11735,dDd,0.0,-0.5 +2,656,2018-12-30,1049354,142.4,7892579.7,10920,C,1.0,1.5731 +32,174,2018-10-15,1049355,424.4,30096218.7,11920,C,0.0,0.8680 +74,102,2018-12-17,1049356,628.4,9966560.7,11969,aaa,0.0,-0.5 +39,597,2018-11-28,1049357,174.4,18238744.7,11288,dDd,0.0,1.5403 +96,339,2018-12-10,1049358,810.4,332899.7,11519,aaa,0.0,1.9024 +85,350,2018-12-12,1049359,954.4,2988438.7,10731,b,0.0,-0.5 +93,170,2018-11-12,1049360,916.4,20065446.7,11591,C,0.0,0.2374 +39,447,2018-10-6,1049361,146.4,39232857.7,11760,dDd,0.0,0.4675 +89,704,2018-10-3,1049362,738.4,13707294.7,10924,C,0.0,-0.5 +26,559,2018-10-27,1049363,558.4,23584741.7,11565,dDd,0.0,1.2060 +45,459,2018-11-26,1049364,822.4,17639277.7,11100,aaa,0.0,1.2462 +6,266,2018-11-12,1049365,953.4,27744001.7,10920,b,0.0,-0.5 +95,612,2018-10-18,1049366,592.4,29096246.7,10451,b,0.0,0.3379 +18,547,2018-10-4,1049367,251.4,38682762.7,11877,aaa,0.0,1.1267 +7,812,2018-11-1,1049368,546.4,38793076.7,10342,b,0.0,-0.5 +30,337,2018-10-29,1049369,509.4,38968593.7,10310,dDd,0.0,0.9564 +82,645,2018-12-14,1049370,752.4,35080814.7,10726,dDd,0.0,0.9708 +5,771,2018-10-7,1049371,451.4,1491396.7,11898,b,0.0,-0.5 +30,470,2018-10-2,1049372,867.4,7016700.7,10355,C,0.0,0.4836 +97,752,2018-12-12,1049373,652.4,12584033.7,11393,b,0.0,1.8521 +35,457,2018-12-4,1049374,4.4,10623678.7,11012,C,1.0,-0.5 +48,999,2018-12-12,1049375,181.4,26896719.7,11864,b,0.0,1.1213 +63,971,2018-11-16,1049376,300.4,29618446.7,10605,aaa,0.0,0.1906 +40,659,2018-11-13,1049377,935.4,35644646.7,10331,aaa,0.0,-0.5 +70,524,2018-10-26,1049378,893.4,4015615.7,10365,aaa,0.0,1.3513 +80,586,2018-10-10,1049379,834.4,11959317.7,10399,aaa,0.0,1.6965 +32,323,2018-12-15,1049380,307.4,28778499.7,10012,aaa,0.0,-0.5 +37,99,2018-11-6,1049381,223.4,15410836.7,11786,b,0.0,1.2405 +98,751,2018-11-17,1049382,533.4,35268985.7,10634,dDd,0.0,1.0297 +89,176,2018-10-25,1049383,323.4,33315743.7,10637,dDd,0.0,-0.5 +17,226,2018-12-7,1049384,119.4,26961321.7,10831,C,0.0,1.6338 +49,629,2018-12-26,1049385,557.4,2256305.7,10302,b,0.0,0.6029 +8,95,2018-10-8,1049386,864.4,23430968.7,11426,aaa,0.0,-0.5 +99,397,2018-11-3,1049387,93.4,20621185.7,10267,C,0.0,1.8044 +10,309,2018-11-29,1049388,701.4,16742514.7,11911,b,0.0,0.1431 +3,866,2018-10-4,1049389,56.4,22865562.7,11820,dDd,0.0,-0.5 +65,419,2018-12-10,1049390,656.4,3643620.7,11842,aaa,0.0,1.8022 +94,28,2018-10-30,1049391,387.4,37732277.7,11360,b,0.0,0.3805 +25,214,2018-12-29,1049392,228.4,8527569.7,11042,dDd,0.0,-0.5 +100,753,2018-12-19,1049393,80.4,26252736.7,11731,aaa,0.0,0.2628 +25,462,2018-11-27,1049394,712.4,30032785.7,11701,aaa,0.0,1.5865 +43,703,2018-10-11,1049395,615.4,32048887.7,11958,C,0.0,-0.5 +62,419,2018-12-17,1049396,424.4,7517607.7,10732,aaa,0.0,0.7076 +49,96,2018-11-18,1049397,188.4,4148488.7,10887,dDd,0.0,1.9244 +0,472,2018-11-23,1049398,839.4,891910.7,10073,dDd,0.0,-0.5 +16,364,2018-12-27,1049399,404.4,35638674.7,11463,b,0.0,0.2659 +27,489,2018-10-29,1049400,496.4,34884999.7,11699,b,0.0,0.8808 +61,676,2018-10-19,1049401,972.4,35040651.7,11796,dDd,0.0,-0.5 +25,169,2018-12-3,1049402,573.4,16312929.7,10295,aaa,0.0,1.3755 +94,818,2018-10-2,1049403,114.4,15176170.7,11895,dDd,0.0,1.3644 +57,674,2018-12-14,1049404,23.4,25085712.7,10857,dDd,0.0,-0.5 +37,239,2018-10-21,1049405,692.4,22977705.7,10273,C,0.0,1.1839 +29,962,2018-12-9,1049406,653.4,26601831.7,11616,b,0.0,0.4857 +43,200,2018-10-24,1049407,973.4,25474351.7,11384,b,0.0,-0.5 +0,491,2018-12-10,1049408,174.4,13135459.7,10549,b,0.0,0.9489 +5,132,2018-10-17,1049409,666.4,30477808.7,10253,b,0.0,1.8370 +43,809,2018-10-10,1049410,775.4,11598450.7,11232,b,0.0,-0.5 +99,669,2018-11-10,1049411,21.4,8480195.7,11104,dDd,0.0,1.2201 +1,781,2018-10-11,1049412,485.4,4735963.7,11505,C,0.0,1.0775 +8,178,2018-11-7,1049413,979.4,34664212.7,11941,C,0.0,-0.5 +32,115,2018-12-4,1049414,486.4,19001289.7,10731,C,0.0,1.9283 +16,423,2018-12-21,1049415,274.4,16735797.7,11887,dDd,0.0,0.7113 +93,735,2018-10-28,1049416,878.4,15996480.7,10525,C,0.0,-0.5 +96,95,2018-10-4,1049417,31.4,6696057.7,11861,dDd,0.0,1.5045 +59,31,2018-10-27,1049418,723.4,844560.7,10124,aaa,0.0,0.5157 +90,330,2018-10-19,1049419,164.4,31217361.7,10675,C,0.0,-0.5 +15,168,2018-12-10,1049420,205.4,17969936.7,11753,aaa,0.0,0.9831 +30,742,2018-10-13,1049421,542.4,12175267.7,10551,dDd,0.0,0.3179 +97,867,2018-10-5,1049422,182.4,18356710.7,10680,C,0.0,-0.5 +68,159,2018-11-3,1049423,275.4,31053000.7,11540,dDd,0.0,0.9292 +36,711,2018-10-5,1049424,262.4,31535243.7,10447,b,0.0,0.5807 +42,481,2018-12-4,1049425,745.4,39197227.7,10699,b,0.0,-0.5 +11,661,2018-12-22,1049426,526.4,37307237.7,11889,C,1.0,0.1215 +72,380,2018-10-7,1049427,906.4,20607507.7,10642,b,0.0,1.2883 +53,103,2018-12-16,1049428,218.4,7616086.7,10258,b,0.0,-0.5 +36,402,2018-12-22,1049429,770.4,23259431.7,11350,b,0.0,0.4405 +23,990,2018-11-14,1049430,871.4,25274658.7,10442,b,0.0,1.5543 +44,301,2018-12-5,1049431,27.4,4670603.7,11472,b,0.0,-0.5 +0,513,2018-10-19,1049432,373.4,36532176.7,10186,C,1.0,1.7303 +13,415,2018-11-7,1049433,629.4,28633245.7,11822,dDd,0.0,0.9297 +5,317,2018-10-25,1049434,649.4,13168783.7,10529,dDd,0.0,-0.5 +55,251,2018-11-27,1049435,993.4,22013773.7,10673,C,0.0,0.8722 +47,51,2018-12-18,1049436,618.4,3456270.7,11615,dDd,0.0,0.1136 +90,877,2018-11-1,1049437,901.4,12666128.7,10633,b,0.0,-0.5 +44,626,2018-12-17,1049438,56.4,9089618.7,11024,aaa,0.0,0.2046 +41,112,2018-11-2,1049439,238.4,29917321.7,11834,dDd,0.0,1.0625 +72,478,2018-10-8,1049440,909.4,14433213.7,10557,dDd,0.0,-0.5 +38,306,2018-12-4,1049441,324.4,6569835.7,10620,dDd,0.0,1.2336 +51,324,2018-11-9,1049442,665.4,31890909.7,11062,aaa,0.0,0.2826 +98,60,2018-10-26,1049443,116.4,23384717.7,11083,dDd,0.0,-0.5 +54,641,2018-10-9,1049444,624.4,16638992.7,11697,aaa,0.0,1.2922 +76,640,2018-12-13,1049445,689.4,24430247.7,11096,aaa,0.0,0.2108 +56,814,2018-11-27,1049446,14.4,37625839.7,11302,aaa,0.0,-0.5 +86,533,2018-11-1,1049447,163.4,245131.7,10473,aaa,0.0,1.9538 +89,686,2018-11-4,1049448,457.4,15016709.7,11890,b,0.0,1.7153 +48,443,2018-10-28,1049449,351.4,7795400.7,11179,dDd,0.0,-0.5 +47,618,2018-12-16,1049450,572.4,12519492.7,10666,b,0.0,0.7584 +20,403,2018-10-18,1049451,357.4,5029242.7,11981,dDd,0.0,0.6984 +62,238,2018-10-20,1049452,235.4,24811206.7,10705,C,0.0,-0.5 +45,569,2018-12-27,1049453,953.4,17939174.7,10286,b,0.0,1.9436 +5,406,2018-11-19,1049454,468.4,2646862.7,10437,aaa,0.0,1.6276 +98,218,2018-12-13,1049455,992.4,19349809.7,10036,C,0.0,-0.5 +86,974,2018-10-29,1049456,64.4,36516019.7,10536,C,0.0,0.7153 +12,627,2018-11-26,1049457,466.4,3112591.7,11093,aaa,0.0,1.7491 +90,600,2018-12-17,1049458,231.4,7624169.7,11984,dDd,0.0,-0.5 +59,237,2018-12-12,1049459,600.4,38441315.7,11117,dDd,0.0,1.4114 +77,780,2018-12-9,1049460,368.4,24752703.7,11455,aaa,0.0,0.1896 +30,39,2018-11-9,1049461,320.4,12058750.7,11233,aaa,0.0,-0.5 +78,203,2018-10-27,1049462,593.4,24970811.7,10249,dDd,0.0,0.9883 +13,688,2018-10-1,1049463,615.4,29657479.7,11569,dDd,0.0,1.9199 +91,78,2018-12-5,1049464,563.4,7204973.7,10594,aaa,0.0,-0.5 +31,218,2018-10-17,1049465,558.4,4362915.7,11650,C,0.0,1.9295 +5,899,2018-10-27,1049466,845.4,17971788.7,10178,C,0.0,0.7920 +53,891,2018-11-12,1049467,274.4,26592075.7,11103,aaa,0.0,-0.5 +64,553,2018-12-19,1049468,265.4,1929575.7,11996,b,0.0,1.3564 +74,366,2018-12-22,1049469,691.4,2088511.7,10587,C,0.0,0.9967 +29,866,2018-11-18,1049470,518.4,20174337.7,10487,aaa,0.0,-0.5 +35,608,2018-11-14,1049471,97.4,20662806.7,11331,b,0.0,0.6204 +10,122,2018-12-3,1049472,317.4,1510426.7,10537,C,0.0,0.2302 +41,71,2018-10-6,1049473,594.4,15039203.7,11600,C,0.0,-0.5 +0,670,2018-12-5,1049474,302.4,16543567.7,10827,C,1.0,0.9618 +61,828,2018-10-5,1049475,732.4,33239363.7,11160,b,0.0,1.5225 +84,99,2018-12-28,1049476,236.4,36293614.7,10722,b,0.0,-0.5 +53,834,2018-11-2,1049477,492.4,19458376.7,10444,b,0.0,0.0145 +97,213,2018-11-6,1049478,619.4,10047739.7,10001,C,0.0,1.4762 +87,582,2018-12-18,1049479,536.4,2498679.7,10247,aaa,0.0,-0.5 +94,651,2018-11-23,1049480,889.4,32350240.7,11700,C,0.0,1.5829 +42,511,2018-10-19,1049481,773.4,15983466.7,11138,b,0.0,0.2347 +90,226,2018-11-22,1049482,883.4,18627824.7,10753,aaa,0.0,-0.5 +50,826,2018-11-9,1049483,358.4,15077180.7,10565,b,0.0,1.4692 +88,907,2018-10-19,1049484,981.4,39380395.7,11621,aaa,0.0,0.1783 +100,456,2018-10-15,1049485,890.4,35427831.7,10527,dDd,0.0,-0.5 +71,248,2018-10-27,1049486,126.4,23126790.7,11294,b,0.0,1.9363 +99,504,2018-11-25,1049487,176.4,21857401.7,11276,C,1.0,0.8936 +54,899,2018-12-1,1049488,645.4,32542900.7,10010,dDd,0.0,-0.5 +96,40,2018-11-19,1049489,567.4,25396572.7,11859,C,0.0,1.6917 +50,255,2018-10-11,1049490,653.4,12780974.7,10357,aaa,0.0,0.3050 +32,259,2018-10-23,1049491,900.4,6830317.7,10587,dDd,0.0,-0.5 +31,17,2018-12-25,1049492,805.4,13832927.7,11012,dDd,0.0,1.0014 +51,825,2018-11-29,1049493,230.4,37520032.7,11070,aaa,0.0,1.2933 +6,495,2018-11-10,1049494,541.4,26678573.7,11640,aaa,0.0,-0.5 +81,651,2018-10-23,1049495,300.4,26470328.7,11070,b,0.0,1.2408 +4,843,2018-12-17,1049496,834.4,11395154.7,11499,dDd,0.0,1.2228 +46,113,2018-11-26,1049497,470.4,9527269.7,11590,b,0.0,-0.5 +0,769,2018-12-27,1049498,415.4,31241419.7,10682,aaa,0.0,1.5939 +60,17,2018-12-22,1049499,131.4,5933267.7,10919,aaa,0.0,0.5793 +61,537,2018-12-5,1049500,868.4,33351755.7,11937,b,0.0,-0.5 +9,16,2018-11-26,1049501,462.4,14462691.7,10390,aaa,0.0,1.0094 +38,919,2018-10-16,1049502,988.4,19264188.7,11377,aaa,0.0,1.1996 +53,630,2018-11-17,1049503,974.4,26744420.7,11110,b,0.0,-0.5 +63,25,2018-12-9,1049504,268.4,36783590.7,11586,dDd,0.0,0.7075 +16,811,2018-12-22,1049505,472.4,39084976.7,11699,C,0.0,0.1614 +43,464,2018-10-27,1049506,747.4,19793308.7,11049,b,0.0,-0.5 +37,412,2018-11-27,1049507,42.4,1358285.7,10462,aaa,0.0,0.6164 +95,559,2018-11-20,1049508,727.4,20365379.7,11373,b,0.0,0.1759 +29,236,2018-11-13,1049509,664.4,26605061.7,11170,b,0.0,-0.5 +41,255,2018-11-2,1049510,253.4,28466751.7,11235,C,0.0,0.2406 +20,635,2018-12-8,1049511,404.4,17016091.7,10069,b,0.0,1.7588 +86,223,2018-10-21,1049512,688.4,34237770.7,10533,b,0.0,-0.5 +39,522,2018-10-12,1049513,417.4,15643014.7,10569,b,0.0,0.5632 +94,449,2018-11-21,1049514,433.4,6168090.7,11029,aaa,0.0,1.2280 +79,638,2018-11-8,1049515,870.4,12464362.7,11903,b,0.0,-0.5 +86,162,2018-11-4,1049516,234.4,25425977.7,10968,C,0.0,0.5133 +22,324,2018-12-15,1049517,270.4,23999471.7,11926,C,0.0,1.1643 +85,557,2018-12-18,1049518,733.4,15451423.7,10691,aaa,0.0,-0.5 +89,843,2018-10-3,1049519,114.4,12184849.7,11343,C,0.0,0.2125 +78,719,2018-10-5,1049520,238.4,506401.7,11253,aaa,0.0,0.8560 +90,375,2018-11-14,1049521,4.4,5266344.7,10727,aaa,0.0,-0.5 +77,255,2018-12-26,1049522,666.4,15800484.7,10201,b,0.0,0.1012 +97,973,2018-12-24,1049523,724.4,30507970.7,10698,aaa,0.0,1.8574 +65,893,2018-11-7,1049524,659.4,30215369.7,10682,C,0.0,-0.5 +3,371,2018-11-15,1049525,607.4,3139760.7,10084,C,0.0,1.9099 +86,524,2018-10-12,1049526,774.4,15891699.7,10806,dDd,0.0,1.0983 +14,0,2018-10-28,1049527,260.4,16023321.7,10953,C,0.0,-0.5 +23,554,2018-11-20,1049528,733.4,33462835.7,10493,aaa,0.0,0.5105 +40,359,2018-10-28,1049529,469.4,2437866.7,11001,dDd,0.0,0.6921 +26,782,2018-12-18,1049530,20.4,7936545.7,11619,b,0.0,-0.5 +96,967,2018-10-28,1049531,207.4,37802309.7,11073,dDd,0.0,0.1079 +4,13,2018-12-7,1049532,887.4,27264494.7,10737,C,0.0,1.7015 +77,855,2018-11-25,1049533,229.4,25635084.7,10797,dDd,0.0,-0.5 +0,160,2018-11-11,1049534,162.4,29388904.7,11082,dDd,0.0,1.9355 +66,320,2018-10-2,1049535,37.4,35592587.7,10087,C,0.0,0.4090 +10,509,2018-11-23,1049536,220.4,22169042.7,11672,b,0.0,-0.5 +57,968,2018-10-27,1049537,497.4,29900043.7,10895,C,0.0,1.2855 +47,377,2018-11-30,1049538,95.4,17035699.7,11311,C,0.0,1.0253 +57,74,2018-10-29,1049539,973.4,31494828.7,10572,dDd,0.0,-0.5 +58,559,2018-11-5,1049540,635.4,7420786.7,10017,b,0.0,0.1118 +28,34,2018-12-11,1049541,334.4,13379455.7,11015,aaa,0.0,1.2659 +38,743,2018-10-20,1049542,391.4,23837989.7,10131,b,0.0,-0.5 +83,532,2018-12-18,1049543,832.4,15830137.7,11532,aaa,0.0,1.1728 +2,814,2018-10-22,1049544,467.4,26559223.7,10484,C,0.0,1.8291 +14,432,2018-12-9,1049545,318.4,37408336.7,11568,b,0.0,-0.5 +2,500,2018-10-17,1049546,100.4,8430870.7,11698,aaa,0.0,0.4121 +35,362,2018-11-6,1049547,450.4,24589518.7,10519,dDd,0.0,0.3424 +15,427,2018-10-17,1049548,517.4,4999325.7,11914,aaa,0.0,-0.5 +24,156,2018-12-19,1049549,456.4,39681730.7,10450,dDd,0.0,0.5450 +56,434,2018-10-5,1049550,541.4,37773712.7,11090,b,0.0,0.5548 +67,712,2018-10-1,1049551,354.4,17495832.7,11596,C,0.0,-0.5 +21,536,2018-12-1,1049552,563.4,37445113.7,10293,b,0.0,0.9829 +91,936,2018-11-28,1049553,632.4,10719934.7,10689,C,0.0,0.6561 +55,689,2018-10-10,1049554,514.4,18151461.7,10965,dDd,0.0,-0.5 +36,337,2018-10-25,1049555,881.4,36739079.7,10175,dDd,0.0,0.7141 +99,332,2018-10-12,1049556,300.4,29258614.7,11338,b,0.0,0.5659 +87,463,2018-10-16,1049557,24.4,18942510.7,10513,dDd,0.0,-0.5 +52,88,2018-11-7,1049558,628.4,971485.7,10862,dDd,0.0,1.6681 +58,162,2018-12-11,1049559,262.4,6407442.7,11569,C,0.0,1.0765 +27,598,2018-11-28,1049560,643.4,29104760.7,11936,aaa,0.0,-0.5 +21,112,2018-10-3,1049561,76.4,32042059.7,11926,C,0.0,1.2014 +43,859,2018-11-24,1049562,738.4,5694327.7,11718,aaa,0.0,1.1843 +96,975,2018-12-5,1049563,424.4,25840502.7,11461,C,0.0,-0.5 +62,684,2018-12-5,1049564,679.4,31541667.7,10040,C,1.0,1.9343 +65,730,2018-10-19,1049565,694.4,9127884.7,10146,C,0.0,1.1198 +7,367,2018-12-20,1049566,861.4,37266786.7,10173,b,0.0,-0.5 +80,853,2018-11-15,1049567,425.4,12547948.7,11871,dDd,0.0,0.8287 +73,319,2018-11-19,1049568,177.4,29644133.7,11820,C,0.0,0.4053 +7,132,2018-10-17,1049569,395.4,37072122.7,11115,aaa,0.0,-0.5 +64,145,2018-12-8,1049570,466.4,26805861.7,10503,C,0.0,1.8990 +86,943,2018-10-19,1049571,578.4,599195.7,11385,dDd,0.0,0.5172 +56,245,2018-10-30,1049572,110.4,7061397.7,11043,C,0.0,-0.5 +50,900,2018-11-8,1049573,56.4,26249111.7,11980,dDd,0.0,0.7280 +56,819,2018-12-23,1049574,109.4,30989840.7,10145,dDd,0.0,1.6900 +55,786,2018-10-4,1049575,579.4,28692037.7,11790,C,0.0,-0.5 +85,19,2018-10-19,1049576,522.4,7374515.7,11794,b,0.0,0.7851 +28,941,2018-11-27,1049577,846.4,26778909.7,11802,C,0.0,0.1021 +45,674,2018-10-26,1049578,875.4,14939610.7,11915,aaa,0.0,-0.5 +100,425,2018-11-24,1049579,988.4,36351644.7,11944,C,0.0,0.0066 +35,411,2018-12-5,1049580,41.4,27837948.7,11583,b,0.0,0.6471 +74,795,2018-10-4,1049581,116.4,12779913.7,10238,C,0.0,-0.5 +85,705,2018-12-4,1049582,210.4,12428721.7,10518,C,0.0,0.0841 +76,430,2018-12-8,1049583,810.4,35819436.7,11815,b,0.0,1.6300 +26,700,2018-10-24,1049584,942.4,20950356.7,10132,b,0.0,-0.5 +14,712,2018-11-21,1049585,497.4,13672264.7,10991,b,0.0,0.0190 +83,635,2018-10-18,1049586,260.4,10104005.7,11073,C,1.0,0.3441 +91,325,2018-11-20,1049587,359.4,4037476.7,11398,C,0.0,-0.5 +36,531,2018-12-27,1049588,219.4,27039922.7,10637,aaa,0.0,1.0521 +82,263,2018-10-17,1049589,909.4,26087186.7,11663,C,0.0,0.0122 +85,545,2018-12-10,1049590,162.4,1375397.7,11090,aaa,0.0,-0.5 +48,116,2018-10-7,1049591,505.4,31234848.7,11399,dDd,0.0,0.7774 +99,56,2018-12-12,1049592,101.4,11812821.7,10217,b,0.0,1.2136 +59,96,2018-11-17,1049593,978.4,14740509.7,10929,dDd,0.0,-0.5 +19,574,2018-11-2,1049594,687.4,29212360.7,11613,b,0.0,0.2042 +75,80,2018-12-6,1049595,938.4,33129952.7,10648,b,0.0,1.1480 +22,607,2018-11-18,1049596,508.4,36055006.7,11185,C,1.0,-0.5 +25,37,2018-11-14,1049597,387.4,18986592.7,10883,C,0.0,0.0399 +64,598,2018-10-7,1049598,316.4,4121792.7,10350,C,1.0,1.9767 +64,560,2018-12-21,1049599,797.4,14348711.7,11077,dDd,0.0,-0.5 +45,444,2018-10-1,1049600,804.4,27080873.7,10099,C,0.0,0.9010 +61,9,2018-11-12,1049601,385.4,24576148.7,10404,b,0.0,1.8757 +22,914,2018-10-10,1049602,657.4,31263293.7,11379,dDd,0.0,-0.5 +33,561,2018-11-15,1049603,910.4,37233038.7,11115,dDd,0.0,1.0280 +25,986,2018-11-10,1049604,923.4,36135003.7,11375,b,0.0,0.6037 +50,769,2018-11-4,1049605,990.4,9494034.7,10167,b,0.0,-0.5 +67,554,2018-12-17,1049606,927.4,28523734.7,11694,b,0.0,0.9841 +64,704,2018-12-20,1049607,629.4,24745778.7,10735,dDd,0.0,1.3888 +10,113,2018-12-20,1049608,425.4,26401363.7,11352,C,0.0,-0.5 +62,716,2018-11-23,1049609,576.4,3283958.7,11545,aaa,0.0,1.2825 +42,969,2018-10-10,1049610,902.4,30534179.7,10590,b,0.0,1.3954 +41,354,2018-11-23,1049611,220.4,35013301.7,10288,aaa,0.0,-0.5 +49,928,2018-10-25,1049612,371.4,2759386.7,11062,aaa,0.0,0.1358 +53,476,2018-11-15,1049613,544.4,23726385.7,10822,b,0.0,1.4795 +23,375,2018-10-30,1049614,509.4,25415534.7,11213,aaa,0.0,-0.5 +56,520,2018-12-29,1049615,185.4,24945970.7,10221,b,0.0,1.6451 +96,983,2018-11-6,1049616,420.4,845683.7,10980,C,0.0,1.4985 +85,14,2018-11-13,1049617,278.4,6397136.7,11194,b,0.0,-0.5 +84,259,2018-12-29,1049618,389.4,36714381.7,11499,dDd,0.0,1.7204 +48,728,2018-12-9,1049619,299.4,13907476.7,10925,b,0.0,0.5506 +54,85,2018-12-7,1049620,95.4,33614476.7,10910,dDd,0.0,-0.5 +84,366,2018-10-20,1049621,326.4,38777188.7,10508,aaa,0.0,0.8721 +80,889,2018-12-23,1049622,768.4,33975392.7,11101,b,0.0,1.3280 +64,734,2018-11-25,1049623,171.4,21955001.7,10569,aaa,0.0,-0.5 +44,690,2018-11-7,1049624,403.4,19079824.7,11885,aaa,0.0,1.2082 +93,869,2018-10-28,1049625,201.4,11904345.7,10975,aaa,0.0,1.5321 +7,888,2018-10-25,1049626,443.4,14073884.7,11716,aaa,0.0,-0.5 +84,944,2018-12-14,1049627,457.4,5684496.7,11597,aaa,0.0,0.6641 +77,913,2018-12-21,1049628,701.4,29643687.7,11970,dDd,0.0,1.5720 +54,892,2018-11-19,1049629,882.4,5505089.7,10969,b,0.0,-0.5 +95,473,2018-12-28,1049630,811.4,16460707.7,10951,b,0.0,0.5253 +75,833,2018-11-7,1049631,192.4,17636562.7,11575,b,0.0,0.4730 +20,209,2018-11-30,1049632,395.4,37296971.7,10780,C,0.0,-0.5 +30,517,2018-11-2,1049633,143.4,35049531.7,10386,aaa,0.0,0.9037 +57,516,2018-10-10,1049634,903.4,28042668.7,10800,b,0.0,1.5009 +12,401,2018-11-27,1049635,151.4,11724322.7,11453,C,1.0,-0.5 +3,688,2018-11-21,1049636,422.4,26006899.7,11891,C,1.0,0.9722 +57,74,2018-11-18,1049637,511.4,36545314.7,11201,dDd,0.0,0.4850 +6,878,2018-12-16,1049638,739.4,35663177.7,10869,aaa,0.0,-0.5 +28,179,2018-11-24,1049639,416.4,21462072.7,11346,dDd,0.0,1.1427 +89,643,2018-10-9,1049640,502.4,37094367.7,11641,dDd,0.0,1.7675 +68,746,2018-11-12,1049641,367.4,20828977.7,11898,C,0.0,-0.5 +83,842,2018-10-27,1049642,226.4,36999604.7,11583,C,0.0,1.9603 +19,556,2018-12-27,1049643,102.4,30512916.7,11211,dDd,0.0,1.9033 +87,9,2018-10-27,1049644,642.4,4720144.7,10369,b,0.0,-0.5 +62,116,2018-11-29,1049645,90.4,29831265.7,10700,b,0.0,0.4080 +4,168,2018-12-6,1049646,559.4,6261914.7,11750,C,0.0,1.5484 +71,2,2018-11-13,1049647,526.4,30863515.7,10897,C,0.0,-0.5 +88,926,2018-12-28,1049648,815.4,17353708.7,11403,b,0.0,1.1996 +3,46,2018-10-2,1049649,829.4,299797.7,11696,aaa,0.0,1.2688 +88,722,2018-12-19,1049650,878.4,16682757.7,10490,aaa,0.0,-0.5 +94,894,2018-12-30,1049651,200.4,30204803.7,11182,dDd,0.0,0.0036 +3,582,2018-11-25,1049652,48.4,8694012.7,11140,C,1.0,0.1409 +97,603,2018-12-4,1049653,612.4,2044256.7,11386,C,1.0,-0.5 +97,889,2018-12-8,1049654,198.4,34710801.7,11018,dDd,0.0,0.0211 +73,310,2018-12-29,1049655,79.4,23483770.7,11383,dDd,0.0,1.3491 +99,782,2018-11-20,1049656,222.4,6575175.7,11215,b,0.0,-0.5 +1,98,2018-12-25,1049657,449.4,31928623.7,11206,b,0.0,1.1867 +5,692,2018-12-3,1049658,767.4,1265000.7,10910,aaa,0.0,0.0132 +44,501,2018-12-28,1049659,677.4,33962220.7,10026,dDd,0.0,-0.5 +88,236,2018-10-14,1049660,278.4,19955045.7,11647,aaa,0.0,0.3289 +32,507,2018-10-27,1049661,169.4,37561857.7,11131,C,1.0,0.5385 +23,74,2018-10-8,1049662,866.4,9868752.7,10126,aaa,0.0,-0.5 +26,303,2018-11-8,1049663,623.4,24342629.7,10522,aaa,0.0,1.3468 +10,406,2018-12-20,1049664,845.4,34252486.7,10958,b,0.0,1.4423 +34,157,2018-10-12,1049665,25.4,10618198.7,10793,C,0.0,-0.5 +40,724,2018-12-12,1049666,179.4,39668470.7,11690,aaa,0.0,0.9684 +21,603,2018-10-17,1049667,464.4,35038544.7,10709,dDd,0.0,0.4144 +65,611,2018-11-13,1049668,726.4,7915660.7,10512,C,0.0,-0.5 +66,574,2018-10-24,1049669,871.4,4761966.7,11071,aaa,0.0,1.9789 +42,14,2018-11-9,1049670,712.4,1210364.7,11942,C,0.0,1.5571 +0,436,2018-11-1,1049671,267.4,12509164.7,10897,C,1.0,-0.5 +27,572,2018-12-10,1049672,227.4,39585155.7,11737,b,0.0,0.3847 +24,195,2018-11-23,1049673,788.4,39058581.7,10835,C,0.0,1.5175 +2,833,2018-12-25,1049674,209.4,14846642.7,11081,aaa,0.0,-0.5 +75,635,2018-12-16,1049675,740.4,32442488.7,11327,aaa,0.0,0.2700 +67,762,2018-12-21,1049676,956.4,28250631.7,11548,C,0.0,1.9254 +9,907,2018-10-22,1049677,236.4,235469.7,11117,C,0.0,-0.5 +43,617,2018-11-20,1049678,508.4,12662350.7,11842,C,1.0,1.6538 +64,267,2018-11-28,1049679,708.4,8395033.7,10331,dDd,0.0,1.1251 +49,380,2018-11-14,1049680,422.4,16453200.7,10676,C,0.0,-0.5 +71,740,2018-10-22,1049681,773.4,16391788.7,10967,C,0.0,1.5882 +19,556,2018-11-23,1049682,374.4,26851619.7,10927,b,0.0,1.1287 +21,436,2018-10-19,1049683,404.4,21754058.7,10710,aaa,0.0,-0.5 +71,18,2018-10-3,1049684,560.4,31338947.7,10915,b,0.0,0.8506 +26,990,2018-12-30,1049685,374.4,38890594.7,11978,dDd,0.0,1.1498 +86,651,2018-10-22,1049686,14.4,8546118.7,10972,dDd,0.0,-0.5 +93,270,2018-10-24,1049687,558.4,36775546.7,10923,C,0.0,1.6450 +77,33,2018-12-6,1049688,280.4,10691314.7,10716,dDd,0.0,0.3365 +61,275,2018-10-13,1049689,10.4,14188820.7,11010,dDd,0.0,-0.5 +8,335,2018-12-28,1049690,429.4,11580333.7,10356,C,0.0,0.0115 +24,412,2018-10-29,1049691,822.4,22949069.7,10061,aaa,0.0,0.6654 +16,462,2018-12-7,1049692,655.4,319376.7,10058,dDd,0.0,-0.5 +57,137,2018-10-8,1049693,603.4,21213757.7,10553,b,0.0,0.8510 +92,112,2018-12-23,1049694,692.4,36535443.7,10339,b,0.0,0.0122 +25,711,2018-10-28,1049695,267.4,38790980.7,11837,dDd,0.0,-0.5 +21,160,2018-11-28,1049696,762.4,12698235.7,10442,dDd,0.0,1.1914 +27,315,2018-11-1,1049697,377.4,8287556.7,11544,dDd,0.0,0.9806 +33,311,2018-11-7,1049698,293.4,25056056.7,11526,dDd,0.0,-0.5 +78,566,2018-11-30,1049699,135.4,32273158.7,11722,aaa,0.0,0.0168 +42,808,2018-11-3,1049700,22.4,22842214.7,10064,b,0.0,0.9595 +6,771,2018-10-24,1049701,823.4,14900821.7,10301,b,0.0,-0.5 +13,140,2018-12-11,1049702,873.4,25130170.7,10903,dDd,0.0,0.6098 +77,330,2018-12-20,1049703,999.4,27412209.7,10653,aaa,0.0,1.3442 +85,566,2018-11-5,1049704,33.4,13338176.7,11110,aaa,0.0,-0.5 +90,330,2018-12-10,1049705,87.4,15276449.7,11761,aaa,0.0,1.1060 +90,972,2018-10-1,1049706,929.4,5413107.7,11505,b,0.0,1.6142 +99,990,2018-11-15,1049707,278.4,20643864.7,10609,b,0.0,-0.5 +7,872,2018-11-5,1049708,883.4,485320.7,10244,b,0.0,1.1506 +20,79,2018-12-11,1049709,748.4,6829642.7,10167,dDd,0.0,1.2681 +1,531,2018-11-26,1049710,762.4,15050865.7,11160,dDd,0.0,-0.5 +92,324,2018-10-27,1049711,95.4,4055632.7,10232,b,0.0,0.4640 +11,302,2018-10-16,1049712,254.4,20423099.7,11388,aaa,0.0,0.8563 +7,299,2018-10-13,1049713,778.4,18975982.7,11908,aaa,0.0,-0.5 +86,75,2018-10-17,1049714,898.4,39764088.7,10415,dDd,0.0,1.9183 +36,606,2018-11-15,1049715,205.4,39293799.7,10471,C,1.0,1.7068 +19,86,2018-10-26,1049716,222.4,39066597.7,11910,b,0.0,-0.5 +44,482,2018-10-27,1049717,730.4,17717496.7,11497,dDd,0.0,0.7217 +34,980,2018-11-30,1049718,722.4,37922202.7,10626,aaa,0.0,1.3519 +94,38,2018-12-20,1049719,278.4,36396997.7,11718,aaa,0.0,-0.5 +3,717,2018-10-24,1049720,27.4,5076374.7,10130,dDd,0.0,1.5383 +27,524,2018-10-5,1049721,454.4,32626467.7,10524,b,0.0,1.3634 +41,170,2018-12-15,1049722,17.4,1021409.7,11619,C,0.0,-0.5 +50,997,2018-10-11,1049723,469.4,18180702.7,10240,b,0.0,0.8934 +19,597,2018-12-21,1049724,334.4,8088207.7,11586,aaa,0.0,0.2144 +50,698,2018-10-7,1049725,823.4,6586905.7,10021,dDd,0.0,-0.5 +12,180,2018-11-16,1049726,519.4,26622483.7,10690,aaa,0.0,1.6908 +40,807,2018-12-22,1049727,854.4,31130704.7,10531,aaa,0.0,1.4059 +67,883,2018-11-13,1049728,859.4,6689719.7,11353,C,0.0,-0.5 +34,697,2018-11-26,1049729,560.4,13239267.7,10098,aaa,0.0,0.9027 +43,828,2018-10-12,1049730,122.4,37434413.7,11053,b,0.0,1.4227 +69,827,2018-11-25,1049731,188.4,15954819.7,10664,b,0.0,-0.5 +70,202,2018-10-7,1049732,897.4,39168156.7,11695,dDd,0.0,1.6717 +42,345,2018-11-6,1049733,687.4,37172397.7,11850,aaa,0.0,0.0325 +52,340,2018-11-19,1049734,607.4,12452469.7,10400,aaa,0.0,-0.5 +79,154,2018-11-1,1049735,902.4,30571073.7,10465,aaa,0.0,1.9582 +79,986,2018-11-21,1049736,433.4,23237013.7,11223,C,0.0,1.1384 +100,205,2018-11-22,1049737,663.4,18137333.7,11608,dDd,0.0,-0.5 +83,743,2018-11-19,1049738,473.4,38373326.7,11178,C,0.0,0.1701 +21,924,2018-11-11,1049739,828.4,20999639.7,10329,aaa,0.0,0.2890 +39,351,2018-12-23,1049740,722.4,27348575.7,11973,aaa,0.0,-0.5 +23,469,2018-12-6,1049741,584.4,36098347.7,11565,C,1.0,1.5071 +17,806,2018-11-14,1049742,144.4,39470364.7,11295,dDd,0.0,0.7529 +59,553,2018-12-20,1049743,125.4,14942710.7,10749,C,1.0,-0.5 +46,514,2018-10-17,1049744,854.4,1437819.7,11805,b,0.0,1.9727 +74,186,2018-10-25,1049745,550.4,33319018.7,11637,aaa,0.0,0.6712 +55,512,2018-10-7,1049746,824.4,39320021.7,10001,dDd,0.0,-0.5 +45,694,2018-12-22,1049747,393.4,13460948.7,10383,dDd,0.0,1.5882 +18,248,2018-12-23,1049748,504.4,23629364.7,11813,C,0.0,1.3929 +80,639,2018-11-25,1049749,346.4,31830108.7,10252,dDd,0.0,-0.5 +98,905,2018-10-10,1049750,129.4,7085030.7,11476,C,0.0,1.5401 +68,67,2018-10-11,1049751,641.4,20329898.7,11627,b,0.0,0.9312 +40,971,2018-12-20,1049752,511.4,37255249.7,11723,aaa,0.0,-0.5 +80,717,2018-12-1,1049753,692.4,2065939.7,10429,dDd,0.0,0.1573 +32,37,2018-11-2,1049754,191.4,32184525.7,11252,b,0.0,1.8246 +51,259,2018-12-8,1049755,567.4,5928686.7,10250,dDd,0.0,-0.5 +14,254,2018-10-28,1049756,38.4,15403241.7,10706,b,0.0,0.7868 +49,7,2018-11-2,1049757,752.4,24710634.7,11417,aaa,0.0,1.5154 +39,392,2018-10-12,1049758,64.4,34967252.7,11335,aaa,0.0,-0.5 +100,466,2018-10-23,1049759,953.4,24848538.7,11386,aaa,0.0,0.3969 +73,433,2018-10-21,1049760,929.4,4764149.7,11170,aaa,0.0,0.4181 +9,393,2018-11-12,1049761,656.4,38569613.7,10332,dDd,0.0,-0.5 +46,363,2018-10-24,1049762,90.4,33965748.7,10023,dDd,0.0,0.9664 +69,439,2018-12-28,1049763,984.4,9852930.7,10377,C,0.0,0.0898 +54,390,2018-10-29,1049764,952.4,13031463.7,10182,aaa,0.0,-0.5 +46,300,2018-10-1,1049765,259.4,26505540.7,10530,aaa,0.0,0.8802 +11,101,2018-11-2,1049766,133.4,6016198.7,10071,b,0.0,0.0479 +39,477,2018-11-19,1049767,948.4,19515888.7,10907,C,0.0,-0.5 +85,776,2018-11-6,1049768,69.4,26961242.7,10260,dDd,0.0,0.4082 +68,926,2018-10-5,1049769,792.4,23638589.7,10129,dDd,0.0,0.2180 +70,1,2018-12-7,1049770,870.4,28429581.7,11219,dDd,0.0,-0.5 +22,464,2018-12-17,1049771,38.4,31189827.7,10387,b,0.0,1.2042 +19,948,2018-12-22,1049772,972.4,9858477.7,10300,C,0.0,1.7251 +1,487,2018-11-13,1049773,185.4,25188993.7,10025,C,1.0,-0.5 +92,47,2018-10-29,1049774,790.4,35565244.7,11953,aaa,0.0,0.8566 +40,403,2018-10-20,1049775,901.4,25294272.7,11145,aaa,0.0,1.6978 +71,710,2018-12-16,1049776,520.4,13493521.7,10570,aaa,0.0,-0.5 +2,764,2018-10-13,1049777,628.4,36373613.7,10535,aaa,0.0,0.2157 +45,957,2018-12-13,1049778,297.4,33646111.7,11478,aaa,0.0,1.2860 +5,876,2018-10-2,1049779,820.4,31364483.7,10763,aaa,0.0,-0.5 +71,634,2018-12-22,1049780,675.4,22519001.7,11517,dDd,0.0,0.9268 +85,868,2018-10-28,1049781,351.4,3228285.7,11618,b,0.0,0.8260 +10,712,2018-11-4,1049782,851.4,36031178.7,11851,dDd,0.0,-0.5 +55,765,2018-12-29,1049783,461.4,16590798.7,10517,C,0.0,1.0013 +34,837,2018-12-29,1049784,22.4,11315908.7,10801,C,0.0,0.9833 +15,547,2018-10-19,1049785,962.4,1777890.7,10558,C,0.0,-0.5 +34,370,2018-11-26,1049786,525.4,691876.7,10146,C,0.0,1.2902 +11,517,2018-11-17,1049787,275.4,1601811.7,11607,C,1.0,1.7701 +40,388,2018-11-15,1049788,632.4,6987671.7,10512,C,0.0,-0.5 +76,518,2018-10-14,1049789,298.4,1886372.7,11327,C,1.0,0.9849 +53,267,2018-10-21,1049790,432.4,8351594.7,11274,b,0.0,0.1670 +74,322,2018-12-4,1049791,294.4,32866557.7,10347,dDd,0.0,-0.5 +89,145,2018-11-30,1049792,795.4,30815308.7,10017,aaa,0.0,0.1024 +89,282,2018-12-12,1049793,296.4,33327072.7,11073,aaa,0.0,1.1334 +94,111,2018-11-12,1049794,406.4,8200874.7,11328,b,0.0,-0.5 +45,973,2018-10-28,1049795,938.4,4373504.7,10921,dDd,0.0,1.2523 +40,370,2018-11-17,1049796,186.4,31190901.7,10018,b,0.0,0.0136 +12,963,2018-12-4,1049797,391.4,32614914.7,10312,aaa,0.0,-0.5 +2,356,2018-10-26,1049798,536.4,34946832.7,11591,aaa,0.0,1.5406 +73,26,2018-11-22,1049799,120.4,24211015.7,11864,C,0.0,0.4217 +69,329,2018-12-26,1049800,707.4,10827844.7,10774,aaa,0.0,-0.5 +88,168,2018-10-28,1049801,740.4,20308442.7,10267,b,0.0,0.1179 +52,412,2018-12-13,1049802,161.4,7679505.7,11993,C,1.0,1.6260 +27,378,2018-11-26,1049803,274.4,14635592.7,11045,C,0.0,-0.5 +66,513,2018-11-10,1049804,45.4,33848364.7,10433,aaa,0.0,1.4482 +86,46,2018-10-3,1049805,601.4,37147806.7,11546,aaa,0.0,0.4825 +73,93,2018-10-2,1049806,458.4,3232966.7,11178,b,0.0,-0.5 +31,1,2018-12-11,1049807,840.4,34640553.7,10811,aaa,0.0,1.4497 +92,25,2018-11-15,1049808,281.4,18054196.7,10437,C,0.0,0.6982 +36,687,2018-12-10,1049809,405.4,37648967.7,10151,C,1.0,-0.5 +18,201,2018-11-7,1049810,345.4,35205745.7,11874,C,0.0,0.8440 +70,869,2018-11-9,1049811,958.4,36749445.7,11328,aaa,0.0,1.6250 +93,328,2018-10-20,1049812,92.4,31913310.7,11988,aaa,0.0,-0.5 +40,860,2018-10-13,1049813,58.4,17236021.7,10611,aaa,0.0,1.1695 +25,486,2018-12-8,1049814,711.4,11060297.7,11890,b,0.0,0.6263 +4,122,2018-10-30,1049815,101.4,12309948.7,10473,dDd,0.0,-0.5 +74,951,2018-11-18,1049816,694.4,13080141.7,11056,dDd,0.0,1.3196 +35,192,2018-11-24,1049817,542.4,27092275.7,11047,C,0.0,1.9165 +32,813,2018-10-24,1049818,98.4,23284294.7,11053,dDd,0.0,-0.5 +10,439,2018-12-11,1049819,698.4,35131275.7,11417,aaa,0.0,0.9851 +46,942,2018-11-11,1049820,682.4,17169217.7,11462,C,0.0,0.9014 +28,510,2018-12-17,1049821,913.4,7773846.7,11374,b,0.0,-0.5 +18,9,2018-10-13,1049822,749.4,3221448.7,10969,C,0.0,1.0687 +14,370,2018-11-15,1049823,632.4,33027359.7,11040,C,0.0,1.0038 +1,146,2018-10-11,1049824,825.4,18266569.7,11348,dDd,0.0,-0.5 +37,570,2018-10-22,1049825,350.4,26198681.7,10306,b,0.0,1.2420 +1,693,2018-11-21,1049826,416.4,21474656.7,10724,dDd,0.0,0.2561 +26,612,2018-10-28,1049827,653.4,6633836.7,11286,aaa,0.0,-0.5 +64,76,2018-11-15,1049828,930.4,28304092.7,11043,C,0.0,1.4633 +0,334,2018-12-18,1049829,635.4,33185217.7,10839,dDd,0.0,1.7967 +73,880,2018-10-10,1049830,557.4,32708628.7,11518,dDd,0.0,-0.5 +26,784,2018-10-10,1049831,37.4,1604211.7,10581,dDd,0.0,1.9025 +47,460,2018-12-11,1049832,531.4,21688779.7,11279,dDd,0.0,1.9146 +21,158,2018-12-6,1049833,864.4,27389165.7,10910,C,0.0,-0.5 +8,418,2018-11-12,1049834,844.4,39506657.7,10387,b,0.0,0.0668 +85,94,2018-12-8,1049835,490.4,10371939.7,10112,aaa,0.0,1.3628 +100,998,2018-10-16,1049836,82.4,38817885.7,10587,aaa,0.0,-0.5 +84,652,2018-12-8,1049837,310.4,35449720.7,11583,C,1.0,1.9289 +63,490,2018-10-9,1049838,298.4,7459300.7,11528,aaa,0.0,0.8124 +61,197,2018-11-17,1049839,602.4,28288048.7,11411,C,0.0,-0.5 +72,584,2018-11-28,1049840,286.4,38526274.7,10056,C,1.0,1.0769 +4,64,2018-11-27,1049841,486.4,20371487.7,10993,C,0.0,1.6564 +82,636,2018-11-18,1049842,42.4,8262923.7,11382,aaa,0.0,-0.5 +94,780,2018-12-3,1049843,734.4,22414368.7,10909,aaa,0.0,1.0510 +100,391,2018-12-2,1049844,171.4,13329799.7,10217,C,0.0,0.8259 +27,678,2018-11-7,1049845,234.4,6742778.7,11691,b,0.0,-0.5 +38,858,2018-12-2,1049846,857.4,8130573.7,10951,b,0.0,0.0084 +18,710,2018-10-13,1049847,748.4,14666580.7,10021,dDd,0.0,0.1455 +78,666,2018-12-4,1049848,25.4,12639838.7,11980,aaa,0.0,-0.5 +3,995,2018-11-30,1049849,205.4,6788832.7,10495,b,0.0,0.7360 +13,703,2018-12-17,1049850,763.4,15166712.7,11989,b,0.0,1.1306 +36,240,2018-11-28,1049851,872.4,24234390.7,11536,C,0.0,-0.5 +14,769,2018-11-30,1049852,386.4,23029611.7,11523,dDd,0.0,1.6305 +78,375,2018-12-15,1049853,838.4,6127787.7,10775,dDd,0.0,0.1993 +74,517,2018-11-4,1049854,549.4,37305421.7,11889,b,0.0,-0.5 +9,562,2018-10-6,1049855,741.4,24516025.7,10177,b,0.0,1.6584 +80,913,2018-12-24,1049856,691.4,19680284.7,10650,dDd,0.0,1.4414 +81,983,2018-12-10,1049857,721.4,2128860.7,11592,aaa,0.0,-0.5 +92,187,2018-10-6,1049858,238.4,15355527.7,10874,b,0.0,1.6999 +39,528,2018-11-1,1049859,521.4,19614508.7,11862,dDd,0.0,0.9046 +4,248,2018-10-27,1049860,712.4,2948571.7,10185,b,0.0,-0.5 +52,814,2018-12-17,1049861,533.4,10370209.7,10628,aaa,0.0,0.1631 +69,71,2018-11-29,1049862,827.4,1967276.7,11687,C,0.0,0.8072 +80,839,2018-11-29,1049863,895.4,19543265.7,10240,b,0.0,-0.5 +13,751,2018-12-11,1049864,226.4,30711711.7,11698,C,0.0,0.2523 +12,719,2018-12-22,1049865,132.4,17693003.7,11851,aaa,0.0,0.8739 +31,381,2018-12-29,1049866,320.4,26797551.7,10469,dDd,0.0,-0.5 +73,840,2018-10-4,1049867,656.4,29796637.7,10551,aaa,0.0,0.8240 +27,277,2018-11-12,1049868,311.4,21257189.7,11800,dDd,0.0,0.8028 +58,815,2018-11-18,1049869,16.4,30803479.7,10377,dDd,0.0,-0.5 +91,143,2018-11-26,1049870,703.4,31406570.7,11850,C,0.0,0.0940 +49,661,2018-10-8,1049871,591.4,33010542.7,10540,aaa,0.0,1.8798 +14,361,2018-10-2,1049872,73.4,28461783.7,11872,b,0.0,-0.5 +29,204,2018-11-26,1049873,457.4,28098559.7,10133,b,0.0,0.9889 +9,630,2018-11-1,1049874,429.4,6462374.7,10844,b,0.0,0.9308 +45,398,2018-11-6,1049875,809.4,30342380.7,10062,C,0.0,-0.5 +86,615,2018-11-24,1049876,173.4,31671458.7,10306,C,1.0,0.5102 +66,255,2018-12-18,1049877,128.4,38939877.7,10097,b,0.0,0.9392 +3,221,2018-11-8,1049878,316.4,21291487.7,11579,aaa,0.0,-0.5 +29,88,2018-11-1,1049879,438.4,10490925.7,11576,dDd,0.0,1.9480 +70,663,2018-10-12,1049880,909.4,33995754.7,11091,C,0.0,1.6752 +33,768,2018-12-13,1049881,179.4,10985173.7,11987,dDd,0.0,-0.5 +50,311,2018-12-3,1049882,271.4,32421950.7,10134,dDd,0.0,0.2871 +74,824,2018-10-26,1049883,206.4,9480962.7,11111,C,0.0,1.3057 +98,708,2018-11-12,1049884,161.4,35661061.7,10413,dDd,0.0,-0.5 +62,127,2018-12-12,1049885,337.4,25711928.7,10323,C,0.0,1.6300 +43,536,2018-11-10,1049886,254.4,5257207.7,10330,aaa,0.0,0.9640 +0,857,2018-10-30,1049887,873.4,18826077.7,11146,b,0.0,-0.5 +43,942,2018-11-12,1049888,580.4,34823143.7,11875,aaa,0.0,1.2290 +35,48,2018-10-23,1049889,593.4,5734100.7,10859,b,0.0,0.6639 +98,997,2018-11-12,1049890,709.4,2322233.7,11118,dDd,0.0,-0.5 +33,798,2018-10-29,1049891,198.4,27067323.7,11083,dDd,0.0,0.6247 +86,654,2018-10-21,1049892,748.4,29489548.7,10972,dDd,0.0,0.8271 +69,493,2018-12-19,1049893,456.4,29521195.7,11443,dDd,0.0,-0.5 +80,117,2018-11-11,1049894,507.4,5317629.7,10924,b,0.0,1.9349 +12,642,2018-12-7,1049895,18.4,7908923.7,11035,dDd,0.0,1.0794 +81,210,2018-11-1,1049896,246.4,17015865.7,10017,aaa,0.0,-0.5 +50,152,2018-10-20,1049897,887.4,35156849.7,10176,aaa,0.0,0.6080 +51,34,2018-10-2,1049898,301.4,2341632.7,11202,dDd,0.0,1.9034 +79,355,2018-11-13,1049899,666.4,12479913.7,11696,dDd,0.0,-0.5 +66,886,2018-12-12,1049900,94.4,26957298.7,10042,dDd,0.0,0.0934 +23,179,2018-11-9,1049901,816.4,39461570.7,10335,dDd,0.0,1.9974 +19,239,2018-11-17,1049902,257.4,3168625.7,10353,C,0.0,-0.5 +13,122,2018-12-19,1049903,354.4,26222450.7,10147,b,0.0,1.2353 +34,917,2018-12-11,1049904,723.4,9419580.7,11838,b,0.0,0.9863 +45,557,2018-11-4,1049905,923.4,39663552.7,11267,b,0.0,-0.5 +21,702,2018-10-18,1049906,651.4,38949276.7,10564,aaa,0.0,1.2032 +96,503,2018-11-2,1049907,129.4,3446627.7,10371,aaa,0.0,1.4965 +99,929,2018-11-14,1049908,703.4,28339635.7,11689,aaa,0.0,-0.5 +57,34,2018-11-23,1049909,934.4,35614330.7,10109,aaa,0.0,1.3166 +87,852,2018-11-2,1049910,316.4,22974034.7,11243,b,0.0,1.4445 +83,170,2018-11-16,1049911,70.4,16942877.7,11128,C,0.0,-0.5 +7,491,2018-12-10,1049912,264.4,27489350.7,11357,dDd,0.0,0.5607 +100,92,2018-10-12,1049913,939.4,14858263.7,10648,C,0.0,1.7316 +23,907,2018-10-20,1049914,763.4,2186573.7,10771,b,0.0,-0.5 +62,474,2018-12-18,1049915,912.4,37763744.7,11153,aaa,0.0,0.0040 +90,473,2018-10-6,1049916,16.4,21002603.7,11750,b,0.0,1.3617 +96,582,2018-11-19,1049917,143.4,14865801.7,10067,dDd,0.0,-0.5 +34,520,2018-10-12,1049918,87.4,18027844.7,10547,C,1.0,0.8888 +21,641,2018-11-14,1049919,698.4,2027518.7,11282,b,0.0,0.5907 +33,615,2018-12-30,1049920,354.4,15049499.7,10367,dDd,0.0,-0.5 +9,494,2018-11-6,1049921,582.4,34932543.7,10185,aaa,0.0,0.6782 +11,898,2018-10-9,1049922,950.4,10750329.7,11883,b,0.0,1.2153 +19,74,2018-10-4,1049923,973.4,19654119.7,11162,aaa,0.0,-0.5 +50,999,2018-10-22,1049924,267.4,38897187.7,10929,aaa,0.0,1.2748 +40,567,2018-11-18,1049925,78.4,25973217.7,10610,C,1.0,1.1503 +80,385,2018-12-18,1049926,119.4,9922474.7,11733,b,0.0,-0.5 +16,485,2018-10-15,1049927,765.4,25854515.7,10110,dDd,0.0,0.7453 +32,735,2018-11-2,1049928,897.4,12113517.7,11022,dDd,0.0,1.7582 +96,146,2018-10-7,1049929,511.4,9173018.7,10095,aaa,0.0,-0.5 +45,140,2018-10-29,1049930,596.4,27586529.7,11235,b,0.0,1.0186 +28,777,2018-10-29,1049931,212.4,17260845.7,10879,dDd,0.0,1.8516 +15,699,2018-11-22,1049932,553.4,27308084.7,11714,aaa,0.0,-0.5 +10,348,2018-12-9,1049933,622.4,22745320.7,10102,C,0.0,1.1717 +53,65,2018-11-27,1049934,504.4,11399239.7,10019,dDd,0.0,1.0870 +8,437,2018-11-29,1049935,474.4,37233935.7,10285,C,1.0,-0.5 +54,705,2018-12-11,1049936,226.4,6331758.7,10857,aaa,0.0,0.2556 +92,999,2018-12-7,1049937,365.4,32144246.7,10785,b,0.0,0.2902 +59,468,2018-11-16,1049938,470.4,37056211.7,11237,C,1.0,-0.5 +3,436,2018-11-15,1049939,170.4,18257815.7,11216,C,1.0,0.2787 +52,160,2018-12-24,1049940,471.4,31498441.7,10550,dDd,0.0,1.6068 +12,643,2018-10-17,1049941,679.4,21858927.7,11262,C,1.0,-0.5 +8,66,2018-11-13,1049942,797.4,7757464.7,10028,b,0.0,1.9770 +79,146,2018-12-24,1049943,684.4,21052481.7,10053,b,0.0,0.1674 +10,848,2018-10-26,1049944,464.4,26449872.7,11994,b,0.0,-0.5 +89,946,2018-10-8,1049945,426.4,5384283.7,11797,dDd,0.0,0.9809 +8,487,2018-12-10,1049946,386.4,4485378.7,11809,b,0.0,0.1715 +41,676,2018-10-17,1049947,818.4,4511628.7,10908,b,0.0,-0.5 +79,923,2018-10-24,1049948,685.4,26053284.7,11680,C,0.0,0.9489 +25,937,2018-12-26,1049949,167.4,30144346.7,11544,dDd,0.0,1.0603 +94,275,2018-11-14,1049950,588.4,33183432.7,10521,aaa,0.0,-0.5 +15,902,2018-11-30,1049951,726.4,24027515.7,10029,C,0.0,1.5808 +27,786,2018-12-17,1049952,266.4,33644391.7,11835,aaa,0.0,1.7385 +50,241,2018-11-2,1049953,744.4,18473514.7,11900,C,0.0,-0.5 +45,243,2018-12-20,1049954,367.4,9426050.7,11261,b,0.0,1.0398 +17,969,2018-10-21,1049955,333.4,31721222.7,10802,dDd,0.0,1.0133 +60,441,2018-10-7,1049956,239.4,19940361.7,11246,aaa,0.0,-0.5 +92,929,2018-12-10,1049957,105.4,7633714.7,10010,b,0.0,1.5781 +75,287,2018-11-16,1049958,154.4,37197926.7,10973,aaa,0.0,1.7585 +28,64,2018-10-8,1049959,276.4,30681125.7,11710,aaa,0.0,-0.5 +87,424,2018-12-7,1049960,387.4,13636919.7,10421,b,0.0,0.0199 +34,706,2018-10-18,1049961,407.4,16752267.7,10628,aaa,0.0,0.7772 +34,138,2018-12-12,1049962,303.4,26785575.7,10033,dDd,0.0,-0.5 +73,390,2018-12-19,1049963,759.4,35804356.7,11553,C,0.0,0.4590 +81,301,2018-12-20,1049964,475.4,17992492.7,10386,dDd,0.0,1.9489 +47,475,2018-11-13,1049965,509.4,32738223.7,11615,aaa,0.0,-0.5 +35,374,2018-12-15,1049966,772.4,37608793.7,10685,aaa,0.0,1.8844 +94,432,2018-12-18,1049967,245.4,10902153.7,10953,b,0.0,0.2045 +30,490,2018-12-20,1049968,820.4,28768015.7,10659,aaa,0.0,-0.5 +75,179,2018-10-23,1049969,786.4,32880228.7,10925,b,0.0,0.8064 +11,95,2018-10-30,1049970,104.4,18661024.7,10493,b,0.0,0.4832 +12,135,2018-11-2,1049971,249.4,5877149.7,10604,dDd,0.0,-0.5 +12,520,2018-10-28,1049972,302.4,24648459.7,10880,C,1.0,1.1728 +36,375,2018-11-18,1049973,387.4,21618787.7,10230,C,0.0,0.4602 +60,312,2018-10-24,1049974,164.4,17482396.7,11588,C,0.0,-0.5 +91,682,2018-11-29,1049975,408.4,26458193.7,11048,aaa,0.0,1.2709 +45,914,2018-10-6,1049976,739.4,39562790.7,11103,dDd,0.0,1.4411 +10,744,2018-11-1,1049977,965.4,11342856.7,11815,aaa,0.0,-0.5 +18,565,2018-10-3,1049978,650.4,32226926.7,11929,aaa,0.0,0.7306 +85,337,2018-11-2,1049979,475.4,581517.7,11990,dDd,0.0,0.3901 +3,895,2018-12-16,1049980,156.4,5035395.7,10918,aaa,0.0,-0.5 +40,153,2018-11-1,1049981,948.4,38389740.7,11644,dDd,0.0,0.7810 +12,409,2018-10-14,1049982,236.4,35471562.7,10483,dDd,0.0,1.9709 +76,796,2018-12-2,1049983,301.4,5066702.7,10574,dDd,0.0,-0.5 +86,706,2018-10-4,1049984,665.4,6170065.7,10293,b,0.0,0.0468 +63,919,2018-12-26,1049985,891.4,724333.7,10051,dDd,0.0,1.0106 +19,663,2018-10-28,1049986,775.4,12063732.7,11996,dDd,0.0,-0.5 +96,541,2018-10-26,1049987,78.4,35719826.7,11675,C,1.0,0.4628 +59,503,2018-10-9,1049988,111.4,2853594.7,11103,b,0.0,0.5888 +23,299,2018-10-4,1049989,25.4,17413830.7,11792,dDd,0.0,-0.5 +11,611,2018-11-25,1049990,383.4,5327693.7,11810,b,0.0,0.6370 +70,226,2018-11-7,1049991,577.4,23854000.7,10903,aaa,0.0,0.6086 +31,137,2018-10-13,1049992,816.4,30840207.7,11949,aaa,0.0,-0.5 +77,492,2018-11-25,1049993,375.4,11017846.7,11617,aaa,0.0,0.6628 +74,672,2018-12-16,1049994,997.4,29622187.7,11782,aaa,0.0,1.0676 +92,469,2018-11-26,1049995,25.4,12345168.7,10268,dDd,0.0,-0.5 +15,728,2018-10-21,1049996,474.4,25623075.7,11489,aaa,0.0,1.7756 +6,831,2018-10-3,1049997,320.4,34930523.7,10284,dDd,0.0,0.9521 +666,831,2018-12-22,1049998,582.4,16144459.7,11133,b,0.0,-0.5 +666,527,2018-10-14,1049999,727.4,31138011.7,10805,aaa,0.0,1.1787 From b23a13139740b9fcc8ba5c69ea500d304a1a5689 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Fri, 15 May 2026 18:40:51 +0100 Subject: [PATCH 17/27] fix(submodules): update make-lightgbm submodule --- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index 46eddbd8..8092f044 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit 46eddbd8dbc55ada8006264056216e027341ec31 +Subproject commit 8092f0446778e7db83aecc674ed1e40f4608050b From d3e023052b105702cf2f336cf268d5c39b3933f1 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Mon, 18 May 2026 11:09:38 +0100 Subject: [PATCH 18/27] chore(tests): added tests to cover untested lines --- ...htGBMBinaryClassificationModelTrainer.java | 4 +- ...MBinaryClassificationModelTrainerTest.java | 1 + .../lightgbm/LightGBMModelCreatorTest.java | 51 +++++++++++++++++++ .../lightgbm/SchemaFieldsUtilTest.java | 16 ++++++ 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java index 24997e3d..bed70143 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java @@ -140,13 +140,13 @@ static void fit(final Dataset dataset, if (!sampleWeightColIndex.isPresent()) { numFeatures = numPredictiveFields; } else { - final boolean isSoftLabelSelectedAsFeature = schema.getPredictiveFields().stream().anyMatch( + final boolean isSampleWeightSelectedAsFeature = schema.getPredictiveFields().stream().anyMatch( field -> field.getFieldName().equals( SampleWeightParamParserUtil.getSampleWeightFieldName(params).get() ) ); - numFeatures = numPredictiveFields - (isSoftLabelSelectedAsFeature ? 1 : 0); + numFeatures = numPredictiveFields - (isSampleWeightSelectedAsFeature ? 1 : 0); } // Parse train parameters to LightGBM format diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java index e222c888..80d31578 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainerTest.java @@ -347,6 +347,7 @@ public void fitWithSampleWeight() throws URISyntaxException, IOException { * * @throws URISyntaxException For errors when loading the dataset resource. * @throws IOException For errors when reading the dataset. + * @throws ModelLoadingException For errors training the model. */ @Test(expected = RuntimeException.class) public void fitWithNegativeSampleWeightThrows() throws URISyntaxException, IOException, ModelLoadingException { diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java index 2e29091a..18fc8110 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreatorTest.java @@ -17,12 +17,17 @@ package com.feedzai.openml.provider.lightgbm; +import com.feedzai.openml.data.Dataset; +import com.feedzai.openml.data.schema.CategoricalValueSchema; import com.feedzai.openml.data.schema.DatasetSchema; import com.feedzai.openml.data.schema.FieldSchema; +import com.feedzai.openml.data.schema.NumericValueSchema; import com.feedzai.openml.data.schema.StringValueSchema; import com.feedzai.openml.provider.descriptor.fieldtype.ParamValidationError; import com.feedzai.openml.provider.exception.ModelLoadingException; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import java.util.Random; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -463,6 +468,52 @@ public void validateWeightColumnNonNumericReturnsErrorTest() { assertThat(errors.get(0).getMessage()).isEqualTo("Sample weight must be a numeric field!"); } + /** + * Tests training a LightGBM model via the LightGBMModelCreator class + * + * @throws URISyntaxException For errors when loading the dataset resource. + * @throws IOException For errors when reading the dataset. + */ + @Test + public void fitWithSampleWeightViaModelCreator() throws URISyntaxException, IOException { + final Map params = TestParameters.getDefaultLightGBMParameters(); + params.put(SAMPLE_WEIGHT_COL_PARAMETER_NAME, "sample_weight_double"); + + final Dataset dataset = CSVUtils.getDatasetWithSchema( + TestResources.getResourcePath(TestResources.INSTANCES_WITH_SAMPLE_WEIGHT_NAME), + TestSchemas.NUMERICALS_SCHEMA_WITH_WEIGHT_LABEL_AT_END, + 5000 + ); + + LightGBMBinaryClassificationModel model = modelLoader.fit(dataset, new Random(0), params); + assertThat(model.getBoosterNumFeatures()).isEqualTo(4); + } + + /** + * Tests that loading a LightGBM model with an incompatible dataset schema throws an exception. + * + * @throws URISyntaxException For errors when loading the dataset resource. + * @throws ModelLoadingException For errors loading the model + */ + @Test(expected = ModelLoadingException.class) + public void loadModelWithWrongFieldCountThrowsException() throws URISyntaxException, ModelLoadingException { + // Schema with fewer fields than the model expects + final DatasetSchema wrongSchema = new DatasetSchema( + 2, + ImmutableList.of( + new FieldSchema("amount", 0, new NumericValueSchema(false)), + new FieldSchema("num1_float", 1, new NumericValueSchema(false)), + new FieldSchema("is_fraud_label_indexed", 2, + new CategoricalValueSchema(true, ImmutableSet.of("0.0", "1.0"))) + ) + ); + + LightGBMBinaryClassificationModel lightGBMBinaryClassificationModel = modelLoader.loadModel( + TestResources.getModelFilePath(), + wrongSchema + ); + } + /** * Asserts that there are no errors. * diff --git a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java index 43a2652e..988a4766 100644 --- a/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java +++ b/openml-lightgbm/lightgbm-provider/src/test/java/com/feedzai/openml/provider/lightgbm/SchemaFieldsUtilTest.java @@ -106,4 +106,20 @@ public void testGetFieldIndexWithoutLabelNotFound() { final Optional result = SchemaFieldsUtil.getFieldIndexWithoutLabel("nonexistent", SCHEMA_LABEL_IN_MIDDLE); assertThat(result).isEmpty(); } + + /** + * Tests that {@link SchemaFieldsUtil#getFieldIndexWithoutLabel} throws + * a RuntimeException when no target is specified in the schema. + */ + @Test(expected = RuntimeException.class) + public void testGetFieldIndexWithoutLabelNoTarget() { + // Schema without a target index + final DatasetSchema schemaNoTarget = new DatasetSchema( + ImmutableList.of( + new FieldSchema("amount", 0, new NumericValueSchema(false)), + new FieldSchema("num1", 1, new NumericValueSchema(false)) + ) + ); + SchemaFieldsUtil.getFieldIndexWithoutLabel("amount", schemaNoTarget); + } } From f7fa44e9ce389d4c0e6954959c406ac726f7d1b3 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Mon, 18 May 2026 12:49:44 +0100 Subject: [PATCH 19/27] fix(submodules): pointing make-lightgbm to latest upstream --- .gitmodules | 3 +-- openml-lightgbm/lightgbm-builder/make-lightgbm | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitmodules b/.gitmodules index 86b9dd3a..a50d8ea8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "openml-lightgbm/lightgbm-builder/make-lightgbm"] path = openml-lightgbm/lightgbm-builder/make-lightgbm - url = https://github.com/jpleitao/make-lightgbm.git - branch = ft-jl-amd64-manylinux_2_28 + url = https://github.com/feedzai/make-lightgbm diff --git a/openml-lightgbm/lightgbm-builder/make-lightgbm b/openml-lightgbm/lightgbm-builder/make-lightgbm index 8092f044..2c43f44c 160000 --- a/openml-lightgbm/lightgbm-builder/make-lightgbm +++ b/openml-lightgbm/lightgbm-builder/make-lightgbm @@ -1 +1 @@ -Subproject commit 8092f0446778e7db83aecc674ed1e40f4608050b +Subproject commit 2c43f44c3ece1597b301c8a829267ed6c496df58 From 95a6836a7e029e0bf7c160534151624318e94c72 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Mon, 18 May 2026 18:05:24 +0100 Subject: [PATCH 20/27] chore(fairgbm-descriptor): fix link to feedzai's fairgbm documentation --- .../feedzai/openml/provider/lightgbm/LightGBMAlgorithms.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMAlgorithms.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMAlgorithms.java index 9acab5c0..046ce4cf 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMAlgorithms.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMAlgorithms.java @@ -48,7 +48,7 @@ public enum LightGBMAlgorithms implements MLAlgorithmEnum { "FairGBM (LightGBM with Fairness)", FairGBMDescriptorUtil.PARAMS, MachineLearningAlgorithmType.SUPERVISED_BINARY_CLASSIFICATION, - "https://lightgbm.readthedocs.io/" // TODO: link to our documentation + "https://cam.feedzai.com/pulse/latest/docs/common/pulse/understanding-pulse/core-concepts/models/model-training/feedzai-fairgbm" )), ; From d0b10d0e2e0f07c6c84750553bbf40e31318d566 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Mon, 18 May 2026 18:06:40 +0100 Subject: [PATCH 21/27] chore(lint): fix variable name and added missing parameter to method documentation --- .../com/feedzai/openml/provider/lightgbm/SWIGTrainData.java | 2 ++ .../provider/lightgbm/SampleWeightParamParserUtil.java | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java index 7ef21c58..f6eeddb0 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java @@ -145,6 +145,8 @@ public SWIGTrainData(final int numFeatures, final long numInstancesChunk) { * @param numFeatures The number of features. * @param numInstancesChunk The number of instances per chunk of data. * @param fairnessConstrained Whether this data will be used for a model with fairness (group) constraints. + * @param useSampleWeight Whether this training data includes per-instance sample weights to be passed + * to LightGBM. */ public SWIGTrainData(final int numFeatures, final long numInstancesChunk, final boolean fairnessConstrained, diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java index 7b3c2110..393a06c4 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SampleWeightParamParserUtil.java @@ -39,10 +39,10 @@ private SampleWeightParamParserUtil() { * otherwise empty Optional */ public static Optional getSampleWeightFieldName(final Map params) { - final String softLabelFieldName = params.get(SAMPLE_WEIGHT_COL_PARAMETER_NAME); + final String sampleWeightFieldName = params.get(SAMPLE_WEIGHT_COL_PARAMETER_NAME); - return softLabelFieldName == null || softLabelFieldName.isEmpty() ? - Optional.empty() : Optional.of(softLabelFieldName.trim()); + return sampleWeightFieldName == null || sampleWeightFieldName.isEmpty() ? + Optional.empty() : Optional.of(sampleWeightFieldName.trim()); } /** From dde15e0a26f4bfea39252a69fa9111b1ba6990d5 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Mon, 18 May 2026 18:08:15 +0100 Subject: [PATCH 22/27] fix(lightgbm): simplified logic to determine the number of features, and replaced inefficient comparison during copy to SWIG arrays --- ...htGBMBinaryClassificationModelTrainer.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java index bed70143..68794065 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMBinaryClassificationModelTrainer.java @@ -132,21 +132,14 @@ static void fit(final Dataset dataset, final DatasetSchema schema = dataset.getSchema(); + final Optional sampleWeightFieldName = SampleWeightParamParserUtil.getSampleWeightFieldName(params); + int numFeatures = schema.getPredictiveFields().size(); + + // Check if the weight field exists and is explicitly part of the predictive fields final Optional sampleWeightColIndex = SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, schema); - - final int numPredictiveFields = schema.getPredictiveFields().size(); - final int numFeatures; - if (!sampleWeightColIndex.isPresent()) { - numFeatures = numPredictiveFields; - } else { - final boolean isSampleWeightSelectedAsFeature = schema.getPredictiveFields().stream().anyMatch( - field -> field.getFieldName().equals( - SampleWeightParamParserUtil.getSampleWeightFieldName(params).get() - ) - ); - - numFeatures = numPredictiveFields - (isSampleWeightSelectedAsFeature ? 1 : 0); + if (sampleWeightColIndex.isPresent()) { + numFeatures--; } // Parse train parameters to LightGBM format @@ -562,6 +555,7 @@ private static void copyTrainDataToSWIGArrays(final Dataset dataset, ValidationUtils' validateCategoricalSchema: */ final int targetIndex = datasetSchema.getTargetIndex().get(); + final int sampleWeightIdx = sampleWeightColIndex.orElse(-1); final Iterator iterator = dataset.getInstances(); while (iterator.hasNext()) { @@ -587,7 +581,7 @@ private static void copyTrainDataToSWIGArrays(final Dataset dataset, for (int colIdx = 0; colIdx < numFields; ++colIdx) { // Don't add features for target and sample weight columns (in the case of sample weight, // only if this is defined) - if ((colIdx != targetIndex) && (!sampleWeightColIndex.equals(Optional.of(colIdx))) ) { + if ((colIdx != targetIndex) && (colIdx != sampleWeightIdx)) { swigTrainData.addFeatureValue(instance.getValue(colIdx)); } } From f6d1c1a2021c283f299aa31c70adc6898b876490 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Tue, 19 May 2026 09:55:42 +0100 Subject: [PATCH 23/27] chore(lightgbm): added method to retrieve the relevant schema for loading the model --- .../lightgbm/LightGBMModelCreator.java | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java index c7d6c20d..85dbdc72 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java @@ -138,17 +138,7 @@ public LightGBMBinaryClassificationModel fit(final Dataset dataset, dataset, params, tmpModelFilePath); // Build a schema without the weight column for model loading validation - final DatasetSchema schemaForLoading; - final Optional weightColIdx = - SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, dataset.getSchema()); - if (weightColIdx.isPresent()) { - final List fieldsWithoutWeight = dataset.getSchema().getPredictiveFields().stream() - .filter(field -> field.getFieldIndex() != weightColIdx.get()) - .collect(Collectors.toList()); - schemaForLoading = new DatasetSchema(fieldsWithoutWeight); - } else { - schemaForLoading = dataset.getSchema(); - } + final DatasetSchema schemaForLoading = getSchemaForLoading(params, dataset); return loadModel(tmpModelFilePath, schemaForLoading); } catch (final Exception e) { logger.error("Could not train the model."); @@ -162,7 +152,32 @@ public LightGBMBinaryClassificationModel fit(final Dataset dataset, } } - + /** + * Retrieves the appropriate schema to be used to load a LightGBM model. + * If the model was trained with sample weight, then its schema will consist in the train + * data schema without the sample weight column; otherwise, the original raw schema of + * the train data will be considered. + * + * @param params LightGBM model parameters. + * @param dataset Train dataset. + * @return A {@link DatasetSchema} instance excluding the sample weight field if present; + * otherwise, the original schema layout mapped to the dataset + */ + private DatasetSchema getSchemaForLoading(Map params, Dataset dataset) { + final DatasetSchema schemaForLoading; + + final Optional weightColIdx = + SampleWeightParamParserUtil.getSampleWeightColumnIndex(params, dataset.getSchema()); + if (weightColIdx.isPresent()) { + final List fieldsWithoutWeight = dataset.getSchema().getPredictiveFields().stream() + .filter(field -> field.getFieldIndex() != weightColIdx.get()) + .collect(Collectors.toList()); + schemaForLoading = new DatasetSchema(fieldsWithoutWeight); + } else { + schemaForLoading = dataset.getSchema(); + } + return schemaForLoading; + } @Override public List validateForFit(final Path pathToPersist, From 9013fd1b308347c02fed0634f4c8e117cb89e707 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Tue, 19 May 2026 09:57:42 +0100 Subject: [PATCH 24/27] chore(lightgbm): updated javadoc and parameter names in LightGBMModelCreator.schemaMatchAllFeatures --- .../lightgbm/LightGBMModelCreator.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java index 85dbdc72..8a0cb741 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java @@ -437,19 +437,23 @@ private static String[] getFeatureNamesFrom(final List fields) { /** * Performs a one-by-one feature name comparison between a - * given list of {@link FieldSchema} and an array of feature + * given list of {@link FieldSchema} (containing only the + * relevant schema fields for comparison), and an array of feature * names. This way the first mismatch is logged, improving debug. + * The provided list of relevant fields contains the fields from + * the model schema without the sample weight field, if it is + * considered for model training. * - * @param schemaRelevantFeatureNames Schema - * @param featureNames Feature names to validate. - * @return {@code true} if the schema predictive field names - * match the provided array, {@code false} otherwise. + * @param schemaRelevantFields List containing the relevant model feature fields. + * @param featureNames Feature names to validate. + * @return {@code true} if the schema predictive field names + * match the provided array, {@code false} otherwise. * @since 1.0.18 */ - private boolean schemaMatchAllFeatures(List schemaRelevantFeatureNames, + private boolean schemaMatchAllFeatures(final List schemaRelevantFields, final String[] featureNames) { - final String[] schemaFeatureNames = getFeatureNamesFrom(schemaRelevantFeatureNames); + final String[] schemaFeatureNames = getFeatureNamesFrom(schemaRelevantFields); boolean isMatch = true; From 5b7b9be235fc5a84f398f94625ddf2b777f5589c Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Tue, 19 May 2026 09:58:26 +0100 Subject: [PATCH 25/27] chore(lightgbm): unified logic to sanitize field names (replace space with underscore) in single method --- .../provider/lightgbm/LightGBMModelCreator.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java index 8a0cb741..8d4445e3 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java @@ -289,6 +289,17 @@ private boolean baggingDisabled(final Map params) { return ((Math.abs(freq - 0) < epsilon) || (Math.abs(1 - fraction) < epsilon)); } + /** + * Sanitizes a field name to match LightGBM's internal feature name format, + * replacing spaces with underscores. + * + * @param fieldName The original field name. + * @return The sanitized field name. + */ + static String sanitizeFieldName(final String fieldName) { + return fieldName.replace(" ", "_"); + } + @Override public LightGBMBinaryClassificationModel loadModel(final Path modelPath, final DatasetSchema schema) throws ModelLoadingException { @@ -312,7 +323,7 @@ public LightGBMBinaryClassificationModel loadModel(final Path modelPath, final String[] boosterFeatureNames = model.getBoosterFeatureNames(); final Set modelFeatureSet = new HashSet<>(Arrays.asList(boosterFeatureNames)); final List relevantFields = schema.getPredictiveFields().stream() - .filter(field -> modelFeatureSet.contains(field.getFieldName().replace(" ", "_"))) + .filter(field -> modelFeatureSet.contains(sanitizeFieldName(field.getFieldName()))) .collect(Collectors.toList()); if (relevantFields.size() != boosterFeatureNames.length) { @@ -431,7 +442,7 @@ private static String[] getFeatureNamesFrom(final List fields) { return fields.stream() .map(FieldSchema::getFieldName) - .map(fieldName -> fieldName.replace(" ", "_")) + .map(LightGBMModelCreator::sanitizeFieldName) .toArray(String[]::new); } From 0ba4b772de5b5416fa2fa8e46b88a3369870972a Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Tue, 19 May 2026 09:59:39 +0100 Subject: [PATCH 26/27] fix(lightgbm): fixed validations for model's predictive fields - ensuring only the sample weight field can differ between model and dataset schema --- .../openml/provider/lightgbm/LightGBMModelCreator.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java index 8d4445e3..174c69b3 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/LightGBMModelCreator.java @@ -319,14 +319,18 @@ public LightGBMBinaryClassificationModel loadModel(final Path modelPath, // Check predictive fields size // - In LightGBM, if the sample weights are provided then the trained model will not // have this field, but the DatasetSchema will -- Need to exclude this field - // In short, ensure all fields in model.getBoosterNumFeatures() exist in the DatasetSchema + // + // Can only allow for the sample weight field to be extra in the DatasetSchema, + // when compared with the model fields; any other additional field will need to + // trigger an error final String[] boosterFeatureNames = model.getBoosterFeatureNames(); final Set modelFeatureSet = new HashSet<>(Arrays.asList(boosterFeatureNames)); final List relevantFields = schema.getPredictiveFields().stream() .filter(field -> modelFeatureSet.contains(sanitizeFieldName(field.getFieldName()))) .collect(Collectors.toList()); - if (relevantFields.size() != boosterFeatureNames.length) { + if ((schema.getPredictiveFields().size() - relevantFields.size() > 1) + || (relevantFields.size() != boosterFeatureNames.length)) { throw new ModelLoadingException(ERROR_MSG_SCHEMA_WITH_WRONG_PREDICTIVE_FIELDS_SIZE); } From c515b9828fb310a87fc386341c6e3d084e455581 Mon Sep 17 00:00:00 2001 From: Joaquim Leitao Date: Tue, 19 May 2026 10:00:08 +0100 Subject: [PATCH 27/27] chore(lightgbm): fix constructor argument --- .../com/feedzai/openml/provider/lightgbm/SWIGTrainData.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java index f6eeddb0..0f1efafc 100644 --- a/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java +++ b/openml-lightgbm/lightgbm-provider/src/main/java/com/feedzai/openml/provider/lightgbm/SWIGTrainData.java @@ -148,7 +148,8 @@ public SWIGTrainData(final int numFeatures, final long numInstancesChunk) { * @param useSampleWeight Whether this training data includes per-instance sample weights to be passed * to LightGBM. */ - public SWIGTrainData(final int numFeatures, final long numInstancesChunk, + public SWIGTrainData(final int numFeatures, + final long numInstancesChunk, final boolean fairnessConstrained, final boolean useSampleWeight) { this.numFeatures = numFeatures; @@ -189,7 +190,7 @@ public void addLabelValue(float value) { this.swigLabelsChunkedArray.add(value); } - public void addSampleWeightValue(float value) { + public void addSampleWeightValue(final float value) { assert this.useSampleWeight : "Attempting to set sample weight data with useSampleWeight=false"; this.swigSampleWeightsChunkedArray.add(value); }