All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.tablesaw.conversion.TableConverter Maven / Gradle / Ivy

package tech.tablesaw.conversion;

import java.util.List;
import java.util.stream.Collectors;

import com.google.common.base.Preconditions;

import smile.data.Attribute;
import smile.data.AttributeDataset;
import smile.data.NumericAttribute;
import tech.tablesaw.columns.Column;
import tech.tablesaw.table.Relation;

public class TableConverter {

    private final Relation table;

    public TableConverter(Relation table) {
        this.table = table;
    }

    public double[][] doubleMatrix() {
        return doubleMatrix(table.columns());
    }

    public double[][] doubleMatrix(int... columnIndicies) {
        return doubleMatrix(table.columns(columnIndicies));
    }

    public double[][] doubleMatrix(String... columnNames) {
        return doubleMatrix(table.columns(columnNames));
    }

    public float[][] floatMatrix() {
        return floatMatrix(table.columns());
    }

    public float[][] floatMatrix(int... columnIndicies) {
        return floatMatrix(table.columns(columnIndicies));
    }

    public float[][] floatMatrix(String... columnNames) {
        return floatMatrix(table.columns(columnNames));
    }

    public int[][] intMatrix() {
        return intMatrix(table.columns());
    }

    public int[][] intMatrix(int... columnIndicies) {
        return intMatrix(table.columns(columnIndicies));
    }

    public int[][] intMatrix(String... columnNames) {
        return intMatrix(table.columns(columnNames));
    }

    private static double[][] doubleMatrix(List columns) {
        Preconditions.checkArgument(columns.size() >= 1);
        int obs = columns.get(0).size();
        double[][] allVals = new double[obs][columns.size()];

        for (int r = 0; r < obs; r++) {
            for (int c = 0; c < columns.size(); c++) {
                allVals[r][c] = columns.get(c).getDouble(r);
            }
        }
        return allVals;
    }

    private static float[][] floatMatrix(List columns) {
        Preconditions.checkArgument(columns.size() >= 1);
        int obs = columns.get(0).size();
        float[][] allVals = new float[obs][columns.size()];

        for (int r = 0; r < obs; r++) {
            for (int c = 0; c < columns.size(); c++) {
                allVals[r][c] = (float) columns.get(c).getDouble(r);
            }
        }
        return allVals;
    }

    private static int[][] intMatrix(List columns) {
        Preconditions.checkArgument(columns.size() >= 1);
        int obs = columns.get(0).size();
        int[][] allVals = new int[obs][columns.size()];

        for (int r = 0; r < obs; r++) {
            for (int c = 0; c < columns.size(); c++) {
                allVals[r][c] = (int) columns.get(c).getDouble(r);
            }
        }
        return allVals;
    }

    public AttributeDataset smileDataset(String responseColName) {
        return smileDataset(
            table.column(responseColName),
            table.columns().stream().filter(c -> !c.name().equals(responseColName)).collect(Collectors.toList()));
    }  

    public AttributeDataset smileDataset(int responseColIndex, int... variablesColIndices) {
        return smileDataset(table.column(responseColIndex), table.columns(variablesColIndices));
    }  

    public AttributeDataset smileDataset(String responseColName, String... variablesColNames) {
        return smileDataset(table.column(responseColName), table.columns(variablesColNames));
    }

    private AttributeDataset smileDataset(Column responseCol, List variableCols) {
        AttributeDataset data = new AttributeDataset(table.name(),
            variableCols.stream().map(c -> colToAttribute(c)).toArray(Attribute[]::new),
            colToAttribute(responseCol));
        for (int i = 0; i < responseCol.size(); i++) {
            final int r = i;
            double[] x = variableCols.stream().mapToDouble(c -> c.getDouble(r)).toArray();
            data.add(x, responseCol.getDouble(r));
        }
        return data;
    }

    /**
     * We convert all columns to NumericAttribute. Smile's AttributeDataset only stores data as double.
     * While Smile defines NominalAttribute and DateAttribute they appear to be little used.
     */
    private Attribute colToAttribute(Column col) {
        return new NumericAttribute(col.name());
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy